🐍➰ Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈΠ³Ρ€Ρƒ «ВисСлица» Π½Π° Python. Π§Π°ΡΡ‚ΡŒ 2. ГрафичСский интСрфСйс Π½Π° PySimpleGUI

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΉ части Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈΠ³Ρ€Ρ‹ «ВисСлица» ΠΈ создадим графичСский интСрфСйс с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PySimpleGUI.

Данная ΡΡ‚Π°Ρ‚ΡŒΡ являСтся ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ. Бсылка Π½Π° ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π».

Π’ этом руководствС Π²Ρ‹ Π·Π°ΠΉΠΌΠ΅Ρ‚Π΅ΡΡŒ созданиСм ΠΈΠ³Ρ€Ρ‹ «ВисСлица» Π½Π° Python Π² нСсколько этапов. Π˜Π³Ρ€Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ изящный графичСский интСрфСйс, Π±Π°Π·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉΡΡ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ PySimpleGUI.

Π’ этом ΡƒΡ€ΠΎΠΊΠ΅ Π²Ρ‹:

  • Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΡ‚Π΅ графичСский интСрфСйс для ΠΈΠ³Ρ€Ρ‹ Π² висСлицу с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PySimpleGUI
  • Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚Π΅ Π»ΠΎΠ³ΠΈΠΊΡƒ для ΠΈΠ³Ρ€Ρ‹ Π² висСлицу
  • БвяТитС Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈΠ³Ρ€Ρ‹ с Π΅Π΅ графичСским интСрфСйсом
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈΠ³Ρ€Ρ‹ ΠΈ настроитС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π²Π»Π΅Ρ‡ΡŒ максимум ΠΏΠΎΠ»ΡŒΠ·Ρ‹ ΠΈΠ· этого ΡƒΡ€ΠΎΠΊΠ°, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π½Π°ΠΊΠΎΠΌΡ‹ с ΠΎΠ±Ρ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π° Python, Π² Ρ‚ΠΎΠΌ числС с процСссом Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΆΠ΅ Ρƒ вас Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с графичСскими ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΌΠΈ интСрфСйсами, Π² особСнности с Ρ‚Π΅ΠΌΠΈ, Ρ‡Ρ‚ΠΎ Π±Π°Π·ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° PySimpleGUI. Π’Π°ΠΌ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ знания ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ ΠΈΠ³Ρ€, Π½ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ плюсом.

Π’Π΅ΡΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² этом руководствС, доступСн для скачивания. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΅Π³ΠΎ, пСрСйдя ΠΏΠΎ ссылкС Π½ΠΈΠΆΠ΅:

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ свой ΠΊΠΎΠ΄: НаТмитС здСсь, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ бСсплатный исходный ΠΊΠΎΠ΄ Python для вашСй ΠΈΠ³Ρ€Ρ‹ Π² висСлицу PySimpleGUI.

ОписаниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

ΠŸΡ€ΠΈ создании GUI-вСрсии висСлицы Π²Π°ΠΌ понадобится GUI-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ, способный Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с тСкстовыми ΠΈΠ³Ρ€Π°ΠΌΠΈ, ΠΈ ΠΏΡ€ΠΈ этом ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. Python ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ нСсколько Ρ…ΠΎΡ€ΠΎΡˆΠΈΡ… GUI-Π΄Π²ΠΈΠΆΠΊΠΎΠ². Π₯отя Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ любой ΠΈΠ· Π½ΠΈΡ… для достиТСния ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ эффСкта, Π² этом ΡƒΡ€ΠΎΠΊΠ΅ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° PySimpleGUI.

PySimpleGUI – это программная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° для Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… популярных GUI-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Tkinter, wxPython ΠΈ PyQt. Π’ этом руководствС Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ Tkinter, Π½ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ ΠΈ с wxPython ΠΈ QT Π½Π° PyPI.

  • ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ ΠΈΠ³Ρ€Π΅: Π˜Π³Ρ€Π° «ВисСлица» рассчитана Π½Π° Π΄Π²ΡƒΡ… ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π²Π΅Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΡ‚Π³Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… участников.
  • Π’Ρ‹Π±ΠΎΡ€ слова: Π’Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΈΠ³Ρ€Ρ‹ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ слово, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΡƒΠ³Π°Π΄Π°Ρ‚ΡŒ ΠΎΡ‚Π³Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠΈ.
  1. Π’Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ΅ слово Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ изобраТаСтся Π² Π²ΠΈΠ΄Π΅ сСрии ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠΉ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ Π² словС.
  2. Π’Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ Ρ‚Π°ΠΊΠΆΠ΅ рисуСт подмостки, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ висСлицы.
  • ΠžΡ‚Π³Π°Π΄Ρ‹Π²Π°Π½ΠΈΠ΅: Π˜Π³Ρ€ΠΎΠΊΠΈ ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΎΡ‚Π³Π°Π΄Π°Ρ‚ΡŒ слово, выбирая Π±ΡƒΠΊΠ²Ρ‹ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ.
  • ΠžΠ±Ρ€Π°Ρ‚Π½Π°Ρ связь: Π’Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, встрСчаСтся Π»ΠΈ Π² словС Ρ‚Π° ΠΈΠ»ΠΈ иная названная Π±ΡƒΠΊΠ²Π°.
  1. Если Π±ΡƒΠΊΠ²Π° встрСчаСтся, Ρ‚ΠΎ Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ замСняСт ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ Π½Π° Π±ΡƒΠΊΠ²Ρƒ, которая встрСчаСтся Π² словС.
  2. Если Π±ΡƒΠΊΠ²Π° Π½Π΅ Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‚ΠΎ Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ заносит Π΅Π΅ Π² список ΠΎΡ‚Π³Π°Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠΊΠ². Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ½ рисуСт ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ повСшСнного. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ повСшСнного, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ с Π³ΠΎΠ»ΠΎΠ²Ρ‹, Π·Π°Ρ‚Π΅ΠΌ Ρ‚ΡƒΠ»ΠΎΠ²ΠΈΡ‰Π΅, Ρ€ΡƒΠΊΠΈ ΠΈ Π½ΠΎΠ³ΠΈ – всСго ΡˆΠ΅ΡΡ‚ΡŒ частСй.
  • Условия ΠΏΠΎΠ±Π΅Π΄Ρ‹: Π’Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚, Ссли рисунок повСшСнного Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ послС ΡˆΠ΅ΡΡ‚ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π² этом случаС ΠΈΠ³Ρ€Π° заканчиваСтся. ΠžΡ‚Π³Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠΈ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°ΡŽΡ‚, Ссли ΡƒΠ³Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ слово.
  1. Если Π΄ΠΎΠ³Π°Π΄ΠΊΠ° Π²Π΅Ρ€Π½Π° – ΠΈΠ³Ρ€Π° заканчиваСтся, ΠΈ ΠΎΡ‚Π³Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ ΠΈΠ³Ρ€ΠΎΠΊΠΈ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°ΡŽΡ‚.
  2. Если ΠΆΠ΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅Π²Π΅Ρ€Π½ΠΎ, Ρ‚ΠΎ ΠΈΠ³Ρ€Π° продолТаСтся.

НиТС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° ΠΈΠ³Ρ€Π° Π² процСссС. Π’ этой ΠΈΠ³Ρ€Π΅ слово, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚Π³Π°Π΄Π°Ρ‚ΡŒ – это висСлица:

Π˜Π³Ρ€Π° «ВисСлица»

Π’ этом руководствС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ «ВисСлица» Π½Π° Python, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΠ½ΡΡ‚ΡŒ нСсколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ:

  • Π˜Π³Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ ΠΈ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ-Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ.
  • ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Π² Ρ€ΠΎΠ»ΠΈ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ слово для отгадывания, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ всС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹.
  • Π˜Π³Ρ€ΠΎΠΊ-Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ – это ΡƒΠ³Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ, Π΄Π°Π»Π΅Π΅ ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΡ‹ΠΉ просто ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ. Когда ΠΈΠ³Ρ€ΠΎΠΊ Π·Π½Π°Π΅Ρ‚ слово, ΠΎΠ½ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΡƒΠ³Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° слово Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ составлСно ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ.

ИмСя Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ прСдставлСниС ΠΎΠ± ΠΈΠ³Ρ€Π΅ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ дизайнСрскиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ для ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ вСрсии, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ созданию ΠΈΠ³Ρ€Ρ‹. Однако, для Π½Π°Ρ‡Π°Π»Π°, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ трСбованиями ΠΊ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΡŽ.

🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»ΠΎΠ² Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° питониста»
πŸπŸŽ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ Python
ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Python Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° собСса ΠΏΠΎ PythonΒ»
🧩🐍 Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ Python
Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ ΠΏΠΎ Python для ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ PythonΒ»

ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ условия

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… этого руководства, ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ вас знакомства с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π° Python. Π£ вас Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ знания ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Ρ‚Π΅ΠΌΠ°ΠΌ:

  • Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ с графичСским интСрфСйсом Π½Π° Π±Π°Π·Π΅ PySimpleGUI
  • Π Π°Π±ΠΎΡ‚Π° с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ with
  • ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ собствСнных классов ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ
  • ИспользованиС Ρ†ΠΈΠΊΠ»ΠΎΠ² for, while ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²
  • Π Π°Π±ΠΎΡ‚Π° с условными ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ
  • Π Π°Π±ΠΎΡ‚Π° со строками, списками ΠΈ мноТСствами Python.

Π‘Ρ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Π¨Π°Π³ 1: Настройка ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° «ВисСлица»

Π’Π°ΡˆΠ° ΠΈΠ³Ρ€Π° «ВисСлица» Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ интСрфСйса PySimpleGUI, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ смоТСт ΡƒΡ‡Π°ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² процСссС ΠΈΠ³Ρ€Ρ‹. Участник Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ слово для отгадывания, Π° ΠΈΠ³Ρ€Π° – ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ всС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ графичСского интСрфСйса.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ рСсурсы для этого шага, использовав ссылку (Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ) ΠΈ пСрСйдя Π² ΠΏΠ°ΠΏΠΊΡƒ source_code_step_1/.

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ ΠΈΠ³Ρ€ΠΎΠΉ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» hangman.py. Π’ этом Ρ„Π°ΠΉΠ»Π΅ Π²Ρ‹ создадитС класс Hangman, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄ для создания графичСского интСрфСйса ΠΈ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈΠ³Ρ€Ρ‹. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ» ΠΈΠ³Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ Π΅Π΅ дСйствиями.

Π˜Ρ‚Π°ΠΊ, создайтС Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ hangman/, Π° Π·Π°Ρ‚Π΅ΠΌ – Ρ„Π°ΠΉΠ» hangman.py с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ вашСго любимого Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ IDE.

Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ понадобится тСкстовый Ρ„Π°ΠΉΠ» words.txt, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ список Π·Π°Π³Π°Π΄Π°Π½Π½Ρ‹Ρ… слов. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π° words.txt Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Β«Π’Ρ‹Π±ΠΎΡ€ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ³ΠΎ слова». Π‘ΠΎ Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ Ρƒ вас получится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ структура ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° висСлицы:

hangman/
β”œβ”€β”€ hangman.py
└── words.txt

Благодаря этим Ρ„Π°ΠΉΠ»Π°ΠΌ, Ρƒ вас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ минимальная схСма ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, нСобходимая для создания ΠΈΠ³Ρ€Ρ‹ Π² висСлицу. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ срСду Python Π² hangman/ ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ PySimpleGUI. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ ΠΎΠΊΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π² ΠΏΠ°ΠΏΠΊΠ΅ hangman/. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

Windows:

PS> python -m venv venv
PS> venv\Scripts\activate
(venv) PS> $ python -m pip install pysimplegui

Linux + macOS:

$ python -m venv venv
$ source venv/bin/activate
(venv) $ python -m pip install pysimplegui

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π΄Π²ΡƒΡ… ΠΊΠΎΠΌΠ°Π½Π΄ Π²Ρ‹ создаСтС ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ срСду Python ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ venv Π² своСм Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ срСда Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½Π°, Π²Ρ‹ устанавливаСтС PySimpleGUI с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pip.

Π¨Π°Π³ 2: Набросок графичСского интСрфСйса ΠΈΠ³Ρ€Ρ‹ «ВисСлица»

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса для ΠΈΠ³Ρ€Ρ‹ Π² висСлицу Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ…:

  • Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ управлСния ΠΈΠ³Ρ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятны ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ.
  • Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Ρ‹ управлСния ΠΈΠ³Ρ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΡ‚Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС ΠΈΠ³Ρ€Ρ‹.
  • Для Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π² ΠΈΠ³Ρ€Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ GUI.

Π§Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½ΠΎ понятны элСмСнты управлСния, Ρ‚Π΅ΠΌ приятнСС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ сразу ΠΆΠ΅ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ ΠΈΠ³Ρ€Π΅. Π—Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ элСмСнты управлСния Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° измСнСния состояния ΠΈΠ³Ρ€Ρ‹ – Π·Π½Π°Ρ‡ΠΈΡ‚ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²Π²ΠΎΠ΄Π° ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠ° наглядной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ графичСский интСрфСйс, ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ графичСскиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π²Π΅Π·Π΄Π΅, Π³Π΄Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Учитывая пСрСчислСнныС Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, Π½Π΅ΠΏΠ»ΠΎΡ…ΠΈΠΌ Π½Π°Ρ‡Π°Π»ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ созданиС ΠΌΠ°ΠΊΠ΅Ρ‚Π° графичСского интСрфСйса прилоТСния. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ, Π΄Π°ΠΆΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ°Ρ€Π°Π½Π΄Π°ΡˆΠ° Π½Π° Π±ΡƒΠΌΠ°Π³Π΅, ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡƒΡ‚Π²Π΅Ρ€Π΄ΠΈΡ‚ΡŒ Π΄ΠΈΠ·Π°ΠΉΠ½ ΠΈ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ Π½Π°Ρ‡Π½Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

ГрафичСский интСрфСйс вашСй ΠΈΠ³Ρ€Ρ‹ Π² висСлицу Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ нСсколько Π·Π°Π΄Π°Ρ‡:

  1. Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°.
  2. Π”Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ слово.
  3. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π½Π΅Π΅ ΠΎΡ‚Π³Π°Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹.
  4. ΠŸΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΡ‚Π³Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹.
  5. Π Π°Π·Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΡƒ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· ΠΈΠ³Ρ€Ρ‹.

Π’ΠΎΡ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ графичСский интСрфСйс вашСй ΠΈΠ³Ρ€Ρ‹:

ГрафичСский интСрфСйс вашСй ΠΈΠ³Ρ€Ρ‹ «ВисСлица»

Π’Ρ‹ размСститС рисунок повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° Π² Ρ€Π°ΠΌΠΊΠ΅ слСва ΠΎΡ‚ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ располоТитС Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΡŒ ΡˆΠ΅ΡΡ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π² ΠΏΡ€Π°Π²ΠΎΠΉ части ΠΎΠΊΠ½Π°. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этих ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈΠ³Ρ€ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π³Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Π±ΡƒΠΊΠ²Ρ‹. Π’ Π½ΠΈΠΆΠ½Π΅ΠΉ части Π½Π°Π΄ трСмя ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ слово, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ угадываСтся, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ для Π½Π°Ρ‡Π°Π»Π° Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹, пСрСзапуска Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ ΠΈΠ³Ρ€Ρ‹ ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· ΠΈΠ³Ρ€Ρ‹ соотвСтствСнно.

Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠ³Ρ€Ρ‹ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свойства ΠΊΠ½ΠΎΠΏΠΎΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π±ΡƒΠΊΠ²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊ. НапримСр ΠΎΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠ² ΠΊΠ½ΠΎΠΏΠΊΡƒ ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Π±ΡƒΠΊΠ²Ρ‹, Π²Ρ‹ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Π΅ ΠΈΠ³Ρ€ΠΎΠΊΡƒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΎΠ΄Π½Ρƒ ΠΈ Ρ‚Ρƒ ΠΆΠ΅ Π±ΡƒΠΊΠ²Ρƒ нСсколько Ρ€Π°Π·. ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ послуТат Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ подсказкой, ΠΊΠ°ΠΊΠΈΠ΅ Π±ΡƒΠΊΠ²Ρ‹ доступны для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… ΡƒΠ³Π°Π΄Ρ‹Π²Π°Π½ΠΈΠΉ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ набросали графичСский интСрфСйс висСлицы, ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ созданию Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ графичСского интСрфСйса с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ PySimpleGUI.

🐍 ΠŸΠΎΠ΄ΠΏΠΈΡΡ‹Π²Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π° Π΅ΠΆΠ΅Π½Π΅Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ email-рассылку, ΠΏΠΎΡΠ²ΡΡ‰Π΅Π½Π½ΡƒΡŽ послСдним открытиям ΠΈ тСндСнциям Π² ΠΌΠΈΡ€Π΅ Python.

Π’ Π½Π΅ΠΉ:

  • НовыС возмоТности Π² послСдних вСрсиях Python
  • Π Π°Π±ΠΎΡ‚Π° с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ SQL Π² Python
  • Π’Π΅Π±-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Django ΠΈ Flask
  • МашинноС ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ Π°Π½Π°Π»ΠΈΠ· Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python
  • Автоматизация ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с API Π½Π° Python
  • ВСстированиС ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΊΠΎΠ΄Π° Π½Π° Python
  • Π—Π°Π΄Π°Ρ‡ΠΈ для Π½ΠΎΠ²ΠΈΡ‡ΠΊΠΎΠ² с Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ

Π¨Π°Π³ 3: Код GUI-прилоТСния для висСлицы

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° PySimpleGUI, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ³Ρ€Ρ‹ Π² висСлицу, Π²Π°ΠΌ понадобится ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ каркас прилоТСния. Π—Π°Ρ‚Π΅ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π½ΡΡ‚ΡŒΡΡ созданиСм графичСского интСрфСйса висСлицы, слСдуя схСмС ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ шага. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π²Ρ‹ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΊΠΎΠ΄ для изобраТСния повСшСнного.

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ всСх этапов этого шага Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ графичСский интСрфСйс висСлицы. Однако этот графичСский интСрфСйс Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ достаточной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, ΠΈ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ, ΠΎΠ½ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Π² ΠΈΠ³Ρ€Ρƒ.

ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ для этого шага, использовав Ρ€Π°Π½Π΅Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π» (ΠΏΠ°ΠΏΠΊΠ° source_code_step_3/).

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ PySimpleGUI, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, состоит ΠΈΠ· Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ ΠΎΠΊΠ½Π° с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ ΠΌΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ ΠΈΠ»ΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½ΠΎΠΌ GUI ΠΈ Ρ†ΠΈΠΊΠ»Π° событий. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ «ВисСлица», ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» hangman.py Π² Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ ΠΊΠΎΠ΄Π° ΠΈ Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ Π² Π½Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСкст:

import PySimpleGUI as sg

class Hangman:
    def __init__(self) -> None:
        self._window = sg.Window(
            title="Hangman",
            layout=[[]],
            finalize=True,
            margins=(100, 100),
        )

    def read_event(self):
        event = self._window.read()
        event_id = event[0] if event is not None else None
        return event_id

    def close(self):
        self._window.close()

Π’ этом ΠΊΠΎΠ΄Π΅ Π²Ρ‹ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ PySimpleGUI ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ sg. Π’Π°ΠΊΠΎΠΉ способ использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ распространСн Π² Π΅Π΅ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π² основном ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ sg позволяСт ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ Π½Π° Π²Π²ΠΎΠ΄Π΅ тСкста. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊΠΎΠΉ псСвдоним ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Ссли Π²Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ бэкСнд, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, wxPython ΠΈΠ»ΠΈ QT.

Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ опрСдСляСтС класс Hangman. Π’ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π΅ класса, .__init__(), Π²Ρ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΎΠΊΠ½ΠΎ прилоТСния. Для этого Π²Ρ‹ Π²Π²ΠΎΠ΄ΠΈΡ‚Π΅ класс Window. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ Π½Π°Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΎΠΊΠ½ΠΎ Β«HangmanΒ». Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ список Π² качСствС Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΎΠΊΠ½Π°. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ это пустой список, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ пустоС ΠΎΠΊΠ½ΠΎ.

АргумСнт finalize позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, слСдуСт Π»ΠΈ Π·Π°Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ°ΠΊΠ΅Ρ‚ ΠΎΠΊΠ½Π°. Ѐиксация ΠΌΠ°ΠΊΠ΅Ρ‚Π° ΠΎΠΊΠ½Π° ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ послС создания ΠΎΠΊΠ½Π° Π²Ρ‹ Π½Π΅ смоТСтС ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ΠΈΠ΅. Π’ вашСй ΠΈΠ³Ρ€Π΅ «ВисСлица» ΠΎΠΊΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ свой внСшний Π²ΠΈΠ΄ Π²ΠΎ врСмя прохоТдСния ΠΈΠ³Ρ€Ρ‹, поэтому Π²Ρ‹ устанавливаСтС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ finalize Ρ€Π°Π²Π½Ρ‹ΠΌ True.

АргумСнт margins позволяСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ количСство пиксСлСй, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ слСдуСт ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ€Π°ΠΌΠΊΠΈ ΠΎΠΊΠ½Π° ΠΏΠΎ краям ΠΏΠ΅Ρ€Π΅Π΄ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² графичСского интСрфСйса. Π’ этом ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Ρƒ вас Π΅Ρ‰Π΅ Π½Π΅Ρ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ графичСского элСмСнта, поэтому Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ margins для отобраТСния ΠΎΠΊΠ½Π° Π² наглядном Ρ€Π΅ΠΆΠΈΠΌΠ΅. Однако этот Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ носит Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€, поэтому Π²Ρ‹ ΡƒΠ΄Π°Π»ΠΈΡ‚Π΅ Π΅Π³ΠΎ, ΠΊΠΎΠ³Π΄Π° приступитС ΠΊ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΌΠ°ΠΊΠ΅Ρ‚Π° ΠΎΠΊΠ½Π° Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ .read_event(). Он основан Π½Π° Π±Π°Π·Π΅ Window.read() ΠΈ позволяСт ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ дСйствия Π² графичСском интСрфСйсС прилоТСния. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ прилоТСния с графичСским интСрфСйсом Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π½Π° Π±Π°Π·Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… дСйствий, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΎΠ½ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ ΠΈ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΡŽΡ‚ Π½Π° Ρ‚Π°ΠΊΠΈΠ΅ измСнСния, ΠΊΠ°ΠΊ ΠΊΠ»ΠΈΠΊΠΈ ΠΌΡ‹ΡˆΡŒΡŽ, наТатия клавиш ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅.

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ .close(). Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Ρƒ вас Π΅ΡΡ‚ΡŒ Π³Π»Π°Π²Π½ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ прилоТСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ» Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния. Π­Ρ‚ΠΎΡ‚ Ρ†ΠΈΠΊΠ» позволяСт Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ΠΎΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² составлСния минимального Ρ†ΠΈΠΊΠ»Π° для ΠΈΠ³Ρ€Ρ‹ Π² висСлицу:

# ...

if __name__ == "__main__":
    game = Hangman()
    # Event loop
    while True:
        event_id = game.read_event()
        if event_id in {sg.WIN_CLOSED}:
            break
    game.close()

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ваш Ρ„Π°ΠΉΠ» hangman.py Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя исполняСмый ΠΊΠΎΠ΄, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ name-main, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ». ΠŸΠ΅Ρ€Π΅Π΄ Π½Π°Ρ‡Π°Π»ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π° Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ элСмСнт класса Hangman ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ game.

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ» дСйствий, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ бСсконСчный Ρ†ΠΈΠΊΠ» while. ΠŸΠ΅Ρ€Π²Π°Ρ строка ΠΊΠΎΠ΄Π° Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ .read_event() Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ game, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ любоС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ΅ дСйствиС Π² Π½Π°Ρ‡Π°Π»Π΅ Ρ†ΠΈΠΊΠ»Π°.

ΠœΠ΅Ρ‚ΠΎΠ΄ .read_event() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ дСйствия ΠΈΠ»ΠΈ None. Π’Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ этот ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π² Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ части Ρ†ΠΈΠΊΠ»Π°, Π³Π΄Π΅ условный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ провСряСт, Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π½Π°Π±ΠΎΡ€ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… дСйствий, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ позволят Π²Π°ΠΌ Π²Ρ‹ΠΉΡ‚ΠΈ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния. На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ этот список содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ sg.WIN_CLOSED. Однако Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя ΠΈ сигнал ΠΎΡ‚ ΠΊΠ½ΠΎΠΏΠΊΠΈ Quit.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ Ρ†ΠΈΠΊΠ» дСйствий, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. На экранС появится ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ:

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ! Π£ вашСго ΠΎΠΊΠ½Π° появилась ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ надпись, ΠΈ ΠΎΠ½Π° позволяСт Π²Π°ΠΌ Π½Π°ΠΆΠ°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«Π—Π°ΠΊΡ€Ρ‹Ρ‚ΡŒΒ» Π² ΠΏΠ°Π½Π΅Π»ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ прилоТСния. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя для создания графичСского интСрфСйса висСлицы.

Π¨Π°Π³ 4: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ графичСского интСрфСйса висСлицы

PySimpleGUI позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ графичСскиС интСрфСйсы Π² Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ ΠΊΠ°ΠΊ Π΄Π°Π½Π½Ρ‹Π΅, Π° Π½Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄. Π’ этом смыслС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ инструмСнты для создания графичСских интСрфСйсов, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Qt Designer, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ осущСствляСт Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ графичСских интСрфСйсов Π² Π²ΠΈΠ΄Π΅ Π΄Π°Π½Π½Ρ‹Ρ… с использованиСм XML. Π­Ρ‚ΠΎ отличная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΄ΠΈΠ·Π°ΠΉΠ½ GUI ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ прилоТСния.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… Π²Ρ‹ создадитС подходящий ΠΌΠ°ΠΊΠ΅Ρ‚ для ΠΈΠ³Ρ€Ρ‹ Π² висСлицу. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ лСса ΠΈ повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°.

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ исходный ΠΊΠΎΠ΄ для этого шага – ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² ΠΏΠ°ΠΏΠΊΡƒ source_code_step_4/:

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ графичСского интСрфСйса висСлицы

Π’ PySimpleGUI Π²Ρ‹ создаСтС графичСскиС интСрфСйсы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Ρ… списков. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список прСдставляСт собой строку ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² сСбя нСсколько элСмСнтов управлСния. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ шагом ΠΏΡ€ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ являСтся Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ элСмСнтов GUI Π½Π° строки ΠΈΠ»ΠΈ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ списки, содСрТащиС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ элСмСнты PySimpleGUI.

Если Π²Ρ‹ посмотритС Π½Π° свой Π΄ΠΈΠ·Π°ΠΉΠ½ GUI, Ρ‚ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ GUI Π² Ρ‚Ρ€ΠΈ ряда. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ряда ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΠΊΡ€ΡƒΠΆΠΎΠΊ, даст Π²Π°ΠΌ Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ подсказку ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт:

ΠšΡ€Π°ΡΠ½Ρ‹ΠΌΠΈ линиями Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ основныС элСмСнты ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, Ρ€Π°Π·Π±ΠΈΡ‚Ρ‹Π΅ Π½Π° ряды:

  • ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ряд содСрТит ΠΎΠ±Π»Π°ΡΡ‚ΡŒ изобраТСния повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ.
  • Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ ряду находится ΠΎΡ‚Π³Π°Π΄Ρ‹Π²Π°Π΅ΠΌΠΎΠ΅ слово.
  • Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌ ряду находятся ΠΊΠ½ΠΎΠΏΠΊΠΈ «Новая ΠΈΠ³Ρ€Π°Β», «Бброс» ΠΈ Β«Π’Ρ‹Ρ…ΠΎΠ΄Β».

Для отобраТСния ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ряда Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список, содСрТащий ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ управлСния PySimpleGUI для элСмСнтов Π² этом ряду.

Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π·Π΅Π»Π΅Π½Ρ‹Π΅ ΠΊΠΎΠ½Ρ‚ΡƒΡ€Ρ‹, Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π° сСмь рядов. Π’Ρ‹ сгруппируСтС эти ΠΊΠ½ΠΎΠΏΠΊΠΈ Π²ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ списки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π»ΠΎΠΆΠΈΡ‚Π΅ Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ряд ΠΌΠ°ΠΊΠ΅Ρ‚Π° PySimpleGUI.

ΠœΠ°ΠΊΠ΅Ρ‚ PySimpleGUI – это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ список Python. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ°ΠΊΠ΅Ρ‚ GUI состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… строк, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ список с трСмя Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠ°ΠΌΠΈ. ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ класс Hangman, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄Π΅:

# ...

class Hangman:
    def __init__(self) -> None:
        layout = [
            [
                self._build_canvas_frame(),
                self._build_letters_frame(),
            ],
            [
                self._build_guessed_word_frame(),
            ],
            [
                self._build_action_buttons_frame(),
            ],
        ]
        self._window = sg.Window(
            title="Hangman",
            layout=layout,
            finalize=True,
        )

    # ...

Π’ этом Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° Π²Ρ‹ Π·Π°Π΄Π°Π΅Ρ‚Π΅ структуру ΠΌΠ°ΠΊΠ΅Ρ‚Π° ΠΊΠ°ΠΊ список списков Π² Python. ВсС Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ списки содСрТат Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹. Π’Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚Π΅ всС эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π² блиТайшСС врСмя.

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список содСрТит Π΄Π²Π° обращСния ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для создания области с ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ – для создания ΠΊΠ½ΠΎΠΏΠΎΠΊ с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список содСрТит Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ для создания ряда ΡƒΠ³Π°Π΄Π°Π½Π½Ρ‹Ρ… слов. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список содСрТит ΠΌΠ΅Ρ‚ΠΎΠ΄ для создания ΠΊΠ½ΠΎΠΏΠΎΠΊ дСйствий «Новая ΠΈΠ³Ρ€Π°Β», «Бброс» ΠΈ Β«Π’Ρ‹Ρ…ΠΎΠ΄Β». ПослСднСС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π² этом ΠΊΠΎΠ΄Π΅ – ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° margins ΠΈΠ· характСристики ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ._window.

Π§Ρ‚ΠΎΠ±Ρ‹ Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² строкС, Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ класс Frame. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρƒ вас Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ основных Ρ€Π°ΠΌΠΊΠΈ:

  1. Π Π°ΠΌΠΊΠ° области изобраТСния повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°
  2. Π Π°ΠΌΠΊΠ° Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ
  3. Рамка загаданного слова
  4. Π Π°ΠΌΠΊΠΈ ΠΊΠ½ΠΎΠΏΠΎΠΊ «Новая ΠΈΠ³Ρ€Π°Β», «Бброс» ΠΈ Β«Π’Ρ‹Ρ…ΠΎΠ΄Β».

Для создания области изобраТСния повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ класс Graph. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ для Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ._build_canvas_frame():

# ...

class Hangman:
    # ...

    def _build_canvas_frame(self):
        return sg.Frame(
            "Hangman",
            [
                [
                    sg.Graph(
                        key="-CANVAS-",
                        canvas_size=(200, 400),
                        graph_bottom_left=(0, 0),
                        graph_top_right=(200, 400),
                    )
                ]
            ],
            font="Any 20",
        )

    # ...

Π’ Π΄Π°Π½Π½ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π²Π½Π°Ρ‡Π°Π»Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Frame с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ Β«HangmanΒ». Π€Ρ€Π΅ΠΉΠΌ содСрТит список с Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌ Π² Π½Π΅Π³ΠΎ содСрТимым. Π­Ρ‚ΠΎΡ‚ список прСдставляСт собой ΠΌΠ°ΠΊΠ΅Ρ‚ Ρ€Π°ΠΌΠΊΠΈ.

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ Graph располагаСт ΠΊΠ»ΡŽΡ‡ΠΎΠΌ -CANVAS-. Π’Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΊΠ»ΡŽΡ‡ для доступа ΠΊ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡŽ вашСго ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Graph. Π Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΠΎΡ‚Π½Π° составляСт 200 пиксСлСй Π² ΡˆΠΈΡ€ΠΈΠ½Ρƒ ΠΈ 400 пиксСлСй Π² высоту, Π»Π΅Π²Ρ‹ΠΉ Π½ΠΈΠΆΠ½ΠΈΠΉ ΡƒΠ³ΠΎΠ» Ρ€Π°Π²Π΅Π½ (0, 0), Π° ΠΏΡ€Π°Π²Ρ‹ΠΉ – (200, 400). Π­Ρ‚ΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΏΡ€ΠΈ написании ΠΊΠΎΠ΄Π° для изобраТСния повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°.

πŸ’‘ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅
ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π² PySimpleGUI Π² качСствС ΠΊΠ»ΡŽΡ‡Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ строка с описаниСм. Однако ΠΊΠ»ΡŽΡ‡ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ любого Ρ…Π΅ΡˆΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, int, tuple ΠΈΠ»ΠΈ str. Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ строки Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ рСгистрС с ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ ΠΈ послСдним дСфисом, Ρ‡Ρ‚ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎ распространСно Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ дСмонстрационных ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² PySimpleGUI.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΡ€ΠΈΡˆΠ»ΠΎ врСмя для создания Ρ€Π°ΠΌΠΊΠΈ с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ. Π”ΠΈΠ·Π°ΠΉΠ½ графичСского интСрфСйса прСдусматриваСт сСмь рядов ΠΊΠ½ΠΎΠΏΠΎΠΊ, располоТСнных Π² столбик. Для размСщСния Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ столбцС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс Column.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° для создания Ρ€Π°ΠΌΠΊΠΈ с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ:

from string import ascii_uppercase
# ...

class Hangman:
    # ...

    def _build_letters_frame(self):
        letter_groups = [
            ascii_uppercase[i : i + 4]
            for i in range(0, len(ascii_uppercase), 4)
        ]
        letter_buttons = [
            [
                sg.Button(
                    button_text=f" {letter} ",
                    font="Courier 20",
                    border_width=0,
                    button_color=(None, sg.theme_background_color()),
                    key=f"-letter-{letter}-",
                    enable_events=True,
                )
                for letter in letter_group
            ]
            for letter_group in letter_groups
        ]
        return sg.Column(
            [
                [
                    sg.Frame(
                        "Letters",
                        letter_buttons,
                        font="Any 20",
                    ),
                    sg.Sizer(),
                ]
            ]
        )

    # ...

Π’ этом ΠΊΠΎΠ΄Π΅ присутствуСт ΠΌΠ½ΠΎΠ³ΠΎ интСрСсного. Π’ΠΎΡ‚ Π΅Π³ΠΎ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС:

  • Π’ строках с 8 ΠΏΠΎ 11 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ список для получСния Π½Π°Π±ΠΎΡ€Π° Π±ΡƒΠΊΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сСмь Π±ΡƒΠΊΠ²Π΅Π½Π½Ρ‹Ρ… строк. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ascii_uppercase ΠΈΠ· модуля string.
  • Π‘Ρ‚Ρ€ΠΎΠΊΠΈ с 12 ΠΏΠΎ 25 ΡΠΎΠ·Π΄Π°ΡŽΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ список с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΡŽ Π³Ρ€ΡƒΠΏΠΏ Π±ΡƒΠΊΠ², Π° Π·Π°Ρ‚Π΅ΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ Π² Π³Ρ€ΡƒΠΏΠΏΠ°Ρ…. БоздаСтся Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Button. КаТдая ΠΊΠ½ΠΎΠΏΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Π±ΡƒΠΊΠ²Ρƒ. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ настраиваСтС ΠΊΠ½ΠΎΠΏΠΊΠΈ, измСняя Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡ… свойства, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΡˆΡ€ΠΈΡ„Ρ‚, Π³Ρ€Π°Π½ΠΈΡ†Ρ‹, Ρ†Π²Π΅Ρ‚ ΠΈ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ.
  • Π’ строках 26-37 создаСтся ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Column. ΠœΠ°ΠΊΠ΅Ρ‚ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° содСрТит ΠΎΠ΄ΠΈΠ½ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ находится Ρ€Π°ΠΌΠΊΠ° со всСми ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ-Π±ΡƒΠΊΠ²Π°ΠΌΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ этот Ρ„Ρ€Π΅ΠΉΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Β«Π‘ΡƒΠΊΠ²Ρ‹Β».

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ._build_letters_frame(), Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ._build_guessed_word_frame():

# ...

class Hangman:
    # ...

    def _build_guessed_word_frame(self):
        return sg.Frame(
            "",
            [
                [
                    sg.Text(
                        key="-DISPLAY-WORD-",
                        font="Courier 20",
                    )
                ]
            ],
            element_justification="center",
        )

    # ...

Π­Ρ‚Π° строка содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ элСмСнт – ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Text, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ΅ слово, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚Π΅ Π½Π° экран для оповСщСния ΠΈΠ³Ρ€ΠΎΠΊΠ°. УстановитС ΡˆΡ€ΠΈΡ„Ρ‚ Courier, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ Π·Π°Π½ΠΈΠΌΠ°Π» Ρ€Π°Π²Π½ΠΎΠ΅ пространство ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ.

ПослСдний ряд ΠΌΠ°ΠΊΠ΅Ρ‚Π° ΠΈΠ³Ρ€Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ для управлСния Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΈΠ³Ρ€ΠΎΠ²Ρ‹ΠΌ процСссом:

# ...

class Hangman:
    # ...

    def _build_action_buttons_frame(self):
        return sg.Frame(
            "",
            [
                [
                    sg.Sizer(h_pixels=90),
                    sg.Button(
                        button_text="New",
                        key="-NEW-",
                        font="Any 20",
                    ),
                    sg.Sizer(h_pixels=60),
                    sg.Button(
                        button_text="Restart",
                        key="-RESTART-",
                        font="Any 20",
                    ),
                    sg.Sizer(h_pixels=60),
                    sg.Button(
                        button_text="Quit",
                        key="-QUIT-",
                        font="Any 20",
                    ),
                    sg.Sizer(h_pixels=90),
                ]
            ],
            font="Any 20",
        )

    # ...

Π’ этом ΠΊΠΎΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Frame ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΌΠ°ΠΊΠ΅Ρ‚, состоящий ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ списка. Π’Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ список содСрТит Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Sizer ΠΈ Ρ‚Ρ€ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Sizer ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠ½ΠΎΠΏΠΊΠ°ΠΌΠΈ.

И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ key ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΈ. Π›ΡŽΠ±Ρ‹Π΅ элСмСнты GUI, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ этот ΠΊΠ»ΡŽΡ‡, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° элСмСнт ΠΈ Π·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Π» Ρ‚ΠΎ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ΅ дСйствиС. Как ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡ΠΈ, Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ….

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΠ°ΠΊΠ΅Ρ‚ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΊ написанию ΠΊΠΎΠ΄Π° для изобраТСния повСшСнного.

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ссылку Π½Π° ΠΏΠΎΠ»Π΅ для рисования. Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π²Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Graph Π² ΠΌΠ°ΠΊΠ΅Ρ‚ вашСго прилоТСния. Π­Ρ‚ΠΎΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ рисования. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π²Ρ‹ использовали ΠΊΠ»ΡŽΡ‡ "-CANVAS-". Π­Ρ‚ΠΎΡ‚ ΠΊΠ»ΡŽΡ‡ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π²Π°ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°.

Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строку Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ «ВисСлицы»:

# ...

class Hangman:
    def __init__(self) -> None:
        # ...
        self._canvas = self._window["-CANVAS-"]

    # ...

Π­Ρ‚Π° строка ΠΊΠΎΠ΄Π° содСрТит Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ._canvas, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ссылаСтся Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ рисования. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ Ρ€Π°Π±ΠΎΡ‚Π΅.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ Ρ€ΠΈΡΠΎΠ²Π°Π½ΠΈΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ для изобраТСния Π»ΠΈΠ½ΠΈΠΉ ΠΈ Ρ„ΠΈΠ³ΡƒΡ€ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ Graph ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ 2D-ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ ΠΏΡ€ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… Ρ‚ΠΎΡ‡Π΅ΠΊ Π½Π° холстС. ПослС этого Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ½ΠΈΠΈ ΠΈ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΈΡ… Π² качСствС ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ². Для опрСдСлСния ΠΏΠ°Ρ€Ρ‹ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ с двумя значСниями.

Π’ этом ΡƒΡ€ΠΎΠΊΠ΅ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ просто ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Π² Ρ„Π°ΠΉΠ» локального ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Однако Π² собствСнных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Ρ‚ΡŒ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΈ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Ρ‚ΠΎΡ‡ΠΊΠΈ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹ ΠΈ Π»ΠΈΠ½ΠΈΠΈ Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… позициях.

Для Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ нарисуСт лСса для повСшСнного:

# ...

class Hangman:
    # ...

    def _draw_scaffold(self):
        lines = [
            ((40, 55), (180, 55), 10),
            ((165, 60), (165, 365), 10),
            ((160, 360), (100, 360), 10),
            ((100, 365), (100, 330), 10),
            ((100, 330), (100, 310), 1),
        ]
        for *points, width in lines:
            self._canvas.DrawLine(*points, color="black", width=width)

    # ...

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ лСса, Π²Π°ΠΌ понадобится нСсколько Π»ΠΈΠ½ΠΈΠΉ, Π° для опрСдСлСния Π»ΠΈΠ½ΠΈΠΈ – Π΄Π²Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° с двумя значСниями. Бписок lines Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Π½Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ. Они Ρ‚Π°ΠΊΠΆΠ΅ содСрТат ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставляСт собой ΡˆΠΈΡ€ΠΈΠ½Ρƒ Π»ΠΈΠ½ΠΈΠΈ.

Π’ Ρ†ΠΈΠΊΠ»Π΅ for Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ Π»ΠΈΠ½ΠΈΠΈ, извлСкая Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ значСния ΡˆΠΈΡ€ΠΈΠ½Ρ‹ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ†ΠΈΠΊΠ»Π°. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ .DrawLine() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Graph, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ½ΠΈΠΈ. Π’Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² дСйствии Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ·ΠΆΠ΅.

Π‘ΠΎΠ·Π΄Π°Π² ΡΡˆΠ°Ρ„ΠΎΡ‚, Π²Π°ΠΌ прСдстоит Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. Для рисования висСльника Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹:

  • Π“ΠΎΠ»ΠΎΠ²Π°
  • Π’ΡƒΠ»ΠΎΠ²ΠΈΡ‰Π΅
  • ЛСвая ΠΈ правая Ρ€ΡƒΠΊΠΈ
  • ЛСвая ΠΈ правая Π½ΠΎΠ³ΠΈ

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΡˆΠ΅ΡΡ‚ΡŒ частСй Ρ‚Π΅Π»Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ рисунок. Для изобраТСния Π³ΠΎΠ»ΠΎΠ²Ρ‹ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΡ€ΡƒΠ³. Для ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… частСй ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈΠ½ΠΈΠΈ, ΠΊΠ°ΠΊ это Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈ рисовании ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… лСсов. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ:

# ...

class Hangman:
    # ...

    def _draw_hanged_man(self):
        head = (100, 290)
        torso = [((100, 270), (100, 170))]
        left_arm = [
            ((100, 250), (80, 250)),
            ((80, 250), (60, 210)),
            ((60, 210), (60, 190)),
        ]
        right_arm = [
            ((100, 250), (120, 250)),
            ((120, 250), (140, 210)),
            ((140, 210), (140, 190)),
        ]
        left_leg = [
            ((100, 170), (80, 170)),
            ((80, 170), (70, 140)),
            ((70, 140), (70, 80)),
            ((70, 80), (60, 80)),
        ]
        right_leg = [
            ((100, 170), (120, 170)),
            ((120, 170), (130, 140)),
            ((130, 140), (130, 80)),
            ((130, 80), (140, 80)),
        ]
        body = [
            torso,
            left_arm,
            right_arm,
            left_leg,
            right_leg,
        ]
        if self._wrong_guesses == 1:
            self._canvas.DrawCircle(
                head,
                20,
                line_color="red",
                line_width=2,
            )
        elif self._wrong_guesses > 1:
            for part in body[self._wrong_guesses - 2]:
                self._canvas.DrawLine(*part, color="red", width=2)

    # ...

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π²Ρ‹ опрСдСляСтС head ΠΊΠ°ΠΊ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Ρ‚ΠΎΡ‡ΠΊΡƒ. Π­Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Ρ†Π΅Π½Ρ‚Ρ€ Π³ΠΎΠ»ΠΎΠ²Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π³ΠΎΠ»ΠΎΠ²Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π° Π² Π²ΠΈΠ΄Π΅ ΠΊΡ€ΡƒΠ³Π°.

Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚Π΅ Ρ‚ΡƒΠ»ΠΎΠ²ΠΈΡ‰Π΅ Π² Π²ΠΈΠ΄Π΅ списка ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ. Π­Ρ‚ΠΎΡ‚ список опрСдСляСт Π΄Π²Π΅ Ρ‚ΠΎΡ‡ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для рисования Ρ‚ΡƒΠ»ΠΎΠ²ΠΈΡ‰Π° повСшСнного Π² Π²ΠΈΠ΄Π΅ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ.

Для рисования Ρ€ΡƒΠΊ Π²Π°ΠΌ понадобятся Ρ‚Ρ€ΠΈ Π»ΠΈΠ½ΠΈΠΈ. Они Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΏΠ»Π΅Ρ‡ΠΎ, Ρ€ΡƒΠΊΡƒ ΠΈ ΠΏΡ€Π΅Π΄ΠΏΠ»Π΅Ρ‡ΡŒΠ΅ соотвСтствСнно. Для Π½ΠΎΠ³ – Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π»ΠΈΠ½ΠΈΠΈ. Они Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒ Π±Π΅Π΄Ρ€ΠΎ, ΠΊΠΎΠ»Π΅Π½ΠΎ, ΠΈΠΊΡ€Ρƒ ΠΈ стопу соотвСтствСнно. Π’ΡƒΠ»ΠΎΠ²ΠΈΡ‰Π΅, Ρ€ΡƒΠΊΠΈ ΠΈ Π½ΠΎΠ³ΠΈ – всС эти Π»ΠΈΠ½ΠΈΠΈ ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ Ρ‚Π΅Π»ΠΎ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚Π΅ ΠΈΡ… Π² ΠΎΠ΄ΠΈΠ½ список.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг – Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΠ»ΠΎΠ²Ρƒ ΠΈ Ρ‚Π΅Π»ΠΎ. Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π³ΠΎΠ»ΠΎΠ²Ρƒ, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ .DrawCircle(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‚ΠΎΡ‡ΠΊΡƒ. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ устанавливаСтС радиус окруТности Π² Π΄Π²Π°Π΄Ρ†Π°Ρ‚ΡŒ пиксСлСй, Ρ†Π²Π΅Ρ‚ Π»ΠΈΠ½ΠΈΠΈ – красный, Π° ΡˆΠΈΡ€ΠΈΠ½Ρƒ Π»ΠΈΠ½ΠΈΠΈ – Π΄Π²Π° пиксСля.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ рисуСтС Ρ‚Π΅Π»ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° .DrawLine(). И снова Π²Ρ‹ устанавливаСтС Ρ†Π²Π΅Ρ‚ Π»ΠΈΠ½ΠΈΠΈ – красный, Π° Π΅Π΅ ΡˆΠΈΡ€ΠΈΠ½Ρƒ Π² Π΄Π²Π° пиксСля.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ вСсь этот ΠΊΠΎΠ΄ Π² дСйствии, Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ тСкст Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ «ВисСлицы»:

# ...
MAX_WRONG_GUESSES = 6

class Hangman:
    def __init__(self) -> None:
        # ...
        self._canvas = self._window["-CANVAS-"]
        # Temporary code
        self._draw_scaffold()
        for index in range(MAX_WRONG_GUESSES):
            self._wrong_guesses = index + 1
            self._draw_hanged_man()

    # ...

Π’ этом Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° Π²Ρ‹ опрСдСляСтС константу MAX_WRONG_GUESSES. Π§Ρ‚ΠΎ это Π·Π° постоянная? Рисунок повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° состоит ΠΈΠ· ΡˆΠ΅ΡΡ‚ΠΈ частСй. Π’Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ постСпСнно, ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΈΠ³Ρ€ΠΎΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡˆΠΈΠ±Π°Ρ‚ΡŒΡΡ Π² Π²Ρ‹Π±ΠΎΡ€Π΅ Π±ΡƒΠΊΠ². Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, MAX_WRONG_GUESSES Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π²Π½ΠΎ 6, Ρ‡Ρ‚ΠΎ являСтся ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ количСством Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Π΄ΠΎΠ³Π°Π΄ΠΎΠΊ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹Π±Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ· ΠΈΠ³Ρ€Ρ‹.

Π’ этом ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π° Π²Ρ‹ спСрва Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ._draw_scaffold(), прорисовывая ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ лСса, Π° Π·Π°Ρ‚Π΅ΠΌ запускаСтС Ρ†ΠΈΠΊΠ» ΠΏΠΎ ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ опрСдСляСтС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ MAX_WRONG_GUESSES.

Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° Π²Ρ‹ обновляСтС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ._wrong_guesses. Π’Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΎΠ± этом Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ ΠΏΠΎΠ·ΠΆΠ΅. Пока Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΅Π³ΠΎ Π² качСствС ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ ._draw_hanged_man(). Если Π²Ρ‹ запуститС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ сСйчас, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΠΊΠ½ΠΎ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ:

Π˜Π³Ρ€Π° «ВисСлица»

Π’Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΠΎ! Π’Π°ΡˆΠ° ΠΈΠ³Ρ€Π° «ВисСлица» ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Ρ‚Π°Π΅Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ. Π’Ρ‹ создали подходящий графичСский интСрфСйс для ΠΈΠ³Ρ€Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ смотрится! Однако графичСский интСрфСйс ΠΏΠΎΠΊΠ° Π½Π΅ Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ дСйствия. Π’Π°ΠΌ прСдстоит ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это, спроСктировав Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈΠ³Ρ€Ρ‹ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ² Π΅Π΅ ΠΊ графичСскому интСрфСйсу.

Π¨Π°Π³ 5: Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈΠ³Ρ€Ρ‹ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π΅Π΅ ΠΊ графичСскому интСрфСйсу

Π”ΠΎ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π»ΠΈ графичСский интСрфСйс висСлицы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PySimpleGUI. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°Π½ΡΡ‚ΡŒΡΡ написаниСм Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΈΠ³Ρ€Ρ‹. Π§Ρ‚ΠΎ Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ эту Π»ΠΎΠ³ΠΈΠΊΡƒ с графичСским интСрфСйсом ΠΈΠ³Ρ€Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Ρ€Π΅Π°Π³ΠΈΡ€ΠΎΠ²Π°Π»Π° Π½Π° дСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

Помимо ΠΏΡ€ΠΎΡ‡Π΅Π³ΠΎ, Π²Π°ΠΌ потрСбуСтся Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия:

  • Π’Ρ‹Π±ΠΎΡ€ подходящСго слова
  • ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ слова ΠΈΠ»ΠΈ Π±ΡƒΠΊΠ²
  • Запуск Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹
  • ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ…ΠΎΠ΄ΠΎΠ² ΠΈΠ³Ρ€ΠΎΠΊΠ°
  • ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° окончания ΠΈΠ³Ρ€Ρ‹.

Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ€Π°Π·Π΄Π΅Π»Π°Ρ… Π²Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ для управлСния этими Π·Π°Π΄Π°Ρ‡Π°ΠΌΠΈ Π² своСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ «ВисСлица». НачнСм с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π² класс Hangman. Π­Ρ‚ΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ процСсс Π²Ρ‹Π±ΠΎΡ€Π° Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ слова для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ°Ρ‚Ρ‡Π° Π² висСлицС.

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ исходный ΠΊΠΎΠ΄ для этого шага – ΠΏΠ΅Ρ€Π΅ΠΉΠ΄ΠΈΡ‚Π΅ Π² ΠΏΠ°ΠΏΠΊΡƒ source_code_step_5/.

Π’Ρ‹Π±ΠΎΡ€ слова для отгадывания

ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ шаг Π² ΠΈΠ³Ρ€Π΅ Π² висСлицу – Π²Ρ‹Π±ΠΎΡ€ слова-задания. Когда ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ слово для ΠΈΠ³Ρ€Ρ‹ Π² висСлицу, ΠΎΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΎΠ΄Π½ΠΎ слово ΠΈΠ· своСго словарного запаса. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π°Π» слово, Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ собствСнный ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΅Π³ΠΎ словарный запас Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ большим, ΠΊΠ°ΠΊ Ρƒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°.

ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Ρ„Π°ΠΉΠ» words.txt. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ список, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΈΠ³Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ подходящСС слово. ΠŸΠΎΠ»Π½Ρ‹ΠΉ исходный ΠΊΠΎΠ΄ этого шага, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ„Π°ΠΉΠ» words.txt, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΠ»ΠΈ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ, Π²Π°ΠΌ потрСбуСтся Π½Π°ΠΉΡ‚ΠΈ способ для Π²Ρ‹Π±ΠΎΡ€Π° случайного слова ΠΈΠ· Π½Π΅Π³ΠΎ. ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π°ΠΌ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ:

from random import choice
# ...

class Hangman:
    # ...

    def _select_word(self):
        with open("words.txt", mode="r", encoding="utf-8") as words:
            word_list = words.readlines()
        return choice(word_list).strip().upper()

    # ...

Π’ этом Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π° Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ ._select_word() для Π²Ρ‹Π±ΠΎΡ€Π° слова для отгадывания ΠΈΠ· Ρ„Π°ΠΉΠ»Π° words.txt. Π’Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ with для открытия Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ .readlines() для создания списка слов. Π—Π°Ρ‚Π΅ΠΌ, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° choice(), Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ случайноС слово ΠΈΠ· списка.

ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ слова

Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ³Ρ€Π΅ «ВисСлица» послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹Π±Ρ€Π°Π» слово, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ Π² словС. Π­Ρ‚ΠΈ подчСркивания подскаТут ΠΎΡ‚Π³Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌ, сколько Π±ΡƒΠΊΠ² Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ словС. По ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΎΡ‚Π³Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ Π΄Π΅Π»Π°Π΅Ρ‚ прСдполоТСния, Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΏΠΈΡˆΠ΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹ Π½Π°Π΄ подчСркиваниями.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΡ‹ΠΌΠΈΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹ΠΉ процСсс Π² вашСй ΠΈΠ³Ρ€Π΅ Π² висСлицу, Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄:

# ...

class Hangman:
    # ...

    def _build_guessed_word(self):
        current_letters = []
        for letter in self._target_word:
            if letter in self._guessed_letters:
                current_letters.append(letter)
            else:
                current_letters.append("_")
        return " ".join(current_letters)

    # ...

Π­Ρ‚Π° функция ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ†ΠΈΠΊΠ» for для заполнСния списка current_letters. Π¦ΠΈΠΊΠ» просматриваСт ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ Π² Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π΅ ._target_word ΠΈ опрСдСляСт, содСрТится Π»ΠΈ эта Π±ΡƒΠΊΠ²Π° Π² ._guessed_letters. Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° добавляСт Π±ΡƒΠΊΠ²Ρƒ Π² current_letters. Если Π½Π΅Ρ‚, Ρ‚ΠΎ ΠΎΠ½Π° добавляСт Π·Π½Π°ΠΊ подчСркивания _ ΠΊ current_letters. ПослС этого Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ .join() для создания ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ³ΠΎ слова, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… мСстах.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ ._target_word ΠΈ ._guessed_letters. Π’Ρ‹ сдСлаСтС это Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Запуск ΠΈΠ»ΠΈ пСрСзапуск ΠΈΠ³Ρ€Ρ‹

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ запускаСтС ΠΈΠ³Ρ€Ρƒ «ВисСлица» ΠΈΠ»ΠΈ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚Π΅ Π½ΠΎΠ²Ρ‹ΠΉ ΠΌΠ°Ρ‚Ρ‡, Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ нСсколько Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ состояниС ΠΈΠ³Ρ€Ρ‹. Π­Ρ‚ΠΈ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ прСдставлСны Π½ΠΈΠΆΠ΅:

  1. Π—Π°Π΄Π°Π½Π½ΠΎΠ΅ слово, ._target_word
  2. Π£Π³Π°Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹, ._guessed_letters
  3. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Π΄ΠΎΠ³Π°Π΄ΠΎΠΊ, ._wrong_guesses
  4. ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ слова, ._guessed_word

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊ Π²Ρ‹ Π½Π°Ρ‡Π½Π΅Ρ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС эти Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ ._new_game():

# ...

class Hangman:
    # ...

    def _new_game(self):
        self._target_word = self._select_word()
        self._restart_game()

    # ...

Π’Π½ΡƒΡ‚Ρ€ΠΈ ._new_game() Π²Ρ‹ опрСдСляСтС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ._target_word, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ΅ слово для Π½Π°Ρ‡Π°Π»Π° Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠ΅ слово ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ._select_word().

Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ ._restart_game(). Π’ этом ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Π²Ρ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ состояниС ΠΈΠ³Ρ€Ρ‹. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π΄Π²ΡƒΡ… нСзависимых ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΠ½ΠΎΠΏΠΎΠΊ «Новая ΠΈΠ³Ρ€Π°Β» ΠΈ Β«ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΒ» соотвСтствСнно. Π’Ρ‹ сдСлаСтС это Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ΄ для ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ._restart_game():

# ...

class Hangman:
    # ...

    def _restart_game(self):
        self._guessed_letters = set()
        self._wrong_guesses = 0
        self._guessed_word = self._build_guessed_word()
        # Restart GUI
        self._canvas.erase()
        self._draw_scaffold()
        for letter in ascii_uppercase:
            self._window[f"-letter-{letter}-"].update(disabled=False)
        self._window["-DISPLAY-WORD-"].update(self._guessed_word)

    # ...

Для отслСТивания ΠΎΡ‚Π³Π°Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠΊΠ² Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ мноТСство Python. ИспользованиС мноТСства позволяСт ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, ΠΎΡ‚Π³Π°Π΄Π°Π» Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ Π·Π°Π΄Π°Π½Π½ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ тСсты принадлСТности с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° in.

Атрибут ._wrong_guesses Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ количСство Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Π΄ΠΎΠ³Π°Π΄ΠΎΠΊ, сдСланных ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ. Π•Π³ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ€Π°Π²Π½ΠΎ 0. Π”Π°Π»Π΅Π΅ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ._build_guessed_word(), ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΡƒΡŽ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ слово. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ пСрСзапуск ΠΈΠ³Ρ€Ρ‹ Π½Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π²Ρ‹Π±ΠΎΡ€Π° Π½ΠΎΠ²ΠΎΠ³ΠΎ слова для отгадывания.

ПослСдниС строки этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ связаны с графичСским интСрфСйсом ΠΈΠ³Ρ€Ρ‹ ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ³ΠΎ объяснСния.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ пСрСзапускаСтС ΠΈΠ³Ρ€Ρƒ, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ рисунок повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. Для этого Π²Ρ‹ Π² ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ .erase() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Graph, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² качСствС холста. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ пСрСрисовываСтС ΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ лСса. ПослС этих ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ рисования Π³ΠΎΡ‚ΠΎΠ²Π° ΠΊ запуску Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ»ΠΈ пСрСзапуску ΠΈΠ³Ρ€Ρ‹.

Π”Π°Π»Π΅Π΅ Π²Ρ‹ ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚Π΅ список ASCII ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ всС ΠΊΠ½ΠΎΠΏΠΊΠΈ с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ Π² графичСском интСрфСйсС висСлицы. ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ? ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, ΠΊΠ°ΠΊ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ³Ρ€Π΅ Π² висСлицу Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ всС ΠΎΡ‚Π³Π°Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹?

Π’Π°ΠΊ Π²ΠΎΡ‚, Π² вашСй графичСской Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ висСлицы Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ количСство ΡƒΠ³Π°Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠΊΠ², ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈΡ… послС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΠ³Ρ€ΠΎΠΊ Π½Π°ΠΆΠΌΠ΅Ρ‚ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ ΠΊΠ½ΠΎΠΏΠΊΡƒ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·Π°Ρ†ΠΈΡŽ графичСского интСрфСйса ΠΈΠ³Ρ€Ρ‹, Π²Ρ‹ обновляСтС Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ΅ слово, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ соотвСтствовало послСднСму Ρ…ΠΎΠ΄Ρƒ ΠΈΠ³Ρ€ΠΎΠΊΠ°. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π²Ρ‹ Π·Π°ΠΉΠΌΠ΅Ρ‚Π΅ΡΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ….

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ³Ρ€Ρ‹ «ВисСлица», Ρ…ΠΎΠ΄ ΡΠΎΠ²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° ΡƒΠ³Π°Π΄Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ с Π±ΡƒΠΊΠ²ΠΎΠΉ. Клик – это дСйствиС, поэтому Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ возмоТности PySimpleGUI. Для этого Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΄Π²Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, .process_event() ΠΈ ._play().

ΠœΠ΅Ρ‚ΠΎΠ΄ .process_event() – это ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ всСх ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… взаимодСйствий ΠΈΠ»ΠΈ сообщСний. Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ._play() Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ…ΠΎΠ΄Ρ‹ ΠΈΠ³Ρ€ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ с Π±ΡƒΠΊΠ²ΠΎΠΉ.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΊΠΎΠ΄ с использованиСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π° .process_event():

# ...

class Hangman:
    # ...

    def read_event(self):
        # ...

    def process_event(self, event):
        if event[:8] == "-letter-":
            self._play(letter=event[8])
        elif event == "-RESTART-":
            self._restart_game()
        elif event == "-NEW-":
            self._new_game()

    # ...

Π’ .process_event() Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ event содСрТит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π·Π°Π΄Π°Π»ΠΈ Ρ‡Π΅Ρ€Π΅Π· Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ key, ΠΊΠΎΠ³Π΄Π° Π½Π°Π·Π½Π°Ρ‡Π°Π»ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² ΠΌΠ°ΠΊΠ΅Ρ‚Π΅. Условный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ провСряСт, являСтся Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ дСйствиС Ρ‰Π΅Π»Ρ‡ΠΊΠΎΠΌ ΠΏΠΎ ΠΊΠ½ΠΎΠΏΠΊΠ΅ с Π±ΡƒΠΊΠ²ΠΎΠΉ.

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π²Ρ‹ Π·Π°Π΄Π°Π»ΠΈ для клавиши letters Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ f"-letter-{letter}-". Π’ условном ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ провСряСтся, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ Π»ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹Π΅ восСмь символов Π² ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ дСйствия со строкой "-letter-". Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ дСйствиС – это Π½Π°ΠΆΠ°Ρ‚ΠΈΠ΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ с Π±ΡƒΠΊΠ²ΠΎΠΉ. Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎΠ³Π΄Π° Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ ._play() с Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π±ΡƒΠΊΠ²ΠΎΠΉ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

Условия elif ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ дСйствия "-RESTART-" ΠΈ "-NEW-" соотвСтствСнно. ДСйствиС "-RESTART-" осущСствляСтся, ΠΊΠΎΠ³Π΄Π° ΠΈΠ³Ρ€ΠΎΠΊ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΒ», Π° дСйствиС "-NEW-" – ΠΊΠΎΠ³Π΄Π° ΠΈΠ³Ρ€ΠΎΠΊ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ «Новая ΠΈΠ³Ρ€Π°Β». Π’ любом случаС Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΡ„ΠΎΡ€ΠΌΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ ._play():

# ...

class Hangman:
    # ...

    def _restart_game(self):
        # ...

    def _play(self, letter):
        if letter not in self._target_word:
            self._wrong_guesses += 1
        self._guessed_letters.add(letter)
        self._guessed_word = self._build_guessed_word()
        # Update GUI
        self._window[f"-letter-{letter}-"].update(disabled=True)
        self._window["-DISPLAY-WORD-"].update(self._guessed_word)
        self._draw_hanged_man()

    # ...

Π’ ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ ._play() ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго провСряСтся, Π½Π΅Ρ‚ Π»ΠΈ ΡƒΠ³Π°Π΄Π°Π½Π½ΠΎΠΉ Π±ΡƒΠΊΠ²Ρ‹ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ словС. Π’ этом случаС счСтчик Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Π΄ΠΎΠ³Π°Π΄ΠΎΠΊ увСличиваСтся Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ. Если тСкущая Π±ΡƒΠΊΠ²Π° Π΅ΡΡ‚ΡŒ Π² Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠΌ словС, Ρ‚ΠΎ ΠΎΠ½Π° добавляСтся Π² список ΡƒΠ³Π°Π΄Π°Π½Π½Ρ‹Ρ… Π±ΡƒΠΊΠ², Ρ‡Ρ‚ΠΎ позволяСт вСсти ΠΈΡ… ΡƒΡ‡Π΅Ρ‚. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ обновляСтС Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ΅ слово, вызывая ._build_guessed_word().

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Ρ€ΠΈ строки позаботятся ΠΎΠ± ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ графичСского интСрфСйса ΠΈΠ³Ρ€Ρ‹. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²Ρ‹ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ наТатия Π½Π° Π±ΡƒΠΊΠ²Ρƒ. Π­Ρ‚ΠΎ дСйствиС Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΈΠ³Ρ€ΠΎΠΊ Π½Π΅ смоТСт ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ с Π±ΡƒΠΊΠ²ΠΎΠΉ. Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹ обновляСтС Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ΅ слово ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, обновляСтС ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ повСшСнного.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π²Ρ‹ написали ΠΊΠΎΠ΄ для получСния ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π²Π²ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…, Π²Π°ΠΌ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Π² ΠΊΠ°ΠΊΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΈΠ³Ρ€Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΊΠΎΠ½Ρ‡Π΅Π½Π°.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΠ³Ρ€Ρ‹

Π˜Π³Ρ€Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΠΎ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ, Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ Ρ…ΠΎΠ΄Π°ΠΌΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠ°. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠ³Ρ€ΠΎΠΊ Π½Π°ΠΊΠΎΠ½Π΅Ρ†-Ρ‚ΠΎ достиг поставлСнной Ρ†Π΅Π»ΠΈ, ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΎΠ½ Π½Π΅ справился с ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ Π·Π°Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΈ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π».

ΠžΠ±Ρ‹Ρ‡Π½ΠΎ «ВисСлица» заканчиваСтся, ΠΊΠΎΠ³Π΄Π° происходит ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… событий:

  • Π˜Π³Ρ€ΠΎΠΊ допустил ΡˆΠ΅ΡΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Ρ… Π΄ΠΎΠ³Π°Π΄ΠΎΠΊ, Ρ‡Ρ‚ΠΎ ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΎ Π΅Π³ΠΎ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹ΡˆΠ΅.
  • Π˜Π³Ρ€ΠΎΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΎΡ‚Π³Π°Π΄Π°Π» слово, ΠΈ, соотвСтствСнно, ΠΏΠΎΠ±Π΅Π΄ΠΈΠ».

Π£ вас ΠΈΠΌΠ΅ΡŽΡ‚ΡΡ Π΄Π²Π° условия для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, поэтому Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΈΡ… Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄. Π’Ρ‹ Π½Π°Π·ΠΎΠ²Π΅Ρ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ .is_over(), ΠΈ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΠΈΠΉ True ΠΈΠ»ΠΈ False.

НиТС прСдставлСна Π΅Π³ΠΎ рСализация:

# ...

class Hangman:
    # ...

    def process_event(self, event):
        # ...

    def is_over(self):
        return any(
            [
                self._wrong_guesses == MAX_WRONG_GUESSES,
                set(self._target_word) <= self._guessed_letters,
            ]
        )

    # ...

Π’Ρ‹ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ количСство Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΎΡ‡Π΅Π½ΡŒ просто. Π£ вас ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ константа MAX_WRONG_GUESSES. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π²Π°ΠΌ остаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ€Π°Π²Π½ΠΎ Π»ΠΈ количСство Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… Π΄ΠΎΠ³Π°Π΄ΠΎΠΊ этому Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ этой Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΎΠ³ΠΎ, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ ΡƒΠ³Π°Π΄Π°Π» слово, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒ нСбольшого коммСнтария. Если Π²Ρ‹ ΠΈΠ³Ρ€Π°Π΅Ρ‚Π΅ Π² висСлицу Π½Π° доскС, Ρ‚ΠΎ Π²Π΅Π΄ΡƒΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° слово Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΎ Π²Π΅Ρ€Π½ΠΎ ΠΎΡ‚Π³Π°Π΄Π°Π½ΠΎ. Однако ваш графичСский интСрфСйс Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ этого ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Он Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π±ΡƒΠΊΠ²Ρƒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

ИмСнно здСсь Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ класс мноТСств. Он ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ Π»ΡŽΠ±ΡƒΡŽ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π³Ρ€ΡƒΠΏΠΏΡ‹. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π² массивС Π΄Π°Π½Π½Ρ‹Ρ… ΡƒΠ½ΠΈΠΊΠ°Π»Π΅Π½, ΠΎΠ½ создаСт мноТСство, состоящСС ΠΈΠ· Π±ΡƒΠΊΠ², ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ΅ слово, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΠΎΠ².

Π—Π°Ρ‚Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° <= Π²Ρ‹ сравниваСтС этот массив с мноТСством, содСрТащим ΠΎΡ‚Π³Π°Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠΊΠ²Ρ‹. Π­Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ провСряСт, являСтся Π»ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ элСмСнт Π»Π΅Π²ΠΎΠ³ΠΎ списка Ρ‡Π»Π΅Π½ΠΎΠΌ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ мноТСства. Если это Ρ‚Π°ΠΊ – Π·Π½Π°Ρ‡ΠΈΡ‚, ΠΈΠ³Ρ€ΠΎΠΊ ΠΎΡ‚Π³Π°Π΄Π°Π» всС Π±ΡƒΠΊΠ²Ρ‹, Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ² Π²Ρ‚ΠΎΡ€ΠΎΠ΅ условиС.

ВстроСнная функция any() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True, Ссли хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎ ΠΈΠ· пСрСчислСнных условий истинно. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΎΠ½Π° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ False.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ .is_over() зависит ΠΎΡ‚ Ρ…ΠΎΠ΄Π° ΠΈΠ³Ρ€ΠΎΠΊΠ°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΌΠ΅Ρ‚ΠΎΠ΄ для управлСния Ρ†ΠΈΠΊΠ»ΠΎΠΌ событий ΠΈΠ³Ρ€Ρ‹.

ОбновлСниС Ρ†ΠΈΠΊΠ»Π° событий ΠΈ запуск ΠΈΠ³Ρ€Ρ‹

Π”ΠΎ этого ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π²Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π»ΠΈ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ написанию ΠΊΠΎΠ΄Π°. Π’Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π»ΠΈ Π»ΠΎΠ³ΠΈΠΊΡƒ висСлицы ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ Π΅Π΅ ΠΊ графичСскому интСрфСйсу Π½Π° основС PySimpleGUI. Однако Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ вСсь этот ΠΊΠΎΠ΄ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΈΠ³Ρ€Π΅. Π’Ρ‹ сдСлаСтС это Π² ΠΎΠ±Ρ‰Π΅ΠΌ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΌ Ρ†ΠΈΠΊΠ»Π΅.

ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Π³Π»Π°Π²Π½Ρ‹ΠΉ Ρ†ΠΈΠΊΠ», ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄Π΅:

# ...

if __name__ == "__main__":
    game = Hangman()
    # Event loop
    while not game.is_over():
        event_id = game.read_event()
        if event_id in {sg.WIN_CLOSED}:
            break
        game.process_event(event_id)
    game.close()

Π’ Π½ΠΎΠ²ΠΎΠΉ вСрсии Ρ†ΠΈΠΊΠ»Π° событий вашСй ΠΈΠ³Ρ€Ρ‹ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ .is_over() для управлСния ΠΈΠΌ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ†ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ соблюдСно ΠΎΠ΄Π½ΠΎ ΠΈΠ· условий Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΠ³Ρ€Ρ‹. Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ†ΠΈΠΊΠ»Π° Π²Ρ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ .process_event() с ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ дСйствия Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠΈ с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° ΠΈ Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ΅ слово Π½Π°ΠΊΠΎΠ½Π΅Ρ†-Ρ‚ΠΎ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ. Π’Ρ‹ Π΄Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ свой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΌΠ°Ρ‚Ρ‡. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠΈ «Новая ΠΈΠ³Ρ€Π°Β» ΠΈ Β«ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΒ» Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‚.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΊΠ½ΠΎΠΏΠΊΠΈ с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ Π½Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ графичСского интСрфСйса ΠΏΠΎ Ρ†Π²Π΅Ρ‚Ρƒ Ρ„ΠΎΠ½Π°. Однако, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π½Π°Π²ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° Π½ΠΈΡ… курсор, ΠΎΠ½ΠΈ автоматичСски ΠΏΠΎΠ΄ΡΠ²Π΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ, сообщая ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° Π½ΠΈΡ… Π½Π°ΠΆΠ°Ρ‚ΡŒ. Если Π²Ρ‹ ΡƒΠΆΠ΅ Ρ‰Π΅Π»ΠΊΠ½ΡƒΠ»ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π±ΡƒΠΊΠ²Π΅Π½Π½ΠΎΠΉ ΠΊΠ½ΠΎΠΏΠΊΠ΅, Ρ‚ΠΎ ΠΎΠ½Π° становится Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ, ΠΈ ΠΏΡ€ΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈ Π½Π° Π½Π΅Π΅ указатСля ΠΌΡ‹ΡˆΠΈ – Ρ†Π²Π΅Ρ‚ большС Π½Π΅ мСняСтся.

Π¨Π°Π³ 6: ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΈΠ³Ρ€Ρ‹

На этом шагС Ρƒ вас ΡƒΠΆΠ΅ имССтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ ΠΈΠ³Ρ€Π° «ВисСлица». Π’ Π½Π΅ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π³Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ слово, наТимая Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ. Кнопки «Новая ΠΈΠ³Ρ€Π°Β» ΠΈ Β«ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΒ» Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚. Однако ΠΈΠ³Ρ€Π° автоматичСски закрываСтся, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚Π΅ ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚Π΅ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΌΠ°Ρ‚Ρ‡. Π­Ρ‚ΠΎ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ приятно, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄Π°Ρ‚ΡŒ своСй ΠΈΠ³Ρ€Π΅ «ВисСлица» Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ условия Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° ΠΈ ΡΠΎΠΎΠ±Ρ‰ΠΈΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΡƒ ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅. Π’Π°ΠΊΠΆΠ΅ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Π΄Π°Ρ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ нСсколько Ρ€Π°ΡƒΠ½Π΄ΠΎΠ², показывая ΠΏΡ€ΠΈ этом суммарныС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Для Π½Π°Ρ‡Π°Π»Π° Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚Π΅ побСдитСля ΠΈ Π΄Π°Π΄ΠΈΡ‚Π΅ ΠΈΠ³Ρ€ΠΎΠΊΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Ρ€Π°Π·.

ΠžΠΏΡΡ‚ΡŒ ΠΆΠ΅, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ для этого шага ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² ΠΏΠ°ΠΏΠΊΡƒ source_code_step_6/.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ побСдитСля ΠΈ повторная ΠΈΠ³Ρ€Π°

Π’ вашСй ΠΈΠ³Ρ€Π΅ «ВисСлица» ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π΅Ρ‚ ΠΈΠ³Ρ€ΠΎΠΊ, ΠΎΡ‚Π³Π°Π΄Π°Π²ΡˆΠΈΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ слово Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ сдСлано ΡˆΠ΅ΡΡ‚ΡŒ Π½Π΅Π²Π΅Ρ€Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π’ этом случаС Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ·Π΄Ρ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сообщСниС, ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΎ ΠΏΠΎΠ±Π΅Π΄Π΅. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π» ΠΌΠ°Ρ‚Ρ‡.

НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ .check_winner(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ условиС ΠΏΠΎΠ±Π΅Π΄Ρ‹ ΠΈ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ с ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ для ΠΈΠ³Ρ€ΠΎΠΊΠ°:

# ...

class Hangman:
    # ...

    def is_over(self):
        # ...

    def check_winner(self):
        if self._wrong_guesses < MAX_WRONG_GUESSES:
            answer = sg.PopupYesNo(
                "You've won! Congratulations!\n"
                "Another round?",
                title="Winner!",
            )
        else:
            answer = sg.PopupYesNo(
                f"You've lost! The word was '{self._target_word}'.\n"
                "Another round?",
                title="Sorry!",
            )
        self.quit = answer == "No"
        if not self.quit:
            self._new_game()

    # ...

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ .check_winner() Π²Ρ‹ провСряСтС, Π½Π΅ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π»ΠΈ количСство Π½Π΅Π²Π΅Ρ€Π½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ максимальноС число допустимого значСния – 6. ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это число соотвСтствуСт количСству элСмСнтов Π½Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ повСшСнного Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. Если условиС истинно, Ρ‚ΠΎ ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹ΠΈΠ³Ρ€Π°Π», ΠΈ Π²Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚Π΅ ΠΏΠΎΠ·Π΄Ρ€Π°Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ сообщСниС Π²ΠΎ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ ΠΎΠΊΠ½Π΅.

Если условиС Π»ΠΎΠΆΠ½ΠΎ, Ρ‚ΠΎ Π²Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚Π΅ Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΎΠΊΠ½ΠΎ, ΡΠΎΠΎΠ±Ρ‰Π°ΡŽΡ‰Π΅Π΅ ΠΈΠ³Ρ€ΠΎΠΊΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΏΡ€ΠΎΠΈΠ³Ρ€Π°Π». Π’ Π½Π΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ содСрТится информация ΠΎ Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠΌ словС.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΎΠ±Π° Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΎΠΊΠ½Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ ΠΎΡ‚Π³Π°Π΄Π°Π²ΡˆΠ΅ΠΌΡƒ ΠΈΠ³Ρ€ΠΎΠΊΡƒ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°ΡƒΠ½Π΄. ПослС выполнСния условия Π²Ρ‹ присваиваСтС Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρƒ .quit логичСскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ зависит ΠΎΡ‚ ΠΎΡ‚Π²Π΅Ρ‚Π° ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΎ готовности ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Ρ€Π°ΡƒΠ½Π΄.

Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ .quit Ρ€Π°Π²Π½ΠΎ False, Ρ‚ΠΎ Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ ._new_game(), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π·Π°Π³Π°Π΄Π°Π½Π½ΠΎΠ΅ слово ΠΈ Π½Π°Ρ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ Π² висСлицу.

Π§Ρ‚ΠΎΠ±Ρ‹ этот ΠΊΠΎΠ΄ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π», Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ .quit Π² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ класса Hangman:

# ...

class Hangman:
    def __init__(self):
        # ...
        self._new_game()
        self.quit = False

    # ...

Π­Ρ‚Π° новая строка ΠΊΠΎΠ΄Π° добавляСт Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ .quit Π² Hangman. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ False. Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° всС эти измСнСния внСсСны, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ†ΠΈΠΊΠ» ΠΈΠ³Ρ€Ρ‹. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ мноТСством Ρ€Π°ΡƒΠ½Π΄ΠΎΠ², Π²Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ Ρ†ΠΈΠΊΠ» событий Π²ΠΎ внСшний Ρ†ΠΈΠΊΠ», связанный с Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ΠΎΠΌ .quit:

# ...

if __name__ == "__main__":
    game = Hangman()
    # Rounds
    while not game.quit:
        # Event loop
        while not game.is_over():
            event_id = game.read_event()
            if event_id in {sg.WIN_CLOSED, "-QUIT-"}:
                game.quit = True
                break
            game.process_event(event_id)

        if not game.quit:
            game.check_winner()

    game.close()

Π’ этом ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π²Ρ‹ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚Π΅ Ρ†ΠΈΠΊΠ» событий Π²ΠΎ внСшний Ρ†ΠΈΠΊΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позаботится ΠΎΠ± ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°ΡƒΠ½Π΄ΠΎΠ² ΠΈΠ³Ρ€Ρ‹ Π² висСлицу. Π­Ρ‚ΠΎΡ‚ внСшний Ρ†ΠΈΠΊΠ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ .quit Π² процСссС выполнСния условий. Π¦ΠΈΠΊΠ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡ‚ΡŒΡΡ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΈΠ³Ρ€ΠΎΠΊ Π½Π΅ Π·Π°ΠΊΡ€ΠΎΠ΅Ρ‚ ΠΎΠΊΠ½ΠΎ ΠΈΠ³Ρ€Ρ‹ ΠΈΠ»ΠΈ Π½Π΅ Π½Π°ΠΆΠΌΠ΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«Π’Ρ‹Ρ…ΠΎΠ΄Β». Π’ этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ .quit станСт True, Π° условиС Ρ†ΠΈΠΊΠ»Π° – false.

Π”Π²Π΅ прСдпослСдниС строки Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π² сСбя условный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ провСряСт, Π²Ρ‹ΡˆΠ΅Π» Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ ΠΈΠ· ΠΈΠ³Ρ€Ρ‹. Если это Ρ‚Π°ΠΊ, Ρ‚ΠΎΠ³Π΄Π° Π²Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π΅Ρ‚Π΅ΡΡŒ ΠΊ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ .check_winner().

Когда Π²Ρ‹ ΡƒΠ³Π°Π΄Ρ‹Π²Π°Π΅Ρ‚Π΅ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ слово, ΠΈΠ³Ρ€Π° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ сообщСниС ΠΎ вашСй ΠΏΠΎΠ±Π΅Π΄Π΅ ΠΈ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ°Π΅Ρ‚ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΌΠ°Ρ‚Ρ‡. Если Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ Β«Π”Π°Β», Ρ‚ΠΎ ΠΈΠ³Ρ€Π° Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ подходящСС слово, ΠΈ Π²Ρ‹ смоТСтС Π½Π°Ρ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ Ρ€Π°ΡƒΠ½Π΄. Если Π²Ρ‹ Π½Π°ΠΆΠΌΠ΅Ρ‚Π΅ ΠΊΠ½ΠΎΠΏΠΊΡƒ «НСт», Ρ‚ΠΎ ΠΈΠ³Ρ€Π° Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅!

Π’Π΅Π΄Π΅Π½ΠΈΠ΅ счСта ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΡ‚ΠΎ ΠΏΠΎΠ±Π΅Π΄ΠΈΠ» Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ³Ρ€Π΅! Но Ρ‡Ρ‚ΠΎ, Ссли ваш ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π·Π°Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΠΌΠ΅Ρ€ΠΈΡ‚ΡŒΡΡ силами с ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ Π² ΠΈΠ³Ρ€Π΅ Β«Π›ΡƒΡ‡ΡˆΠΈΠΉ ΠΈΠ· Ρ‚Ρ€Π΅Ρ…Β»? Π’Π΅Π΄Π΅Π½ΠΈΠ΅ счСта ΠΈΠ³Ρ€ΠΎΠΊΠ° Π½Π° протяТСнии Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°ΡƒΠ½Π΄ΠΎΠ² – Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° интСрСсная функция Π² ΠΈΠ³Ρ€Π΅ «ВисСлица». Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΈ Π²Ρ‹ΠΈΠ³Ρ€Π°Π½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Ρ‚ΠΈΠΈ. Π˜Ρ‚Π°ΠΊ, Π²Π°ΠΌ потрСбуСтся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Π²Π° Π½ΠΎΠ²Ρ‹Ρ… Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°:

# ...

class Hangman:
    def __init__(self):
        # ...
        self.quit = False
        self._played_games = 0
        self._won_games = 0

    # ...

Π­Ρ‚ΠΈ Π΄Π²Π° Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ количСство сыгранных ΠΈΠ³Ρ€, Π° Ρ‚Π°ΠΊΠΆΠ΅ число ΠΏΠΎΠ±Π΅Π΄ Π² Π½ΠΈΡ…. Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ этой Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Для этого Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ .check_winner(), ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Π΅ ΠΊΠΎΠ΄Π°:

# ...

class Hangman:
    # ...

    def check_winner(self):
        self._played_games += 1
        if self._wrong_guesses < MAX_WRONG_GUESSES:
            self._won_games += 1
            answer = sg.PopupYesNo(
                "You've won! Congratulations!\n"
                f"That's {self._won_games} out of {self._played_games}!\n"
                "Another round?",
                title="Winner!",
            )
        else:
            answer = sg.PopupYesNo(
                f"You've lost! The word was '{self._target_word}'.\n"
                f"That's {self._won_games} out of {self._played_games}!\n"
                "Another round?",
                title="Sorry!",
            )
        self.quit = answer == "No"
        if not self.quit:
            self._new_game()

    # ...

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΉ строкС .check_winner() Π²Ρ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚Π΅ количСство сыгранных ΠΈΠ³Ρ€ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄ΠΎΠ±Π°Π²ΠΎΡ‡Π½ΠΎΠ³ΠΎ присваивания. Π’ условии if Π²Ρ‹ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚Π΅ количСство Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ΅ΠΉ. Π­Ρ‚ΠΈ Π΄Π²Π° счСтчика ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π·Π°Ρ‚Π΅ΠΌ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ Π² сообщСниС, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΠΎΠ΅ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰ΠΈΡ… ΠΎΠΊΠΎΠ½.

Π’Π°ΡˆΠ° ΠΈΠ³Ρ€Π° «ВисСлица» Π³ΠΎΡ‚ΠΎΠ²Π° ΠΊ Ρ‡Π΅ΠΌΠΏΠΈΠΎΠ½Π°Ρ‚Ρƒ! Она позволяСт ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ нСсколько Ρ€Π°ΡƒΠ½Π΄ΠΎΠ², Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²Π΅Π΄Π΅Ρ‚ подсчСт ΠΎΡ‡ΠΊΠΎΠ² ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅Ρ‚ ΠΎ Π²Π°ΡˆΠΈΡ… Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ…. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅, Π° Π·Π°Ρ‚Π΅ΠΌ пригласитС Π΄Ρ€ΡƒΠ·Π΅ΠΉ!

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ свой ΠΊΠΎΠ΄: НаТмитС здСсь, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ бСсплатный исходный ΠΊΠΎΠ΄ Python для вашСй ΠΈΠ³Ρ€Ρ‹ Π² висСлицу PySimpleGUI.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ³Ρ€Ρ‹ «ВисСлица» с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Python ΠΈ PySimpleGUI – это ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ способ развития Π½Π°Π²Ρ‹ΠΊΠΎΠ² программирования, изучСния Π½ΠΎΠ²Ρ‹Ρ… Ρ‚Π΅Ρ…Π½ΠΈΠΊ ΠΈ знакомства с ΠΌΠΈΡ€ΠΎΠΌ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… ΠΈΠ³Ρ€ Π½Π° Π±Π°Π·Π΅ GUI. Написав ΠΈΠ³Ρ€Ρƒ Π½Π° Python, Π²Ρ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ нСсколько Π·Π°Π΄Π°Ρ‡ ΠΏΠΎ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ ΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½Ρƒ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ созданиС подходящСго графичСского интСрфСйса, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… дСйствий, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ интСрфСйса ΠΈΠ³Ρ€Ρ‹ Π² зависимости ΠΎΡ‚ Π΅Π΅ состояния.

Π’ этом руководствС Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ, ΠΊΠ°ΠΊ:

  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ PySimpleGUI ΠΏΡ€ΠΈ создании графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для ΠΈΠ³Ρ€Ρ‹ Π² висСлицу
  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ³Ρ€Ρ‹ Π² висСлицу Π½Π° Python
  • Π‘Π²ΡΠ·Ρ‹Π²Π°Ρ‚ΡŒ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΈΠ³Ρ€Ρ‹ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ графичСского интСрфСйса ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ
  • ΠžΡ†Π΅Π½ΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈΠ³Ρ€Ρ‹ ΠΈ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρƒ вас Π΅ΡΡ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ инструмСнты ΠΈ Π½Π°Π²Ρ‹ΠΊΠΈ, благодаря ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΈ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ свою ΠΈΠ³Ρ€Ρƒ «ВисСлица». Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°Π½ΡΡ‚ΡŒΡΡ созданиСм Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΈΠ³Ρ€.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Π΄ своСй ΠΈΠ³Ρ€ΠΎΠΉ «ВисСлица», Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ шаг Π²ΠΏΠ΅Ρ€Π΅Π΄, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π² нСсколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π‘Π°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½ΠΎΠ²Ρ‹Ρ… элСмСнтов ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ ΠΎΡΠ²ΠΎΠΈΡ‚ΡŒ ряд интСрСсных Ρ‚Π΅ΠΌ.

ΠŸΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ Π²Π°ΠΌ нСсколько ΠΈΠ΄Π΅ΠΉ:

  • ИспользованиС спСциализированных списков слов: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΈΠ³Ρ€Ρƒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ списки слов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ подходящий Π² зависимости ΠΎΡ‚ Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΈ Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠΉ.
  • Настройка ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ слоТности: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π³Π°Π΄Π°Π½Π½Ρ‹Π΅ слова ΠΏΠΎ ΡƒΡ€ΠΎΠ²Π½ΡŽ слоТности, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Π΄Π»ΠΈΠ½Π΅ слова ΠΈ Π΅Π³ΠΎ распространСнности, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.
  • ИспользованиС иностранных слов: ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ списки слов Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… языках, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ³Ρ€ΠΎΠΊΠΈ ΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свои лингвистичСскиС Π½Π°Π²Ρ‹ΠΊΠΈ.
  • Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π·Π²ΡƒΠΊΠΎΠ²Ρ‹Ρ… эффСктов: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΠΈΠ³Ρ€Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π·Π²ΡƒΠΊΠΎΠ²Ρ‹Π΅ эффСкты, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π°ΠΊΡ†Π΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹Ρ… дСйствиях.
  • Настройка Ρ†Π²Π΅Ρ‚Π° Ρ„ΠΎΠ½Π° ΠΊΠ½ΠΎΠΏΠΎΠΊ с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ: Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° для Ρ‚Π΅Ρ… ΠΊΠ½ΠΎΠΏΠΎΠΊ с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ³Ρ€ΠΎΠΊ ΡƒΠΆΠ΅ Π½Π°ΠΆΠΈΠΌΠ°Π». Π’Π°ΠΊΠΎΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ обСспСчит Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ подсказку для ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ Π΅Π³ΠΎ ΠΎΠ±Ρ‰Π΅Π΅ прСдставлСниС ΠΎΠ± ΠΈΠ³Ρ€Π΅.
***

Π§Π΅ΠΌ Π²Ρ‹ Π·Π°ΠΉΠΌΠ΅Ρ‚Π΅ΡΡŒ дальшС? ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚Π΅ΡΡŒ своими идСями Π² коммСнтариях!

Π‘Ρ‚Π°Ρ‚ΡŒΠΈ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•

admin
11 дСкабря 2018

ООП Π½Π° Python: ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python допускаСт Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΠΈ, Π½ΠΎ Π² Π΅Π³ΠΎ основС...
admin
28 июня 2018

3 самых Π²Π°ΠΆΠ½Ρ‹Ρ… сфСры примСнСния Python: возмоТности языка

БущСствуСт мноТСство областСй примСнСния Python, Π½ΠΎ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΎΠ½ особСнно...
admin
13 фСвраля 2017

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python: ΠΎΡ‚ Π½ΠΎΠ²ΠΈΡ‡ΠΊΠ° Π΄ΠΎ профСссионала

Пошаговая инструкция для всСх, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒΒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Python...