Π Π°Π·Π½ΠΎΠ΅

Python крСстики Π½ΠΎΠ»ΠΈΠΊΠΈ: Π˜Π³Ρ€Π° крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ Π½Π° Python 3 β€” ΠŸΡ€ΠΈΠΌΠ΅Ρ€ написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с графичСским интСрфСйсом

Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

Π˜Π³Ρ€Π° крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ Π½Π° Python 3 β€” ΠŸΡ€ΠΈΠΌΠ΅Ρ€ написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с графичСским интСрфСйсом

ΠžΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π² цСлях изучСния языка программирования Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° Π½Π΅ΠΌ нСсколько простых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ прСдставим ΠΈΠ³Ρ€Ρƒ крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ, которая написана Π½Π° Python 3 с графичСским интСрфСйсом.

О ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅

Π’ этой ΠΈΠ³Ρ€Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Ρ€ΠΈΡ‚ΡŒΡΡ силами с ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ…ΠΎΠ΄ Π·Π° ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ. Но ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚ΡŒ искусствСнный ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ Π² этом противостоянии Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ ΠΈ просто. ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Β«Π·Π΅Π²ΠΊΠΎΠ²Β» ΠΈ Ссли Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ шанс ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚ΡŒ, ΠΎΠ½ Π½Π΅ΠΏΡ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠΌ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

Π’Π½ΠΈΠ·Ρƒ располоТСна ΠΊΠ½ΠΎΠΏΠΊΠ° для Π½Π°Ρ‡Π°Π»Π° Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹. По Π΅Ρ‘ Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ очистится ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ Π·Π°Π½ΠΎΠ²ΠΎ.

Π˜Π³Ρ€ΠΎΠΊ ставит крСстики, Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π½ΠΎΠ»ΠΈΠΊΠΈ. Как всСгда, ΠΏΠΎΠ±Π΅ΠΆΠ΄Π°Π΅Ρ‚ Ρ‚ΠΎΡ‚, ΠΊΡ‚ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ составит линию ΠΈΠ· своих символов: ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ, Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ ΠΈΠ»ΠΈ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ.

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ объявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…

Для отобраТСния Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Tkinter, которая устанавливаСтся вмСстС с Python. Π’Π°ΠΊ ΠΆΠ΅ Π½Π°ΠΌ потрСбуСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° random для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ случайныС числа, благодаря ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Ρ…ΠΎΠ΄Ρ‹ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½Ρ‹ΠΌΠΈ.

Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ стандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Python. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ Π½Π°Π΄ΠΎ. ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ ΠΈΡ… с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ import. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΎΠΊΠ½ΠΎ root, устанавливаСм Π΅ΠΌΡƒ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΈ объявляСм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

  • game_run – Π² эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π±ΡƒΠ΄Π΅ΠΌ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ False ΠΏΡ€ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ ΠΈΠ³Ρ€Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ…ΠΎΠ΄Ρ‹ ΠΊΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ выявлСн ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ.
  • field – это Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π²ΡƒΠΌΠ΅Ρ€Π½Ρ‹ΠΉ список, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ поля. Π₯ΠΎΠ΄ΠΎΠΌ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ надписи Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ Π½Π° символ Β«XΒ» ΠΈΠ»ΠΈ Β«OΒ».
  • cross_count Π² этой ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ количСство крСстиков Π½Π° ΠΏΠΎΠ»Π΅. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎ Π²Ρ‹ΡΡ‚Π°Π²Π»Π΅Π½ΠΈΡŽ пятого крСстика, Π² случаС Ссли Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π²Ρ‹ΠΈΠ³Ρ€Π°Π» Ρ„ΠΈΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΈΡ‡ΡŒΡŽ.
from tkinter import *
import random
root = Tk()
root.title('Criss-cross')
game_run = True
field = []
cross_count = 0

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° наТатия ΠΊΠ½ΠΎΠΏΠΎΠΊ

Ѐункция new_game Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π°Ρ‡Π°Π»Π° Π½ΠΎΠ²ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹. На ΠΏΠΎΠ»Π΅ ΡƒΠ±ΠΈΡ€Π°ΡŽΡ‚ΡΡ всС крСстики ΠΈ Π½ΠΎΠ»ΠΈΠΊΠΈ. Π¦Π²Π΅Ρ‚ ΠΊΠ½ΠΎΠΏΠΎΠΊ Π΄Π΅Π»Π°Π΅ΠΌ Π±Π»Π΅Π΄Π½ΠΎ-Π»ΠΈΠ»ΠΎΠ²Ρ‹ΠΌ. УстанавливаСм Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ game_run ΠΈ cross_count Π² Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Π΅ значСния. Π­Ρ‚ΠΎ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ пытаСмся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΎΠΉ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π² Python Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово global.

def new_game():
    for row in range(3):
        for col in range(3):
            field[row][col]['text'] = ' '
            field[row][col]['background'] = 'lavender'
    global game_run
    game_run = True
    global cross_count
    cross_count = 0

Ѐункция click Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ послС наТатия Π½Π° ΠΏΠΎΠ»Π΅, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ крСстик. Если ΠΈΠ³Ρ€Π° Π΅Ρ‰Π΅ Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°, Ρ‚ΠΎ крСстик ставится. ПослС этого ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅ΠΌ счСтчик количСства выставлСнных крСстиков.

ΠŸΠΎΡ‚ΠΎΠΌ провСряСм с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ check_win, Π½Π΅ ΠΏΠΎΠ±Π΅Π΄ΠΈΠ»ΠΈ Π»ΠΈ ΠΌΡ‹ этим Ρ…ΠΎΠ΄ΠΎΠΌ. Если Π΅Ρ‰Π΅ Π½Π΅ выявлСн ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ ΠΈ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ Ρ…ΠΎΠ΄Ρ‹, Ρ‚ΠΎ выполняСт Ρ…ΠΎΠ΄ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ computer_move, ΠΈ Ρ‚Π°ΠΊΠΆΠ΅ послС Ρ…ΠΎΠ΄Π° ΠΈΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ°.

def click(row, col):
    if game_run and field[row][col]['text'] == ' ':
        field[row][col]['text'] = 'X'
        global cross_count
        cross_count += 1
        check_win('X')
        if game_run and cross_count < 5:
            computer_move()
            check_win('O')

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠΎΠ±Π΅Π΄Ρ‹

Ѐункция check_win осущСствляСт ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ°. Она ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°Π΅Ρ‚ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»Π΅ΠΉ, ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΠΈΡ… линию ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ с Π½ΠΈΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ check_line. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ smb – это символ Β«XΒ» ΠΈΠ»ΠΈ Β«OΒ», Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ крСстики ΠΈΠ»ΠΈ Π½ΠΎΠ»ΠΈΠΊΠΈ. Если Π·Π°Π΄Π°Π½ Β«OΒ», Ρ‚ΠΎ провСряСтся: Π½Π΅ ΠΏΠΎΠ±Π΅Π΄ΠΈΠ» Π»ΠΈ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€.

Если зафиксирован Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ, Ρ‚ΠΎ мСняСм Ρ†Π²Π΅Ρ‚ Ρ„ΠΎΠ½Π° ΠΊΠ½ΠΎΠΏΠΎΠΊ, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ… линию Π½Π° Ρ€ΠΎΠ·ΠΎΠ²Ρ‹ΠΉ. А Ρ‚Π°ΠΊΠΆΠ΅ записываСм Π² game_run Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ False.

def check_win(smb):
    for n in range(3):
        check_line(field[n][0], field[n][1], field[n][2], smb)
        check_line(field[0][n], field[1][n], field[2][n], smb)
    check_line(field[0][0], field[1][1], field[2][2], smb)
    check_line(field[2][0], field[1][1], field[0][2], smb)

def check_line(a1,a2,a3,smb):
    if a1['text'] == smb and a2['text'] == smb and a3['text'] == smb:
        a1['background'] = a2['background'] = a3['background'] = 'pink'
        global game_run
        game_run = False

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ тСорСтичСски ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ΄Π½ΠΈΠΌ Ρ…ΠΎΠ΄ΠΎΠΌ ΡΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сразу 2 Π»ΠΈΠ½ΠΈΠΈ.

ДСйствия ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°

Π₯ΠΎΠ΄ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° рассчитываСтся Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ computer_move. Алгоритм Π΅Π³ΠΎ дСйствий ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

  1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° возмоТности ΠΏΠΎΠ±Π΅Π΄Ρ‹. Если ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ прСдставился шанс ΠΏΠΎΠ±Π΅Π΄Ρ‹ – ΠΎΠ½ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΅Π³ΠΎ ΡƒΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ. Π‘Ρ€Π°Π·Ρƒ ΠΆΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠΎΠ±Π΅Π΄Ρƒ.
  2. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ ΠΏΠΎΠ±Π΅Π΄Ρ‹ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΈΠΊΠ° Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ…ΠΎΠ΄. Если ΠΈΠ³Ρ€ΠΎΠΊ выставил Π΄Π²Π° крСстика Π² ряд, ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ пытаСтся Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ ΠΏΠ»Π°Π½Ρ‹ ΠΈΠ³Ρ€ΠΎΠΊΠ°.
  3. Π‘Π»ΡƒΡ‡Π°ΠΉΠ½Ρ‹ΠΉ Ρ…ΠΎΠ΄. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚ΡŒ Π½Π΅Ρ‚ возмоТности ΠΈ Π½Π΅Ρ‚ ΡƒΠ³Ρ€ΠΎΠ·Ρ‹ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹ΡˆΠ°, Ρ‚ΠΎ выбираСтся случайноС свободноС ΠΏΠΎΠ»Π΅. Π’ бСсконСчном Ρ†ΠΈΠΊΠ»Π΅ wile ΠΏΠ΅Ρ€Π΅Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ случайныС числа, ΠΏΠΎΠΊΠ° ΠΎΠ½ΠΈ Π½Π΅ Π²Ρ‹ΠΏΠ°Π΄ΡƒΡ‚ Π½Π° Π½Π΅ занятоС ΠΏΠΎΠ»Π΅.
def can_win(a1,a2,a3,smb):
    res = False
    if a1['text'] == smb and a2['text'] == smb and a3['text'] == ' ':
        a3['text'] = 'O'
        res = True
    if a1['text'] == smb and a2['text'] == ' ' and a3['text'] == smb:
        a2['text'] = 'O'
        res = True
    if a1['text'] == ' ' and a2['text'] == smb and a3['text'] == smb:
        a1['text'] = 'O'
        res = True
    return res

def computer_move():
    for n in range(3):
        if can_win(field[n][0], field[n][1], field[n][2], 'O'):
            return
        if can_win(field[0][n], field[1][n], field[2][n], 'O'):
            return
    if can_win(field[0][0], field[1][1], field[2][2], 'O'):
        return
    if can_win(field[2][0], field[1][1], field[0][2], 'O'):
        return
    for n in range(3):
        if can_win(field[n][0], field[n][1], field[n][2], 'X'):
            return
        if can_win(field[0][n], field[1][n], field[2][n], 'X'):
            return
    if can_win(field[0][0], field[1][1], field[2][2], 'X'):
        return
    if can_win(field[2][0], field[1][1], field[0][2], 'X'):
        return
    while True:
        row = random.randint(0, 2)
        col = random.randint(0, 2)
        if field[row][col]['text'] == ' ':
            field[row][col]['text'] = 'O'
            break

ГрафичСский интСрфСйс

ВсС элСмСнты графичСского интСрфСйса ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠ° grid. Π’ Ρ†ΠΈΠΊΠ»Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ поля. Они Π±ΡƒΠ΄ΡƒΡ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² Π΄Π²ΡƒΠΌΠ΅Ρ€Π½ΠΎΠΌ список. Π’ языкС программирования Python Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ элСмСнты Π² список с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° append.

Бвойство colorspan Ρƒ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π½Π°Ρ‡Π°Π»Π° ΠΈΠ³Ρ€Ρ‹ выставляСм Π² 3, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π·Π°Π½ΠΈΠΌΠ°Π» всю ΡˆΠΈΡ€ΠΈΠ½Ρƒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

for row in range(3):
    line = []
    for col in range(3):
        button = Button(root, text=' ', width=4, height=2, 
                        font=('Verdana', 20, 'bold'),
                        background='lavender',
                        command=lambda row=row, col=col: click(row,col))
        button.grid(row=row, column=col, sticky='nsew')
        line.append(button)
    field.append(line)
new_button = Button(root, text='new game', command=new_game)
new_button.grid(row=3, column=0, columnspan=3, sticky='nsew')
root.mainloop()

Π˜Π³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΠΌΡ‹ Π΄Π΅Π»Π°Π»ΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΊΠ°ΠΊ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ΠΎΠΌ, Ρ€Π°Π·ΠΌΠ΅Ρ‰Ρ‘Π½Π½ΠΎΠΌ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅.

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

ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ Π½Π° Python (тСкстовый Π²Π°Ρ€ΠΈΠ°Π½Ρ‚)

БСгодня ΠΏΠ΅Ρ€Π΅Π΄ Π½Π°ΠΌΠΈ стоит Π·Π°Π΄Π°Ρ‡Π° Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ Π½Π° ΠΏΠΈΡ‚ΠΎΠ½Π΅. Напомним, Ρ‡Ρ‚ΠΎ крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ это логичСская ΠΈΠ³Ρ€Π° для Π΄Π²ΡƒΡ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π½Π° ΠΏΠΎΠ»Π΅ 3Ρ…3 ΠΊΠ»Π΅Ρ‚ΠΊΠΈ.

Для Π½Π°Ρ‡Π°Π»Π° Π·Π°Π΄Π°Π΄ΠΈΠΌ ΠΏΠΎΠ»Π΅. ПолС Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠΌΠ΅Ρ€Π½Ρ‹ΠΌ списком (list) с числами ΠΎΡ‚ 1 Π΄ΠΎ 9. Для создания Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ range()

board = range(1,10)

Π’Π΅ΠΏΠ΅Ρ€ΡŒ напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ нашС ΠΏΠΎΠ»Π΅ Π² ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅.

def draw_board(board):
    print "-------------"
    for i in range(3):
        print "|", board[0+i*3], "|", board[1+i*3], "|", board[2+i*3], "|"
        print "-------------"

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°

Π‘Π°ΠΌΠΎΠ΅ врСмя Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π½Π°ΡˆΡƒ ΠΈΠ³Ρ€Ρƒ. ПишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ take_input

def take_input(player_token):
	valid = False
	while not valid:
		player_answer = raw_input("ΠšΡƒΠ΄Π° поставим " + player_token+"? ")
		try:
			player_answer = int(player_answer)
		except:
			print "НСкоррСктный Π²Π²ΠΎΠ΄. Π’Ρ‹ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹, Ρ‡Ρ‚ΠΎ Π²Π²Π΅Π»ΠΈ число?"
            continue
		if player_answer >= 1 and player_answer <= 9:
			if (str(board[player_answer-1]) not in "XO"):
				board[player_answer-1] = player_token
				valid = True
			else:
				print "Π­Ρ‚Π° ΠΊΠ»Π΅Ρ‚ΠΎΡ‡ΠΊΠ° ΡƒΠΆΠ΅ занята"
		else:
			print "НСкоррСктный Π²Π²ΠΎΠ΄. Π’Π²Π΅Π΄ΠΈΡ‚Π΅ число ΠΎΡ‚ 1 Π΄ΠΎ 9 Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ."

Как Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, функция take_input ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ player_token — крСстик ΠΈΠ»ΠΈ Π½ΠΎΠ»ΠΈΠΊ, Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Π΅ΠΉ сСйчас Ρ…ΠΎΠ΄. Нам Π²Π°ΠΆΠ½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ числами ΠΎΡ‚ 1 Π΄ΠΎ 9. Для этого ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ конструкции try/except ΠΈ if/else, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ выбранная ΠΊΠ»Π΅Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π΅ занята. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ функция take_input Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ значСния, Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ измСняСт ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉΡΡ список board.

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ³ΠΎ поля. НазовСм эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ check_win.

def check_win(board):
	win_coord = ((0,1,2),(3,4,5),(6,7,8),(0,3,6),(1,4,7),(2,5,8),(0,4,8),(2,4,6))
	for each in win_coord:
		if board[each[0]] == board[each[1]] == board[each[2]]:
			return board[each[0]]
	return False 

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

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ собСрСм вмСстС всС описанныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

def main(board):
	counter = 0
	win = False
	while not win:
		draw_board(board)
		if counter % 2 == 0:
			take_input("X")
		else:
			take_input("O")
		counter += 1
		if counter > 4:
			tmp = check_win(board)
			if tmp:
				print tmp, "Π²Ρ‹ΠΈΠ³Ρ€Π°Π»!"
				win = True
				break
		if counter == 9:
			print "ΠΠΈΡ‡ΡŒΡ!"
			break
	draw_board(board)

Π Π°Π±ΠΎΡ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½ΠΎ понятна, Ρ€Π°Π·Π²Π΅ Ρ‡Ρ‚ΠΎ строки 45 ΠΈ 46 ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½Π΅ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅. ΠœΡ‹ ΠΆΠ΄Π΅ΠΌ ΠΊΠΎΠ³Π΄Π° пСрСмСнная counter станСт большС 4 для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ check_win (Π΄ΠΎ пятого Ρ…ΠΎΠ΄Π° Π½ΠΈΠΊΡ‚ΠΎ Ρ‚ΠΎΡ‡Π½ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΈΠ³Ρ€Π°Ρ‚ΡŒ). ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ tmp Π±Ρ‹Π»Π° создана ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ лишний Ρ€Π°Π· Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ check_win, ΠΌΡ‹ просто «Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ» Π΅Π΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈ ΠΏΡ€ΠΈ нСобходимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π½Π° строкС 48. Польза ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π½Π΅ Ρ‚Π°ΠΊ Π·Π°ΠΌΠ΅Ρ‚Π½Π° ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с нСбольшими объСмами Π΄Π°Π½Π½Ρ‹Ρ…, Π½ΠΎ Π² Ρ†Π΅Π»ΠΎΠΌ подобная экономия процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ — Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ спокойно ΠΈΠ³Ρ€Π°Ρ‚ΡŒ, запустив main(board)

Β 

И послСднСС ΡƒΡ‚ΠΎΡ‡Π½Π΅Π½ΠΈΠ΅. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρƒ вас ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π»ΠΈΡΡŒ символы ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Ρ‹ Π²ΡΡ‚Π°Π²ΡŒΡ‚Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π² самоС Π½Π°Ρ‡Π°Π»ΠΎ вашСго Ρ„Π°ΠΉΠ»Π°.

# -*- coding: utf-8 -*-

Β Π₯ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΈΠ³Ρ€Ρ‹!

PS. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΠ³Ρ€Ρ‹ крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ Π½Π° Python 3 Π½Π° github

Python: нСстандартныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π˜Π³Ρ€Π° β€œΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-нолики”.

ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΡƒΡ‡ΠΈΡ‚ΡŒ язык программирования ΠΏΠ°ΠΉΡ‚ΠΎΠ½ Python. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΡŽ 6 Π³Π»Π°Π²Ρ‹ β€œΠ€ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π˜Π³Ρ€Π° ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-нолики” ΠΏΠΎ ΠΊΠ½ΠΈΠ³Π΅: Майкл Доусон β€œΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΡƒΠ΅ΠΌ Π½Π° Python”, 2014 (Michael Dawson β€œPython Programming for the Absolute Beginner”, 3rd Edition), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ собствСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ.

Как ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ?

ΠžΠ±Ρ‰ΠΈΠΉ Π²ΠΈΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Python: Π½Π°Π·Π²Π°Π½ΠΈΠ΅_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ()

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½ΡƒΠΆΠ½ΠΎ Π΅Π΅ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ.

ΠžΠ±Ρ‰ΠΈΠΉ Π²ΠΈΠ΄ объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

def Π½Π°Π·Π²Π°Π½ΠΈΠ΅_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ(ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€1, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€2...):
Β  Β  '''Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ строка'''
Β  Β  Π‘Π»ΠΎΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚:

  • ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ значСния Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹,
  • Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ значСния Ρ‡Π΅Ρ€Π΅Π· return.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

β€” это имя ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² скобках послС названия Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚ объявлСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ значСния. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

ΠŸΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ нСсколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²:

def Π½Π°Π·Π²Π°Π½ΠΈΠ΅_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ(ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€1, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€2...):

Π’Ρ‹Π·ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ:

Π½Π°Π·Π²Π°Π½ΠΈΠ΅_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ('Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°1',Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°2...)

Π’Ρ‹Π·ΠΎΠ² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ (для Π½ΠΈΡ… Π½Π΅ Π²Π°ΠΆΠ΅Π½ порядок!):

Π½Π°Π·Π²Π°Π½ΠΈΠ΅_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ(ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€1='Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°1', ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€2=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°2,...)

равнозначно…

Π½Π°Π·Π²Π°Π½ΠΈΠ΅_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ(ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€2=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°2, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€1='Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°1',...)

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

def Π½Π°Π·Π²Π°Π½ΠΈΠ΅_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ(ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€1='Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅', ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€2=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅...):

Если ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌ Π½Π΅ присвоятся, Ρ‚ΠΎ отобразятся значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ, это Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для всСх ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² объявляСмой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΏΡ€ΠΈ Ρ‡Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π° Π½Π΅ всС сразу. НапримСр, Ρ‚Π°ΠΊ:

ОбъявлСниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ->

def Π½Π°Π·Π²Π°Π½ΠΈΠ΅_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ(ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€1='Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅', ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€2=Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅):

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ->

Π½Π°Π·Π²Π°Π½ΠΈΠ΅_Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ(ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€1='Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°1')

Ѐункция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ значСния

def vozvrat():
Β  Β  imya='kot'
Β  Β  return imya

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ:

def vozvrat():
    imya='kot'
    return imya
print('Π’ΠΎΠ·Π²Ρ€Π°Ρ‚: ', vozvrat())

Запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄Π°Π΅Ρ‚:

Π’ΠΎΠ·Π²Ρ€Π°Ρ‚:  kot
>>> 

МоТно Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ нСсколько Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· запись return p1,p2,p3...

Ѐункция main()

Основной ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π² глобальной Π·ΠΎΠ½Π΅ видимости, Π° ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π°Ρ‚ΡŒ любоС имя, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, main()

Π’ΠΎΠ³Π΄Π° ΠΊΠΎΠ΄ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

main()
input('НаТмитС Entr, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈ')

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ доступны Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π°ΠΌ. Π•ΡΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Π½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΏΡ€ΠΈ этом ΠΎΠ½ΠΈ доступны Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Ρ‚ΠΎΠΆΠ΅, Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для β€œΡ‡Ρ‚Π΅Π½ΠΈΡβ€, Ссли Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅.

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Π°Ρ пСрСмСнная β€” создаСтся Π² ΠΎΠ±Ρ‰Π΅ΠΉ области видимости.

Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ пСрСмСнная β€” создаСтся Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ИзмСнСниС глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΌΠ΅Π½ΡΡ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, Π½Π°Ρ…ΠΎΠ΄ΡΡΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, пишСм global

Если создана глобальная пСрСмСнная g_peremennaya, Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π΅Π΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ написав: global g_peremennaya

Π—Π°Ρ‚Π΅Π½Π΅Π½ΠΈΠ΅ глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ

Π’Π°ΠΊ ΠΊΠ°ΠΊ Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ нСльзя ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΈΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π­Ρ‚ΠΎ ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Ρ‚Π΅Π½Π΅Π½ΠΈΠ΅. Новая одноимСнная пСрСмСнная Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Но это вносит ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρƒ, Π»ΡƒΡ‡ΡˆΠ΅ Ρ‚Π°ΠΊ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ.

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ константы

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΌΡ‹ измСняСм ΠΏΠΎ Ρ…ΠΎΠ΄Ρƒ ΠΊΠΎΠ΄Π°. А константы β€” это ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, записанныС большими Π±ΡƒΠΊΠ²Π°ΠΌΠΈ (CONSTANTA), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π½Π΅ ΠΌΠ΅Π½ΡΡ‚ΡŒ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ случаС Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ константы, Ρ‡Π΅ΠΌ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

Π˜Π³Ρ€Π° β€œΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-нолики”

Π—Π°Π΄Π°Ρ‡Π°: Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ с ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ Π² крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ Π½Π° ΠΏΠΎΠ»Π΅ 3Ρ…3. Π‘Π½Π°Ρ‡Π°Π»Π° показываСтся инструкция ΠΊ ΠΈΠ³Ρ€Π΅. Π”Π°Π»Π΅Π΅ ΠΈΠ΄Π΅Ρ‚ Π²Ρ‹Π±ΠΎΡ€, ΠΊΡ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ. НачинаСтся ΠΈΠ³Ρ€Π°, ΠΈΠ³Ρ€ΠΎΠΊΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ Ρ…ΠΎΠ΄Ρ‹ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. Когда ΠΊΡ‚ΠΎ-Ρ‚ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ»ΠΈ ΠΈΠ³Ρ€Π° сыграна Π²Π½ΠΈΡ‡ΡŒΡŽ, выводятся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ.

НачнСм с создания собствСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ ΠΊ ΠΈΠ³Ρ€Π΅:

def instrukciya():
    print('''
ΠŸΡ€ΠΈΠ²Π΅Ρ‚! Π­Ρ‚ΠΎ ΠΈΠ³Ρ€Π° "ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ".
Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ…ΠΎΠ΄, Π²Π²Π΅Π΄ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ,
ΠΊΡƒΠ΄Π° Ρ…ΠΎΡ‡Π΅ΡˆΡŒ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ свой символ:

0 | 1 | 2
---------
3 | 4 | 5
---------
6 | 7 | 8


''')

Π˜Π³Ρ€Π° начинаСтся с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚, ΠΊΡ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ…ΠΎΠ΄. Для этого напишСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π·Π°Π΄Π°Π΅Ρ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ вопрос β€œΠ’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΡ‚ΠΎ сдСлаСт Ρ…ΠΎΠ΄ (ΠΈΠ³Ρ€Π°Ρ‚ΡŒ крСстиками)?”, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ β€œΠ΄Π°β€ ΠΈΠ»ΠΈ β€œΠ½Π΅Ρ‚β€. Π’ объявлСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π½Π° Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ вопрос, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ просто vopros, Π° ΠΏΠΎΡ‚ΠΎΠΌ ΠΏΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² скобках Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ любой тСкст.

Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот Π±Π»ΠΎΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, сначала объявим ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ вопрос ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΎΡ‚Π²Π΅Ρ‚ β€œΠ΄Π°β€ ΠΈΠ»ΠΈ β€œΠ½Π΅Ρ‚β€:

def nachalo(vopros):
    otvet=None
    while otvet not in ('Π΄Π°','Π½Π΅Ρ‚'):
        otvet=input(question).lower()
    return otvet

Вторая Ρ‡Π°ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ присваиваСт ΠΈΠ³Ρ€ΠΎΠΊΠ°ΠΌ Ρ‚ΠΈΠΏ Ρ„ΠΈΡˆΠ΅ΠΊ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΡ‚ΠΎ Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ, ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· ΡƒΠΆΠ΅ объявлСнной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ nachalo(vopros):

def fishki():
    perviy_hod=nachalo("Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΡ‚ΠΎ сдСлаСт Ρ…ΠΎΠ΄ \
(ΠΈΠ³Ρ€Π°Ρ‚ΡŒ крСстиками)?  ")
    if perviy_hod=='Π΄Π°':
        print('ОкСй, Ρ‚Ρ‹ ΠΈΠ³Ρ€Π°Π΅ΡˆΡŒ крСстиками!')
        human=Π₯
        comp=O
    else:
        print('ОК, я дСлаю ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ крСстиками')
        human=O
        comp=Π₯
    return human, comp

Π’ этих Π΄Π²ΡƒΡ… функциях ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π₯ ΠΈ O, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ ΠΈΡ… использовал Π² ΠΈΠ³Ρ€Π΅, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ввСсти эти ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π½Π° глобальном ΡƒΡ€ΠΎΠ²Π½Π΅. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚ X ΠΈ O:

Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎ Π·Π°Π΄Π°Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

X='X'
O='0'

Π”Π°Π»Π΅Π΅ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΏΡ€Π°ΡˆΠΈΠ²Π°Ρ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΡƒΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ свою Ρ„ΠΈΡˆΠΊΡƒ. ПолС Π±ΡƒΠ΄Π΅Ρ‚ 3Ρ…3 ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ полю условно даСтся свой Π½ΠΎΠΌΠ΅Ρ€ ΠΎΡ‚ 0 Π΄ΠΎ 8. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΡƒΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Π²Π΅Π΄Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ для своСго Ρ…ΠΎΠ΄Π°.

def hod(vopros,low,high):
    otvet=None
    while otvet not in range(low,high):
        otvet=int(input(vopros))
    return otvet

Π‘Π΄Π΅Π»Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Π΅ поля:

  • потрСбуСтся Π΄Π²Π΅ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ константы: RAZMER_DOSKI ΠΈ HODI
RAZMER_DOSKI=9 HODI=' '

Ѐункция, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· Π½ΠΎΠ²ΡƒΡŽ доску с Ρ…ΠΎΠ΄Π°ΠΌΠΈ выглядит Ρ‚Π°ΠΊ:

def new_doska():
    doska=[]
    for i in range(RAZMER-DOSKI):
        doska.append(HODI)
    return doska

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ доску с Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ…ΠΎΠ΄Π°:

def pokaz_doski(doska):
    print('\n', board[0], '|', board[1], '|', board [2])
    print('---------')
    print('\n', board[3], '|', board[4], '|', board [5])
    print('---------')
    print('\n', board[6], '|', board[7], '|', board [8], '\n')

Нам Π΅Ρ‰Π΅ потрСбуСтся функция, которая провСряСт, ΠΊΡƒΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΡ‚ΠΈ. Для этого Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ с ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ΠΎΠΌ всСх пустых ΠΊΠ»Π΅Ρ‚ΠΎΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС нСзанятыС мСста добавились Π² список, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ Π΅ΡΡ‚ΡŒ β€œΠ΄ΠΎΡΡ‚ΡƒΠΏΠ½Ρ‹Π΅ ходы”:

def dostupnie_hodi(doska):
    dostupnie_hodi=[]
    for i in range(RAZMER_DOSKI):
        if doska(i)== HODI:
            dostupnie_hodi.append(i)
    return dostupnie_hodi

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ сдСлаСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ побСдитСля. Если ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚ ΠΈΠ³Ρ€ΠΎΠΊ, ставящий крСстики, Ρ‚ΠΎ функция выдаст X, Ссли ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ ΠΈΠ³Ρ€Π°Π» Π½ΠΎΠ»ΠΈΠΊΠ°ΠΌΠΈ β€” 0, Π½ΠΈΡ‡ΡŒΡ задаСтся глобальной константой NICHYA='ΠΠΈΡ‡ΡŒΡ', Ссли ΠΈΠ³Ρ€Π° Π΅Ρ‰Π΅ Π½Π΅ дошла Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°, Ρ‚ΠΎ функция выдаст None. Π•ΡΡ‚ΡŒ способ опрСдСлСния ΠΏΠΎΠ±Π΅Π΄Ρ‹ Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ΅Ρ€Π΅Π±ΠΎΡ€ всСх Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Π½Π°Π±ΠΎΡ€ΠΎΠ² ΠΈΠ· Ρ‚Ρ€Π΅Ρ… ΠΊΠ»Π΅Ρ‚ΠΎΠΊ, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠ³Ρ€ΠΎΠΊ считаСтся ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΌ:

def winner(doska):
    VAR_POBED=((0,1,2),
               (3,4,5),
               (6,7,8),
               (0,3,6),
               (1,4,7),
               (2,5,8),
               (0,4,8),
               (2,4,6))
    for i in varianti_pobed:
        if doska[i[0]]==doska[i[1]]==doska[i[2]]!=HODI:
            winner=doska[i[0]]
            return winner
        if HODI not in doska:
            return NICHYA
    return None

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

def human_hod(doska,human):
    dostupnie=dostupnie_hodi(doska)
    hod=None
    while hod not in dostupnie:
        hod=hod('Ввоя ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ. Напиши Π½ΠΎΠΌΠ΅Ρ€ поля 0-8: ',\
 0,RAZMER_DOSKI)
        if hod not in dostupnie:
            print('ПолС занято. Напиши Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€: ')
    print('Π‘ΡƒΠΏΠ΅Ρ€!')
    return hod

ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя самой слоТной для мСня Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” это Ρ…ΠΎΠ΄Ρ‹ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. НуТно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π΄Π΅Π»Π°Π» β€œΡ…ΠΎΡ€ΠΎΡˆΠΈΠ΅β€ Ρ…ΠΎΠ΄Ρ‹, старался Π²Ρ‹ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π₯ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π°ΡƒΠ³Π°Π΄ ΠΌΠΎΠΆΠ½ΠΎ, Ссли ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ любоС свободноС мСсто Π½Π° ΠΏΠΎΠ»Π΅. Но Ρ‚ΠΎΠ³Π΄Π° Π΅ΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Π°Ρ‚ΡŒ.

Π§Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ β€œΠΈΡΠΏΠΎΡ€Ρ‚ΠΈΡ‚ΡŒβ€ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ доску, ΠΎΠΏΡ‹Ρ‚Π½Ρ‹Π΅ программисты ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€œΠΊΠΎΠΏΠΈΡŽβ€ доски, Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ ΠΈ Π±ΡƒΠ΄Π΅ΠΌ Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния:

def comp_hod(doska,comp,human):
    doska=doska[:]

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π½Π΅ Ρ…ΠΎΠ΄ΠΈΠ» β€œΠΎΡ‚ балды”, ΡƒΡ‡Ρ‚Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΡΡ‚Ρ€Π°Ρ‚Π΅Π³ΠΈΡŽ:

  • β€œΠ»ΡƒΡ‡ΡˆΠ΅Π΅β€ ΠΏΠΎΠ»Π΅ – ΠΏΠΎ Ρ†Π΅Π½Ρ‚Ρ€Ρƒ;
  • Ссли Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ ΡƒΠΆΠ΅ занято, Ρ‚ΠΎ β€œΠ»ΡƒΡ‡ΡˆΠΈΠΌΠΈβ€ ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ поля;
  • ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Ρ…ΠΎΠ΄ΠΈΡ‚ Π² β€œΠ»ΡƒΡ‡ΡˆΠ΅Π΅β€ ΠΈΠ· свободных мСст Π½Π° ΠΏΠΎΠ»Π΅.

Π›ΡƒΡ‡ΡˆΠΈΠ΅ поля Π·Π°Π΄Π°ΡŽΡ‚ΡΡ константой Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

BEST_HODI=(4,0,2,6,8,1,3,5,7)

Π’ ΠΈΡ‚ΠΎΠ³Π΅ вся функция Ρ…ΠΎΠ΄ΠΎΠ² ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° получаСтся Ρ‚Π°ΠΊΠΎΠΉ:

def comp_hod(doska,comp,human):
    doska=doska[:]
    BEST_HODI=(4,0,2,6,8,1,3,5,7)
    print('Мой Ρ…ΠΎΠ΄: ')
    for i in dostupnie_hodi(doska):
        doska[i]=comp
        if winner(doska)==comp:
            print(hod)
            return hod
        doska[i]=HODI
    for j in dostupnie_hodi(doska):
        doska[j]=human
        if winner(doska)==human:
            print(hod)
            return hod
        doska[j]=HODI
    for k in dostupnie_hodi(doska):
        print(k)
        return k

НуТна Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° функция, которая Π±ΡƒΠ΄Π΅Ρ‚ Π΄Π°Π²Π°Ρ‚ΡŒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ…ΠΎΠ΄ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΈΠ³Ρ€ΠΎΠΊΡƒ, опрСдСляя ΠΊΠ°ΠΊΠΈΠΌΠΈ Ρ„ΠΈΡˆΠΊΠ°ΠΌΠΈ Π±Ρ‹Π» сдСлан послСдний Ρ…ΠΎΠ΄ ΠΈ пСрСдавая Ρ…ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ„ΠΈΡˆΠΊΠ°ΠΌ:

def next_hod(hod):
    if hod==X:
        return O
    else:
        return X

ΠŸΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ΡΡ Π΅Ρ‰Π΅ функция, которая выявит побСдитСля ΠΈ ΠΏΠΎΠ·Π΄Ρ€Π°Π²ΠΈΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ³Ρ€Ρ‹. Π­Ρ‚Π° функция Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² самом ΠΊΠΎΠ½Ρ†Π΅ ΠΈΠ³Ρ€Ρ‹:

def pozdrav_pobeditela(pobeditel,comp,human):
    if pobeditel!=NICHYA:
        print('Π‘ΠΎΠ±Ρ€Π°Π½Π° линия ', pobeditel)
    else:
        print(NICHYA)
    if pobeditel==comp:
        print('/n ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π²Ρ‹ΠΈΠ³Ρ€Π°Π»!')
    elif pobeditel==human:
        print('Π’Ρ‹ ΠΏΠΎΠ±Π΅Π΄ΠΈΠ»!')
    elif pobeditel==NICHYA:
        print(NICHYA)

Когда Ρƒ нас Π΅ΡΡ‚ΡŒ всС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΡƒΠΆΠ½ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main(), которая ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ всС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π΅Π΄ΠΈΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅:

def main():
    instrukciya()
    comp,human=fishki()
    hod=X
    doska=new_doska()
    pokaz_doski(doska)
    while not winner(doska):
        if i==human:
            hod=human_hod(doska,human)
            doska[hod]=human
        else:
            hod=comp_hod(doska,comp,human)
            doska[hod]=comp
        pokaz_doski(doska)
        i=next_hod(hod)
    pobeditel=winner(doska)
    pozdrav_pobeditela(pobeditel,comp,human)

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΈΠ³Ρ€ΠΎΠΉ β€œΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Нолики”, для запуска потрСбуСтся всСго Π΄Π²Π΅ строки ΠΊΠΎΠ΄Π°:

main()
input('\n НаТми Entr, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈ')

Запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Π°Π», Ρ‡Ρ‚ΠΎ ΠΈΠ³Ρ€Π° Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊ Π½Π°Π΄ΠΎ. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ° построСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ вСрная, Π² самих функциях Π³Π΄Π΅-Ρ‚ΠΎ Π΄ΠΎΠΏΡƒΡ‰Π΅Π½Ρ‹ ошибки. НуТно ΠΈΡ… ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ.

Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ошибок Π² ΠΈΠ³Ρ€Π΅ β€œΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-нолики”.

ВСстированиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈΠ³Ρ€Ρ‹ ΠΈ исправлСниС ошибок оказалось довольно Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡Π΅ΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это β€œΠ½Π° глаз”. Как ΠΈΡΠΊΠ°Ρ‚ΡŒ ошибки Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅? НавСрноС, Π»ΡƒΡ‡ΡˆΠΈΠΉ способ β€” это ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. Запустим ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΈ посмотрим, Π³Π΄Π΅ Π΅ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

Ѐункция instrukciya() Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚:

ΠŸΡ€ΠΈΠ²Π΅Ρ‚! Π­Ρ‚ΠΎ ΠΈΠ³Ρ€Π° "ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ".
Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ…ΠΎΠ΄, Π²Π²Π΅Π΄ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ,
ΠΊΡƒΠ΄Π° Ρ…ΠΎΡ‡Π΅ΡˆΡŒ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ свой символ:

0 | 1 | 2
---------
3 | 4 | 5
---------
6 | 7 | 8



>>> 

ЗапускаСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ fishki(), ΠΈ с Π½Π΅ΠΉ всС Π² порядкС:

Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΡ‚ΠΎ сдСлаСт Ρ…ΠΎΠ΄ (ΠΈΠ³Ρ€Π°Ρ‚ΡŒ крСстиками)?  Π΄Π°
ОкСй, Ρ‚Ρ‹ ΠΈΠ³Ρ€Π°Π΅ΡˆΡŒ крСстиками!
>>> 

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ hod(low,high) я Ρ€Π΅ΡˆΠΈΠ»Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ вопрос, ΠΈ Π΅Π΅ запуск Ρ‚ΠΎΠΆΠ΅ ΠΏΡ€ΠΎΡˆΠ΅Π» ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ со значСниями 0-8 hod(0,8):

Π”Π΅Π»Π°ΠΉ свой Ρ…ΠΎΠ΄ - напиши Π½ΠΎΠΌΠ΅Ρ€ поля (0-8): 2
>>> 

Запуск Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ new_doska() ошибок Π½Π΅ Π²Ρ‹Π΄Π°Π», Π½ΠΎ ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Ρ‚ΠΎΠΆΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ этот Π±Π»ΠΎΠΊ пустой.

Бпустя Π΅Ρ‰Π΅ ΠΏΠ°Ρ€Ρƒ часов Π±Π»ΡƒΠΆΠ΄Π°Π½ΠΈΠΉ ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ, поиска ошибок, запусков ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π³Ρ€ΡƒΠΏΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, я ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ»Π°, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… мСстах Π·Π½Π°ΠΊ β€œΠΊΡ€Π΅ΡΡ‚ΠΈΠΊΠ°β€ X Π±Ρ‹Π» написан Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ символами, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΠΎΠ΅-Π³Π΄Π΅ крСстик стоял Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠ°Ρ…. Π•Ρ‰Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Π»ΠΎΡ‡ΠΈ Π±Ρ‹Π»ΠΈ исправлСны. ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (которая Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»Π° ΠΈ Π²Ρ‹ΠΈΠ³Ρ€Π°Π»Π° Ρƒ мСня!) выглядит Ρ‚Π°ΠΊ:

X='X'
O='0'
RAZMER_DOSKI=9
HODI=' '
NICHYA='ΠΠΈΡ‡ΡŒΡ'

def instrukciya():
    print('''
ΠŸΡ€ΠΈΠ²Π΅Ρ‚! Π­Ρ‚ΠΎ ΠΈΠ³Ρ€Π° "ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ".
Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ…ΠΎΠ΄, Π²Π²Π΅Π΄ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ,
ΠΊΡƒΠ΄Π° Ρ…ΠΎΡ‡Π΅ΡˆΡŒ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ свой символ:

0 | 1 | 2
---------
3 | 4 | 5
---------
6 | 7 | 8


''')
def nachalo(vopros):
    otvet=None
    while otvet not in ('Π΄Π°','Π½Π΅Ρ‚'):
        otvet=input(vopros).lower()
    return otvet

def fishki():
    perviy_hod=nachalo("Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΡ‚ΠΎ сдСлаСт Ρ…ΠΎΠ΄ \
(ΠΈΠ³Ρ€Π°Ρ‚ΡŒ крСстиками)?  ")
    if perviy_hod=='Π΄Π°':
        print('ОкСй, Ρ‚Ρ‹ ΠΈΠ³Ρ€Π°Π΅ΡˆΡŒ крСстиками!')
        human=X
        comp=O
    else:
        print('ОК, я дСлаю ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ…ΠΎΠ΄ крСстиками')
        human=O
        comp=X
    return comp, human
        
def hod_number(low,high):
    otvet=None
    while otvet not in range(low,high):
        otvet=int(input("Π”Π΅Π»Π°ΠΉ свой Ρ…ΠΎΠ΄ - напиши Π½ΠΎΠΌΠ΅Ρ€ поля (0-8): "))
    return otvet


def new_doska():
    doska=[]
    for i in range(RAZMER_DOSKI):
        doska.append(HODI)
    return doska

def pokaz_doski(doska):
    print('\n', doska[0], '|', doska[1], '|', doska [2])
    print('---------')
    print('\n'
          , doska[3], '|', doska[4], '|', doska [5])
    print('---------')
    print('\n', doska[6], '|', doska[7], '|', doska [8], '\n')

def dostupnie_hodi(doska):
    dostupnie_hodi=[]
    for i in range(RAZMER_DOSKI):
        if doska[i]== HODI:
            dostupnie_hodi.append(i)
    return dostupnie_hodi

def winner(doska):
    VAR_POBED=((0,1,2),
               (3,4,5),
               (6,7,8),
               (0,3,6),
               (1,4,7),
               (2,5,8),
               (0,4,8),
               (2,4,6))
    for i in VAR_POBED:
        if doska[i[0]]==doska[i[1]]==doska[i[2]]!=HODI:
            winner=doska[i[0]]
            return winner
        if HODI not in doska:
            return NICHYA
    return None
def human_hod(doska,human):
    dostupnie=dostupnie_hodi(doska)
    hod=None
    while hod not in dostupnie:
        hod=hod_number(0,RAZMER_DOSKI)
        if hod not in dostupnie:
            print('ПолС занято. Напиши Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½ΠΎΠΌΠ΅Ρ€: ')
    print('Π‘ΡƒΠΏΠ΅Ρ€!')
    return hod
def comp_hod(doska,comp,human):
    doska=doska[:]
    BEST_HODI=(4,0,2,6,8,1,3,5,7)
    print('Мой Ρ…ΠΎΠ΄: ')
    for i in dostupnie_hodi(doska):
        doska[i]=comp
        if winner(doska)==comp:
            print(i)
            return i
        doska[i]=HODI
    for j in dostupnie_hodi(doska):
        doska[j]=human
        if winner(doska)==human:
            print(j)
            return j
        doska[j]=HODI
    for k in dostupnie_hodi(doska):
        print(k)
        return k
def next_ochered(ochered):
    if ochered==X:
        return O
    else:
        return X
def pozdrav_pobeditela(pobeditel,comp,human):
    if pobeditel!=NICHYA:
        print('Π‘ΠΎΠ±Ρ€Π°Π½Π° линия ', pobeditel)
    else:
        print(NICHYA)
    if pobeditel==comp:
        print('ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π²Ρ‹ΠΈΠ³Ρ€Π°Π»!')
    elif pobeditel==human:
        print('Π’Ρ‹ ΠΏΠΎΠ±Π΅Π΄ΠΈΠ»!')
    elif pobeditel==NICHYA:
        print(NICHYA)
def main():
    instrukciya()
    comp,human=fishki()
    ochered=X
    doska=new_doska()
    pokaz_doski(doska)
    while not winner(doska):
        if ochered==human:
            hod=human_hod(doska,human)
            doska[hod]=human
        else:
            hod=comp_hod(doska,comp,human)
            doska[hod]=comp
        pokaz_doski(doska)
        ochered=next_ochered(ochered)
    pobeditel=winner(doska)
    pozdrav_pobeditela(pobeditel,comp,human)

main()
input('\n НаТми Entr, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈ')

Мой ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΌΠ°Ρ‚Ρ‡ Π² крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ с ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠΌ выглядСл Ρ‚Π°ΠΊ:

ΠŸΡ€ΠΈΠ²Π΅Ρ‚! Π­Ρ‚ΠΎ ΠΈΠ³Ρ€Π° "ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ".
Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ…ΠΎΠ΄, Π²Π²Π΅Π΄ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΊΠ»Π΅Ρ‚ΠΊΠΈ,
ΠΊΡƒΠ΄Π° Ρ…ΠΎΡ‡Π΅ΡˆΡŒ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ свой символ:

0 | 1 | 2
---------
3 | 4 | 5
---------
6 | 7 | 8



Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΡ‚ΠΎ сдСлаСт Ρ…ΠΎΠ΄ (ΠΈΠ³Ρ€Π°Ρ‚ΡŒ крСстиками)?  Π΄Π°
ОкСй, Ρ‚Ρ‹ ΠΈΠ³Ρ€Π°Π΅ΡˆΡŒ крСстиками!

   |   |  
---------

   |   |  
---------

   |   |   

Π”Π΅Π»Π°ΠΉ свой Ρ…ΠΎΠ΄ - напиши Π½ΠΎΠΌΠ΅Ρ€ поля (0-8): 4
Π‘ΡƒΠΏΠ΅Ρ€!

   |   |  
---------

   | X |  
---------

   |   |   

Мой Ρ…ΠΎΠ΄: 
0

 0 |   |  
---------

   | X |  
---------

   |   |   

Π”Π΅Π»Π°ΠΉ свой Ρ…ΠΎΠ΄ - напиши Π½ΠΎΠΌΠ΅Ρ€ поля (0-8): 5
Π‘ΡƒΠΏΠ΅Ρ€!

 0 |   |  
---------

   | X | X
---------

   |   |   

Мой Ρ…ΠΎΠ΄: 
3

 0 |   |  
---------

 0 | X | X
---------

   |   |   

Π”Π΅Π»Π°ΠΉ свой Ρ…ΠΎΠ΄ - напиши Π½ΠΎΠΌΠ΅Ρ€ поля (0-8): 2
Π‘ΡƒΠΏΠ΅Ρ€!

 0 |   | X
---------

 0 | X | X
---------

   |   |   

Мой Ρ…ΠΎΠ΄: 
6

 0 |   | X
---------

 0 | X | X
---------

 0 |   |   

Π‘ΠΎΠ±Ρ€Π°Π½Π° линия  0
ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ Π²Ρ‹ΠΈΠ³Ρ€Π°Π»!

 НаТми Entr, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈ

Β 

Π˜Π³Ρ€Π°Π΅ΠΌ Π² ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Нолики с Python ΠΈ GTK / Π₯Π°Π±Ρ€

ΠŸΡ€Π΅Π΄ΠΈΡΠ»ΠΎΠ²ΠΈΠ΅

Новый Π±Π»ΠΎΠ³ GTK+ ΠΏΠΎΡ€Π°Π΄ΠΎΠ²Π°Π» ΡΡ‚Π°Ρ‚ΡŒΡ‘ΠΉ для Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΡ… ΠΈ я Ρ€Π΅ΡˆΠΈΠ» ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ простоС, Ρ‡Π΅ΠΌ C++/C. Python оказался ΠΊΠ°ΠΊ нСльзя кстати. ΠžΠ±ΡŠΡ‘ΠΌ ΠΊΠΎΠ΄Π° Π½Π° Python для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с GTK Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ мСньшС Ρ‡Π΅ΠΌ Π½Π° C++, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ Ρ€Π°Π΄ΠΎΠ²Π°Ρ‚ΡŒ.

PyGTK

PyGTK β€” Π±ΠΈΠ½Π΄ΠΈΠ½Π³ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ GTK для языка Python, PyGTK ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ IM Gajim). Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ интСрСсна для Python программистов, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ проста Π² ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ скрываСт Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ GTK.

Под ΠΊΠ°Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния

Для изучСния PyGTK я Ρ€Π΅ΡˆΠΈΠ» Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ простой ΠΏΡ€ΠΈΠΌΠ΅Ρ€ β€” ΠΈΠ³Ρ€Ρƒ ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Нолики.
Окно ΠΈΠ³Ρ€Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ максимально простым β€” ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΈΠ· ΠΊΠ½ΠΎΠΏΠΎΠΊ 3×3.

Окно ΠΈΠ³Ρ€Ρ‹:

Π˜Ρ‚Π°ΠΊ приступим ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π΅ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π° классов: XO_Field ΠΈ XO_Win, ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ…Ρ€Π°Π½ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠ»Π΅, Π²Ρ‚ΠΎΡ€ΠΎΠΉ создаёт GUI для прилоТСния ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ события.

Π― использовал для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΌΠΎΠ΄ΡƒΠ»ΡŒ pygtk, установлСнный ΠΈΠ· ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Π° Π² Ubuntu, Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах стоит Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ ΠΈΠ»ΠΈ python easy-install, Π° для Windows Π΅ΡΡ‚ΡŒ инсталлятор.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ pygtk вСрсии 2.0 ΠΈΠ»ΠΈ ΡΡ‚Π°Ρ€ΡˆΠ΅:

import pygtk
pygtk.require('2.0')
import gtk

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ простоС ΠΎΠΊΠ½ΠΎ, ΠΏΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Ρ†ΠΈΠΊΠ» событий GTK. Ѐункция destroy Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅.

self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.connect("destroy", self.destroy)
self.window.set_title("ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Нолики.py!")
self.window.set_border_width(10)
self.window.set_size_request(400,400)

Для ΠΎΠΊΠ½Π° Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΎΠΉ ΠΈΠ· Ρ‚Ρ€Ρ‘Ρ… строк с Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ.
Π’Π°ΠΊ ΠΊΠ½ΠΎΠΏΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ располоТСны ΠΊΠ°ΠΊ Ρ€Π°Π· Π² Π²ΠΈΠ΄Π΅ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π° 3×3. Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΊΠ½ΠΎΠΏΠΎΠΊ добавляСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ события Β«clickedΒ», синтаксис добавлСния ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° сигналы ΠΈ слоты Π² Qt.

self.vbox = gtk.VBox(False,0)
self.window.add(self.vbox)
        
for i in range(3):
    box = gtk.HBox(False,0)
    self.boxes.append(box)
    for j in range(3):
        self.buttons[i].append(self.create_button(box))
        self.buttons[i][j].connect("clicked",self.on_btn_click,i,j)
    self.vbox.pack_start(box,True,True,0)
    box.show()

Ѐункция, ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ ΠΊΠ½ΠΎΠΏΠΊΡƒ:

def create_button(self,box):
    button = gtk.Button(self.field.chr)
    box.pack_start(button,True,True,0)
    button.show()
    return button

Запуск основного Ρ†ΠΈΠΊΠ»Π° событий GTK ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΎΠΊΠ½Π°:

def main(self):
    gtk.main()

def destroy(self, widget, data=None):
    gtk.main_quit()

По Π½Π°ΠΆΠ°Ρ‚ΠΈΡŽ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠΈ происходит установка Π·Π½Π°ΠΊΠ° Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Ρ…ΠΎΠ΄Π° ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ ΠΈΠ³Ρ€ΠΎΠΊΡƒ, Ссли Π΅Ρ‰Ρ‘ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½ ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ. Если ΠΈΠ³Ρ€Π° Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выводится Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΎΠΊΠ½Π°.

Π‘Π°ΠΌΠ° ΠΈΠ³Ρ€Π° Π² ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Нолики ΠΈ Π΅Ρ‘ рСализация довольно Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Π°, ссылка Π½Π° исходный ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π½ΠΈΠΆΠ΅. Π‘ΠΎΠ»ΡŒΡˆΠΈΠΉ интСрСс прСдставляСт сам Ρ†ΠΈΠΊΠ» Ρ€Π°Π±ΠΎΡ‚Ρ‹ прилоТСния Python Π² связкС с GTK, Ρ‚Π°ΠΊ Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ сборщик мусора ΠΏΡ€ΠΈ сборкС ссылок Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ GTK Ρ‚Π°ΠΊΠΆΠ΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ дСструкторы для Π½ΠΈΡ…, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ элСмСнты UI содСрТат ΠΌΠ½ΠΎΠ³ΠΎ ссылок Π½Π° рСсурсы.

P.S.

Π›ΡƒΡ‡ΡˆΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ GtkTable (ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ для выравнивания Π²ΠΈΠ΄ΠΆΠ΅Ρ‚ΠΎΠ² ΠΏΠΎ сСткС) с 3 строками ΠΈ 3 столбцами, Π½ΠΎ ΠΊΠ°ΠΊ-Ρ‚ΠΎ вспомнил ΠΎ Π½Ρ‘ΠΌ ΠΏΠΎΠ·Π΄Π½ΠΎ.

Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ API GTK обновляСтся, ΠΊΠ°ΠΊ Π±Ρ‹Π»ΠΎ Π·Π°ΠΌΠ΅Ρ‡Π΅Π½ΠΎ Π² коммСнтариях, Π΅ΡΡ‚ΡŒ ΡƒΠΆΠ΅ Π±ΠΈΠ½Π΄ΠΈΠ½Π³ для gtk 3. Π‘Ρ‚ΠΎΠΈΡ‚ постСпСнно ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° Π½Π΅Π³ΠΎ, Π½ΠΎ Π½Π΅ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° ясСн вопрос с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ gtk 3 Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΡ‚ linux.

Π’Π΅ΡΡŒ исходный ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ
  1. PyGTK Π½Π° Wiki
  2. Π‘Π°ΠΉΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° PyGTK
  3. О ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅ ΠΈ Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π°Ρ…

Π“Π»Π°Π²Π° 10.1 Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΠ³Ρ€Ρ‹ Β«ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Нолики».

Как всСгда, я Π½Π°ΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠΎΠ²Π΅Ρ‚ΡƒΡŽ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. Π­Ρ‚ΠΎ ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π»ΡƒΡ‡ΡˆΠ΅. Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Π²Ρ‹ всСгда ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° страницС Β«Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠΈΒ«.

Π˜Ρ‚Π°ΠΊ, ΠΎΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ Π½ΠΎΠ²ΠΎΠ΅ ΠΎΠΊΠ½ΠΎ тСкстового Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Python Shell, Π½Π°Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ ΠΊΠΎΠ΄ ΠΈ сохранитС Π² Ρ„Π°ΠΉΠ»Π΅ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ β€˜TicTacToe.py’ Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π·Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅. Но Ссли Π²Ρ‹ ΠΏΠΎΡ‚ΠΎΠΌ Ρ€Π΅ΡˆΠΈΡ‚Π΅ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² *.exe β€” Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с символами ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Ρ‹ Π² Π½Π°Π·Π²Π°Π½ΠΈΠΈ.

1. #ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Нолики
2.
3. import random
4.
5. def drawBoard(board):
6.     #Π­Ρ‚Π° функция рисуСт ΠΈΠ³Ρ€ΠΎΠ²ΡƒΡŽ доску с Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌΠΈ Ρ…ΠΎΠ΄Π°ΠΌΠΈ
7.
8.     #"Доска" являСтся списком ΠΈΠ· 10 строк ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€ΠΈΡΡƒΡŽΡ‚ доску Π² 
символьной Π³Ρ€Π°Ρ„ΠΈΠΊΠ΅
9.     print(' | |')
10.    print(' ' + board[7] + ' | ' + board[8] + ' | ' + board[9])
11.    print(' | |')
12.    print('---+---+---')
13.    print(' | |')
14.    print(' ' + board[4] + ' | ' + board[5] + ' | ' + board[6])
15.    print(' | |')
16.    print('---+---+---')
17.    print(' | |')
18.    print(' ' + board[1] + ' | ' + board[2] + ' | ' + board[3])
19.    print(' | |')
20.
21. def inputPlayerLetter():
22.     #ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΠ³Ρ€ΠΎΠΊΡƒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ символ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ Ρ…ΠΎΡ‡Π΅Ρ‚ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ
23.     #Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список с Π±ΡƒΠΊΠ²ΠΎΠΉ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π² качСствС ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ элСмСнта ΠΈ 
Π±ΡƒΠΊΠ²ΠΎΠΉ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° Π² качСствС Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ элСмСнта
24.     letter = ''
25.     while not (letter == 'Π₯' or letter == 'О'):
26.         print('Каким Π·Π½Π°ΠΊΠΎΠΌ Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ? (Π₯ ΠΈΠ»ΠΈ О)')
27.         letter = input().upper()
28.
29.     #ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ списка всСгда Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π·Π½Π°ΠΊ ΠΈΠ³Ρ€ΠΎΠΊΠ°.
30.     if letter == 'Π₯':
31.         return ['Π₯', 'О']
32.     else:
33.         return ['О', 'Π₯']
34.
35. def whoGoesFirst():
36.     #Π‘Π»ΡƒΡ‡Π°ΠΉΠ½ΠΎ опрСдСляСтся, ΠΊΡ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ
37.     if random.randint(0, 1) == 0:
38.         return 'ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€'
39.     else:
40.         return 'ΠΈΠ³Ρ€ΠΎΠΊ'
41.
42. def playAgain():
43.     #Π­Ρ‚Π° функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True, Ссли ΠΈΠ³Ρ€ΠΎΠΊ Ρ…ΠΎΡ‡Π΅Ρ‚ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Ρ€Π°Π·. 
Π˜Π½Π°Ρ‡Π΅ False.
44.     print('Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ Ρ€Π°Π·? (Π΄Π° ΠΈΠ»ΠΈ Π½Π΅Ρ‚)')
45.     return input().lower().startswith('Π΄')
46. 
47. def makeMove(board, letter, move):
48.     board[move] = letter
49. 
50. def isWinner(bo, le):
51.     #Ѐункция ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ Π½Π° доскС ΠΈ Ρ‚Π΅ΠΊΡ‰ΠΈΠΉ Ρ…ΠΎΠ΄ ΠΈΠ³Ρ€ΠΎΠΊΠ°. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 
True, Ссли ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹ΠΈΠ³Ρ€Π°Π»
52.     #ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ bo вмСсто доски ΠΈ le вмСсто ΠΏΠΎΠ»Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…
53.     return ((bo[7] == le and bo[8] == le and bo[9] == le) or #ВСрхняя линия
54.     (bo[4] == le and bo[5] == le and bo[6] == le) or #БрСдняя линия
55.     (bo[1] == le and bo[2] == le and bo[3] == le) or #НиТняя линия
56.     (bo[7] == le and bo[4] == le and bo[1] == le) or #ЛСвая Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½Π°Ρ линия
57.     (bo[8] == le and bo[5] == le and bo[2] == le) or #Π¦Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Π°Ρ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒ
58.     (bo[9] == le and bo[6] == le and bo[3] == le) or #ВСрхняя линия
59.     (bo[7] == le and bo[5] == le and bo[3] == le) or #Π”ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡŒ
60.     (bo[9] == le and bo[5] == le and bo[1] == le)) #Π”ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡŒ
61. 
62. def getBoardCopy(board):
63.     #Π‘Π΄Π΅Π»Π°Π΅ΠΌ копию ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ доски ΠΈ Π²Π΅Ρ€Π½Π΅ΠΌ Π΅Ρ‘
64.     dupeBoard = []
65. 
66.     for i in board:
65.         dupeBoard.append(i)
67.
68.     return dupeBoard
69. 
70. def isSpaceFree(board, move):
71.     #Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True Ссли Ρ…ΠΎΠ΄ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½
72.     return board[move] == ' '
73. 
74. def getPlayerMove(board):
75.     #ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΈΠ³Ρ€ΠΎΠΊΡƒ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ…ΠΎΠ΄
76.     move = ''
77.     while move not in '1 2 3 4 5 6 7 8 9'.split() or not 
isSpaceFree(board, int(move)):
78.         print('Π’Π°Ρˆ Ρ…ΠΎΠ΄ (1-9):')
79.         move = input()
80.     return int(move)
81. 
82. def chooseRandomMoveFromList(board, movesList):
83.     #Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ случайный Ρ…ΠΎΠ΄ ΠΈΠ· ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ списка Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ…ΠΎΠ΄ΠΎΠ²
84.     #Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ None Ссли Ρ…ΠΎΠ΄ΠΎΠ² Π½Π΅Ρ‚
85.     possibleMoves = []
86.     for i in movesList:
87.         if isSpaceFree(board, i):
88.             possibleMoves.append(i)
89. 
90.     if len(possibleMoves) != 0:
91.         return random.choice(possibleMoves)
92.     else:
93.         return None
94. 
95. def getComputerMove(board, computerLetter):
96.     #ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ копию содСрТимого доски ΠΈ Π±ΡƒΠΊΠ²Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€. 
Π˜ΡΡ…ΠΎΠ΄Ρ ΠΈΠ· этого опрСдСляСт ΠΊΡƒΠ΄Π° Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ…ΠΎΠ΄
97.     if computerLetter == 'Π₯':
98.         playerLetter = 'О'
99.     else:
100.        playerLetter = 'Π₯'
101. 
102.    #Π—Π΄Π΅ΡΡŒ начинаСтся Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ИИ "ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Нолики"
103.    #ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ шагом Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ возмоТности ΠΏΠΎΠ±Π΅Π΄Ρ‹ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Ρ…ΠΎΠ΄Ρƒ
104.    for i in range(1, 10):
105.        copy = getBoardCopy(board)
106.        if isSpaceFree(copy, i):
107.            makeMove(copy, computerLetter, i)
108.            if isWinner(copy, computerLetter):
109.                return i
110 
111.    #ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ, ΠΌΠΎΠΆΠ΅Ρ‚ Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡŽΡ‰Π΅ΠΌ Ρ…ΠΎΠ΄Ρƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ 
Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ
112.    for i in range(1, 10):
113.        copy = getBoardCopy(board)
114.        if isSpaceFree(copy, i):
115.            makeMove(copy, playerLetter, i)
116.            if isWinner(copy, playerLetter):
117.                return i
118. 
119.     #ΠŸΠΎΠΏΡ‹Ρ‚Π°Π΅ΠΌΡΡ Π·Π°Π½ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΡƒΠ³Π»ΠΎΠ², Ссли ΠΎΠ½ΠΈ свободны
119.     move = chooseRandomMoveFromList(board, [1, 3, 7, 9])
120.     if move != None:
121.         return move
122. 
123.     #Π—Π°Π½ΠΈΠΌΠ°Π΅ΠΌ Ρ†Π΅Π½Ρ‚Ρ€, Ссли ΠΎΠ½ свободСн
124.     if isSpaceFree(board, 5):
125.         return 5
126. 
127.     #Π—Π°Π½ΠΈΠΌΠ°Π΅ΠΌ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π±ΠΎΠΊΠΎΠ²Ρ‹Ρ… ΠΊΠ»Π΅Ρ‚ΠΎΠΊ
128.     return chooseRandomMoveFromList(board, [2, 4, 6, 8])
129. 
130. def isBoardFull(board):
131.     #Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ True, Ссли всС ΠΊΠ»Π΅Ρ‚ΠΊΠΈ Π½Π° доскС Π±Ρ‹Π»ΠΈ заняты. Π˜Π½Π°Ρ‡Π΅ 
Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ False
132.     for i in range(1, 10):
133.         if isSpaceFree(board, i):
134.             return False
135.     return True
136
137.
138. print ('Π”Π°Π²Π°ΠΉ сыграСм Π² "ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Нолики"!')
139
140. while True:
141.     #БбрасываСм состояниС ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ доски
142.     theBoard = [' ']*10
143.     playerLetter, computerLetter = inputPlayerLetter()
144.     turn = whoGoesFirst()
145.     print ('ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ '+turn +'\n')
146.     gameIsPlaying = True
147. 
148.     while gameIsPlaying:
149.         if turn == 'ΠΈΠ³Ρ€ΠΎΠΊ':
150.             #Π₯ΠΎΠ΄ ΠΈΠ³Ρ€ΠΎΠΊΠ°
151.             drawBoard(theBoard)
152.             move = getPlayerMove(theBoard)
153.             makeMove(theBoard, playerLetter, move)
154. 
155.             if isWinner(theBoard, playerLetter):
156.                 drawBoard(theBoard)
157.                 print ('ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΡŽ!!! Π’Ρ‹ ΠΏΠΎΠ±Π΅Π΄ΠΈΠ»ΠΈ Π² ΠΈΠ³Ρ€Π΅!')
158.                 gameIsPlaying = False
159.             else:
160.                 if isBoardFull(theBoard):
161.                     drawBoard(theBoard)
162.                     print('ΠΠΈΡ‡ΡŒΡ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π· ΠΈΠ³Ρ€Π°ΠΉ Π»ΡƒΡ‡ΡˆΠ΅')
163.                     break
164.                 else:
165.                     turn = 'ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€'
166. 
167.         else:
168.             #Π₯ΠΎΠ΄ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°
169.             move = getComputerMove(theBoard, computerLetter)
170.             makeMove(theBoard, computerLetter, move)
171.             if isWinner(theBoard, computerLetter):
172.                 drawBoard(theBoard)
173.                 print('ΠšΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ ΠΏΠΎΠ±Π΅Π΄ΠΈΠ»! Π’Ρ‹ ΠΏΠΎΠΈΠ³Ρ€Π°Π»ΠΈ...')
174.                 gameIsPlaying = False
175.             else:
176.                 if isBoardFull(theBoard):
177.                     drawBoard(theBoard)
178.                     print('ΠΠΈΡ‡ΡŒΡ. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π· ΠΈΠ³Ρ€Π°ΠΉ Π»ΡƒΡ‡ΡˆΠ΅')
179.                     break
180.                 else:
181.                     turn = 'ΠΈΠ³Ρ€ΠΎΠΊ'
182. 
183.     if not playAgain():
185          break

ΠžΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ Π½Π° Ρ„ΠΎΡ€ΡƒΠΌΠ΅.

ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ссылкой:

ΠŸΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΎΡΡŒ это:

Нравится Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ°…

ΠŸΠΎΡ…ΠΎΠΆΠ΅Π΅

Π“Π»Π°Π²Π° 10. Π˜Π³Ρ€Π° Β«ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Нолики» Π½Π° Python 3

Π’Π΅ΠΌΡ‹, рассматриваСмыС Π² этой Π³Π»Π°Π²Π΅:

  • Π˜ΡΠΊΡƒΡΡΡ‚Π²Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚
  • Бписок ссылок
  • Short-Circuit Evaluation (ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Ρƒ ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π·Π±Π΅Ρ€ΡƒΡΡŒ Ρ‡Ρ‚ΠΎ это πŸ˜‰ )
  • Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ None (пустоС)

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ рассмотрим ΠΈΠ³Ρ€Ρƒ, которая Π·Π½Π°ΠΊΠΎΠΌΠ° всСм ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ – Β«ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈΒ». Π’Π°ΠΌ прСдстоит ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ Π² Π½Π΅Π΅ ΠΏΡ€ΠΎΡ‚ΠΈΠ² нСслоТного искусствСнного ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚Π°. Π˜ΡΠΊΡƒΡΡΡ‚Π²Π΅Π½Π½Ρ‹ΠΉ ΠΈΠ½Ρ‚Π΅Π»Π»Π΅ΠΊΡ‚ (Π΄Π°Π»Π΅Π΅ ΠΏΠΎ тСксту – ИИ), это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая ΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅Ρ‚ дСйствия ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΈ Π½Π° ΠΈΡ… основС Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΡΠΎΠ±ΡΡ‚Π²Π΅Π½Π½ΡƒΡŽ Ρ‚Π°ΠΊΡ‚ΠΈΠΊΡƒ дСйствий. Π’ этой ΠΈΠ³Ρ€Π΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… слоТных ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, ИИ Β«ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈΒ», это всСго лишь нСсколько строк ΠΊΠΎΠ΄Π°.

Для Π½Π°Ρ‡Π°Π»Π° вспомним, ΠΊΠ°ΠΊ Π² Β«ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈΒ» ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π΄Π²Π° Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ°. На листС Π±ΡƒΠΌΠ°Π³ΠΈ расчСрчиваСтся ΠΏΠΎΠ»Π΅,Β  Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ 3Ρ…3 ΠΊΠ»Π΅Ρ‚ΠΊΠΈ. Один ΠΈΠ³Ρ€ΠΎΠΊ – Π₯, Π²Ρ‚ΠΎΡ€ΠΎΠΉ – О.Β  Π˜Π³Ρ€ΠΎΠΊΠΈ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ставят свои символы (Π₯ ΠΈΠ»ΠΈ О). ΠŸΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΌ становится Ρ‚ΠΎΡ‚, ΠΊΠΎΠΌΡƒ удастся Π²Ρ‹ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈ своих символа Π² ряд ΠΏΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ, Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ ΠΈΠ»ΠΈ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ. Если это Π½Π΅ удаСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², Π° свободных ΠΊΠ»Π΅Ρ‚ΠΎΠΊ Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ, Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΈΠ³Ρ€Ρ‹ становится Π½ΠΈΡ‡ΡŒΡ.

Для создания ИИ Β«ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈΒ», Π·Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ, Π±ΡƒΠ΄Π΅Ρ‚ достаточно Ρ‚Π΅Ρ… Π·Π½Π°Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Π»ΠΈ, изучая ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ Π³Π»Π°Π²Ρ‹. Π”Π°Π²Π°ΠΉΡ‚Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ этой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ³ΠΎ запуска ΠΈΠ³Ρ€Ρ‹ Β«ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈΒ».

ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Β«ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈΒ».

Рис 10-1. ΠžΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹ΠΉ запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Β«ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Нолики» Π² консоли Windows 7.

ΠžΠ±ΡΡƒΠ΄ΠΈΡ‚ΡŒ Π½Π° Ρ„ΠΎΡ€ΡƒΠΌΠ΅.

ΠŸΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ ссылкой:

ΠŸΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΎΡΡŒ это:

Нравится Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ°…

ΠŸΠΎΡ…ΠΎΠΆΠ΅Π΅

Tic tac toe крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ

import numpy as np
import random
from operator import itemgetter
 
board = np.array([['_', '_', '_'],
                  ['_', '_', '_'],
                  ['_', '_', '_']], dtype=str)
 
SIGN = {0: 'X', 1: 'O'}
 
MATRIX = np.array([[0,1,2],
                  [3,4,5],
                  [6,7,8]])
 
def board_print(board):
    """Π­Ρ‚Π° функция ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΠΏΠΎΠ»Π΅ с Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ΠΌΠΈ ΠΊΠ»Π΅Ρ‚ΠΊΠ°ΠΌΠΈ"""
 
    print('--------------')
    print('| {} | {} | {} |'.format(board[0,0], board[0,1], board[0,2]))
    print('| {} | {} | {} |'.format(board[1,0], board[1,1], board[1,2]))
    print('| {} | {} | {} |'.format(board[2,0], board[2,1], board[2,2]))
    print('--------------')
 
def choice_sign():
    """Π’Ρ‹Π±ΠΎΡ€ крСстика ΠΈΠ»ΠΈ Π½ΠΎΠ»ΠΈΠΊΠ°"""
    sign = input("""Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ свой Π·Π½Π°ΠΊ:
                0 - крСстик,
                1 - Π½ΠΎΠ»ΠΈΠΊ)\n""")
    user_sign = SIGN[int(sign)]
    comp_sign = SIGN[0] if int(sign) == 1 else SIGN[1]
 
    return user_sign, comp_sign
 
def choice_step():
    """Π’Ρ‹Π±ΠΎΡ€ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Ρ…ΠΎΠ΄Π°, 0 - Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, 1 -ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€"""
    step = random.randint(0,1)
    if step == 0:
        print('ΠŸΠΎΠ·Π΄Ρ€Π°Π²Π»ΡΡŽ, Π’Ρ‹ Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ!')
        return True
    else:
        print('ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π²Ρ‹ΠΏΠ°Π» шанс Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Ρƒ')
        return False
 
def choice_cell(board):
    """Π’Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΊΠ»Π΅Ρ‚ΠΊΡƒ для Ρ…ΠΎΠ΄Π°"""
    board_print(board)
    print('Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ строку ΠΈ столбСц, Π³Π΄Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‚ΠΎΡΡ‚ΡŒ ваш Π·Π½Π°ΠΊ')
    while True:
        cell = input("""Π’Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ввСсти Π΄Π²Π° числа. ΠŸΠ΅Ρ€Π²ΠΎΠ΅ - строка, Π²Ρ‚ΠΎΡ€ΠΎΠ΅ - столбСц:
                      1 - пСрвая строка ΠΈΠ»ΠΈ столбСц
                      2 - вторая строка ΠΈΠ»ΠΈ столбцС
                      3 - Ρ‚Ρ€Π΅Ρ‚ΡŒΡ строка ΠΈΠ»ΠΈ столбСц
                      Π±ΡƒΠ΄ΡŒΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½Ρ‹, ячСйки ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ заняты
                    \n""")
        if len(cell) != 2:
            print('Π’Π²Π΅Π΄ΠΈΡ‚Π΅ Π½Π΅ ΠΎΠ΄Π½ΠΎ, Π° Π΄Π²Π° числа')
            continue
        # Π² pythone нумСрация начинаСтся с 0
        row = int(cell[0]) - 1
        column = int(cell[1]) - 1
 
        if row in range(0, 3) and \
                column in range(0,3) and \
                board[row, column] == '_':
            break
        else:
            print('НСвСрно Π²Ρ‹Π±Ρ€Π°Π½Π° ячСйка ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Ρ‚Π΅Π»ΡŒΠ½ΠΎ')
    return row, column
 
 
 
class GameState:
    def __init__(self, board, comp_sign, user_sign):
        self.board = board
        self.comp_sign = comp_sign
        self.user_sign = user_sign
        self.winning_combos = [((0,0), (0,1), (0,2)), ((1,0), (1,1), (1,2)), #(0,1,2) (3,4,5)
                              ((2,0), (2,1), (2,2)), ((0,0), (1,0), (2,0)), #(6,7,8) (0,3,6)
                                ((0,1), (1,1), (2,1)), ((0,2), (1,2), (2,2)), #(1,4,7) (2,5,8)
                              ((0,0), (1,1), (2,2)), ((0,2), (1,1), (2,0))]   #(0,4,8) (2,4,6)
 
    def get_winner(self):
        '''Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ None Ссли ΠΈΠ³Ρ€Π° всё Π΅Ρ‰Ρ‘ продолТаСтся, ΠΈΠ½Π°Ρ‡Π΅ ΠΎΡ†Π΅Π½ΠΊΠ° с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π° (1=ΠΏΠΎΠ±Π΅Π΄Π°, 0=Π½ΠΈΡ‡ΡŒΡ, -1=ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Ρ‰)'''
        if np.count_nonzero(self.board == '_') == 0: #Ссли Π½Π΅ ΠΎΡΡ‚Π°Π»ΠΎΡΡŒ пустых ΠΏΠΎΠ»Π΅ΠΉ
            return 0
        for combo in self.winning_combos:
            if (self.board[combo[0]] == self.comp_sign and
                self.board[combo[1]] == self.comp_sign and
                self.board[combo[2]] == self.comp_sign):
                return 1
            if (self.board[combo[0]] == self.user_sign and
                self.board[combo[1]] == self.user_sign and
                self.board[combo[2]] == self.user_sign):
                return 1
        return None
 
    def get_possible_moves(self):
        '''Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ячСйки для размСщСния символов'''
        return [index for index, square in np.ndenumerate(self.board) if square == '_']
 
    def get_next_state(self, move, our_turn):
        '''Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ состояниС ΠΈΠ³Ρ€Ρ‹ послС заполнСния ячСйки'''
        copy_array = np.copy(self.board)
        copy_array[move] = self.comp_sign if our_turn else self.user_sign
        return GameState(copy_array, self.comp_sign, self.user_sign)
 
def play(game_state, our_turn):
    '''Если ΠΈΠ³Ρ€Π° Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ (None, score), Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС рСкурсивно Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π»ΡƒΡ‡ΡˆΠΈΠΉ Ρ…ΠΎΠ΄ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΈ счёт'''
    score = game_state.get_winner() # ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ None, 0, 1, -1
    if score != None:
        return None, score
    moves = ((move,
              play(game_state.get_next_state(move, our_turn), not our_turn)[1])
             for move in game_state.get_possible_moves())
    return (max if our_turn else min)(moves, key=itemgetter(1))
 
def main():
    print('НачинаСм ΠΈΠ³Ρ€Ρƒ')
    user_sign, comp_sign = choice_sign() #ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π·Π½Π°ΠΊ
 
    start_game_state = GameState(board, comp_sign, user_sign)
 
    if choice_step():
        # ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΊΡƒΠ΄Π° ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π·Π½Π°ΠΊ
        # choice_cell Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΡ€Ρ‚Π΅ΠΆ, Π° сам ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ доску
        start_game_state.board[choice_cell(start_game_state.board)] = user_sign
 
    board_print(start_game_state.board)
    # Π˜Ρ‰Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΠΈΠΉ Ρ…ΠΎΠ΄ ΠΈ ΠΎΡ‡ΠΊΠΈ
    move, score = play(start_game_state, True)
 
    start_game_state.board[move] = comp_sign
 
    while score != 1 or score != 0:
        if score == 0:
            word = 'TIE'
        elif score == 1:
            word = 'WIN'
        else:
            word = 'LOSS, who rigged the board?!?'
        print('X should go at index #', move, 'Which will always result in a ' + word)
        start_game_state.board[choice_cell(start_game_state.board)] = user_sign
        move, score = play(start_game_state, True)
        print('SCORE',score)
        #if score == -1:
            #break
        start_game_state.board[move] = comp_sign
    board_print(start_game_state.board)
 
 
 
main()

ЗдравствуйтС, подскаТитС поТалуйста, ΠΊΠ°ΠΊ Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ, Π° Ρ‚ΠΎ Ρƒ мСня послС послСднСго крСстика всё ΠΏΠΎΠ»Π΅ Π²Π΄Ρ€ΡƒΠ³ становится Π½ΠΎΠ»ΠΈΠΊΠ°ΠΌΠΈ ((

ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ с использованиСм Python — AskPython

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ рассмотрим этапы создания крСстиков-Π½ΠΎΠ»ΠΈΠΊΠΎΠ² с использованиСм языка Python с нуля.

ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ


Об ΠΈΠ³Ρ€Π΅

ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ — это ΠΈΠ³Ρ€Π° для Π΄Π²ΡƒΡ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΈΠ³Ρ€Π°ΡŽΡ‚ Π½Π° ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚Π½ΠΎΠΉ сСткС 3 Γ— 3. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ³Ρ€ΠΎΠΊ ΠΏΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ячСйку с Ρ†Π΅Π»ΡŒΡŽ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈ ΠΌΠ΅Ρ‚ΠΊΠΈ ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ, Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ ΠΈΠ»ΠΈ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ. Один ΠΈΠ³Ρ€ΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ крСст 'X' Π² качСствС ΠΌΠ°Ρ€ΠΊΠ΅Ρ€Π°, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π½ΡƒΠ»Π΅Π²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 'O' .


Π¨Π°Π³ 1: Π”ΠΈΠ·Π°ΠΉΠ½ крСстиков-Π½ΠΎΠ»ΠΈΠΊΠΎΠ²

ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Π² крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, поэтому ΠΏΠ΅Ρ€Π²ΠΎΠ΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ, это ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΈΠ·Π°ΠΉΠ½ для Π½Π°ΡˆΠΈΡ… крСстиков-Π½ΠΎΠ»ΠΈΠΊΠΎΠ².

ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ Π”ΠΈΠ·Π°ΠΉΠ½

Если ΠΈΠ³Ρ€ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅, ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ввСсти ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π½ΠΎΠΌΠ΅Ρ€, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π² сСткС. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π·Π°Π½ΡΡ‚ΡŒ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ Π±Π»ΠΎΠΊ, Ρ‚ΠΎΠ³Π΄Π° ΠΌΡ‹ Π²Π²Π΅Π΄Π΅ΠΌ 5 Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π». Π­Ρ‚Ρƒ сСтку ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ:

# Ѐункция для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Tic Tac Toe
def print_tic_tac_toe (значСния):
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ t | |")
print ("\ t {} | {} | {}".Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ (значСния [0], значСния [1], значСния [2]))
print ('\ t _____ | _____ | _____')

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ t | |")
print ("\ t {} | {} | {}". Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ (значСния [3], значСния [4], значСния [5]))
print ('\ t _____ | _____ | _____')

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ t | |")

print ("\ t {} | {} | {}". Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ (значСния [6], значСния [7], значСния [8]))
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ t | |")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")
 

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΊΠΎΠ΄Π΅ функция создаСт Π½Π°ΡˆΡƒ ΠΈΠ³Ρ€Ρƒ Π² крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ Π² соотвСтствии со значСниями, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. Π—Π΄Π΅ΡΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ — это список, содСрТащий статус ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ячСйки Π² сСткС.


Π¨Π°Π³ 2. Π‘ΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ с использованиСм структур Π΄Π°Π½Π½Ρ‹Ρ…

Π’ основС любой ΠΈΠ³Ρ€Ρ‹ Π»Π΅ΠΆΠΈΡ‚ игровая ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠ°. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эту ΠΈΠ³Ρ€Ρƒ довольно Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ, задСйствованная ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠ° Ρ‚Π°ΠΊΠΆΠ΅ проста.

Π’ любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π΄Π²Π΅ Π²Π°ΠΆΠ½Ρ‹Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ:

  • Бтатус сСтки — Π£ нас Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ структура Π΄Π°Π½Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится состояниС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ячСйки, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ занята ΠΎΠ½Π° ΠΈΠ»ΠΈ свободна.
  • Π₯ΠΎΠ΄Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΊΠ°ΠΊΠΈΠΌ-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π·Π½Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡˆΠ»Ρ‹Π΅ ΠΈ настоящиС Ρ…ΠΎΠ΄Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, занятыС 'X' ΠΈ 'O' .

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ОбС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ статус сСтки, Π½ΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π±Ρ‹ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°Ρ‚ΡŒ Π΅Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ ΠΈΠ³Ρ€ΠΎΠΊΠ°. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Π·Π²Π°Ρ‚ΡŒ компромиссом ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ ΠΈ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ пространства. Π­Ρ‚ΠΎ ΠΎΠ±Ρ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ экономии Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

# Ѐункция для ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ Tic Tac Toe
def single_game (cur_player):

# ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ
values ​​= ['' для x Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ (9)]

# БохраняСт ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, занятыС X ΠΈ O
player_pos = {'X': [], 'O': []}
 

Бтатус сСтки управляСтся списком символов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Ρ€ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… значСния,

  • '' — Бвободная ячСйка
  • 'X' — Π―Ρ‡Π΅ΠΉΠΊΠ°, занятая ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ X
  • 'O' — Π―Ρ‡Π΅ΠΉΠΊΠ°, занятая ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ O

Π₯ΠΎΠ΄Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ списка Ρ†Π΅Π»Ρ‹Ρ… чисСл.ΠšΠ»ΡŽΡ‡ΠΈ: 'X' ΠΈ 'O' для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠΌ списки содСрТат Π½ΠΎΠΌΠ΅Ρ€Π°, присвоСнныС ячСйкам сСтки, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½ΠΈ Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ cur_player Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°, Π΄Π΅Π»Π°ΡŽΡ‰Π΅Π³ΠΎ Ρ…ΠΎΠ΄, ΠΊΠ°ΠΊ Π² 'X' ΠΈΠ»ΠΈ 'O' .


Π¨Π°Π³ 3: ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Ρ†ΠΈΠΊΠ»

Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ³Ρ€Π΅ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Ρ†ΠΈΠΊΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ длится Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΈΠ³Ρ€ΠΎΠΊ Π½Π΅ Π²Ρ‹ΠΈΠ³Ρ€Π°Π΅Ρ‚ ΠΈΠ»ΠΈ ΠΈΠ³Ρ€Π° Π½Π΅ закончится Π½ΠΈΡ‡ΡŒΠ΅ΠΉ.Π’ крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ каТдая итСрация Ρ†ΠΈΠΊΠ»Π° относится ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ Ρ…ΠΎΠ΄Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Π»Π°Π΅Ρ‚ любой ΠΈΠ³Ρ€ΠΎΠΊ.

# Game Loop для ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ Tic Tac Toe
Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ True:
print_tic_tac_toe (значСния)
 

Π¨Π°Π³ 4. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π²Π²ΠΎΠ΄Π° ΠΈΠ³Ρ€ΠΎΠΊΠ°

На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ³Ρ€Ρ‹ ΠΈΠ³Ρ€ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ввСсти свой Ρ…ΠΎΠ΄.

# ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ для Π²Π²ΠΎΠ΄Π° MOVE
ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ:
print ("Π˜Π³Ρ€ΠΎΠΊ", cur_player, "ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚. Какой ящик?:", end = "")
ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ = int (Π²Ρ…ΠΎΠ΄ ())
ΠΊΡ€ΠΎΠΌΠ΅ ValueError:
print («НСвСрный Π²Π²ΠΎΠ΄ !!! ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π·Β»)
ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° работоспособности для MOVE inout
Ссли ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ <1 ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅> 9:
print («НСвСрный Π²Π²ΠΎΠ΄ !!! ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π·Β»)
ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π΅ занят Π»ΠΈ ящик
Ссли значСния [move-1]! = '':
print ("ΠœΠ΅ΡΡ‚ΠΎ ΡƒΠΆΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ.ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉ снова!!")
ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ
 

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π±Π»ΠΎΠΊ try Π½Π° случай, Ссли ΠΈΠ³Ρ€ΠΎΠΊ Π²Π²Π΅Π΄Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ Π½Π΅ΠΏΡ€Π΅Π΄Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊΠΎΠ΅ событиС Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΈΠ³Ρ€Ρƒ, поэтому ΠΌΡ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ValueError ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π½Π°ΡˆΡƒ ΠΈΠ³Ρ€Ρƒ.

Нам Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ работоспособности, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ являСтся Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ, ΠΈ Ссли это Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ позиция, ΠΎΠ½Π° ΡƒΠΆΠ΅ занята?


Π¨Π°Π³ 5: ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ

Богласно Π²Π²ΠΎΠ΄Ρƒ ΠΈΠ³Ρ€ΠΎΠΊΠ°, Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для бСспСрСбойной Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈΠ³Ρ€Ρ‹.

# ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΈΠ³Ρ€Π΅

# ОбновлСниС статуса сСтки
значСния [move-1] = cur_player

# ОбновлСниС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ²
player_pos [cur_player] .append (ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ)
 

Бписок Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ обновляСт ячСйку, Π·Π°Π½ΡΡ‚ΡƒΡŽ Π² соотвСтствии с Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ. ΠŸΠΎΠ·ΠΈΡ†ΠΈΡ ΠΈΠ³Ρ€ΠΎΠΊΠ° добавляСт ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ, Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ Π·Π°Π½ΡΡ‚ΡƒΡŽ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠΌ.

ПослС обновлСния списка Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ print_tic_tac_toe () сСтка выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ послС 5 Ρ…ΠΎΠ΄ΠΎΠ².
ПослСдний Ρ…ΠΎΠ΄: Β«XΒ» Π½Π° 2


Π¨Π°Π³ 6: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ ΠΈΠ»ΠΈ Π½ΠΈΡ‡ΡŒΡŽ

ПослС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ…ΠΎΠ΄Π° ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ, Π²Ρ‹ΠΈΠ³Ρ€Π°Π» Π»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ³Ρ€ΠΎΠΊ ΠΏΠ°Ρ€Ρ‚ΠΈΡŽ ΠΈΠ»ΠΈ ΠΈΠ³Ρ€Π° Π±Ρ‹Π»Π° сдСлана Π²Π½ΠΈΡ‡ΡŒΡŽ. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΏΠΎ:

Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ:

# Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ°
Ссли check_win (player_pos, cur_player):
print_tic_tac_toe (значСния)
print ("Π˜Π³Ρ€ΠΎΠΊ", cur_player, "Π²Ρ‹ΠΈΠ³Ρ€Π°Π» ΠΈΠ³Ρ€Ρƒ !!")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ cur_player

# Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€ΠΎΠ·Ρ‹Π³Ρ€Ρ‹ΡˆΠ° ΠΈΠ³Ρ€Ρ‹
Ссли check_draw (player_pos):
print_tic_tac_toe (значСния)
print ("Π˜Π³Ρ€Π° нарисована")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ 'D'
 

Если ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚, функция single_game () Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сдСлал Ρ…ΠΎΠ΄.Π’ случаС Π½ΠΈΡ‡ΡŒΠ΅ΠΉ, 'D' отправляСтся ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

# Ѐункция, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π²Ρ‹ΠΈΠ³Ρ€Π°Π» Π»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ³Ρ€ΠΎΠΊ
def check_win (player_pos, cur_player):

# ВсС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ
soln = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 4, 7], [2, 5, 8], [3, 6, 9] Β» , [1, 5, 9], [3, 5, 7]]

# Π¦ΠΈΠΊΠ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€Π΅Π½Π° Π»ΠΈ какая-Π»ΠΈΠ±ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Π°Ρ комбинация
для x в soln:
Ссли всС (y в player_pos [cur_player] для y в x):

# Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ True, Ссли удовлСтворяСт любая Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Π°Ρ комбинация
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ True
# Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ False, Ссли комбинация Π½Π΅ удовлСтворяСт
return False

# Ѐункция ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, нарисована Π»ΠΈ ΠΈΠ³Ρ€Π°
def check_draw (player_pos):
Ссли len (player_pos ['X']) + len (player_pos ['O']) == 9:
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ True
return False
 

check_win () — Ѐункция содСрТит всС Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ.ВсС, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚, это провСряСт, удовлСтворяСтся Π»ΠΈ какая-Π»ΠΈΠ±ΠΎ ΠΈΠ· Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Ρ… ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΌΠΈ позициями ΠΈΠ³Ρ€ΠΎΠΊΠ°. Если это Ρ‚Π°ΠΊ, ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ True . Если Π½ΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΉ Π½Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€Π΅Π½Π°, функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ False .

check_draw () — УсловиС Ρ€ΠΎΠ·Ρ‹Π³Ρ€Ρ‹ΡˆΠ° довольно простоС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΠ³Ρ€Π° заканчиваСтся, ΠΊΠΎΠ³Π΄Π° всС Β«Π΄Π΅Π²ΡΡ‚ΡŒΒ» ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ заняты.


Π¨Π°Π³ 7: ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ³Ρ€ΠΎΠΊ двиТСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π·Π° Ρ€Π°Π·, поэтому послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Ρ…ΠΎΠ΄Π° ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΌΠ΅Π½ΡΡ‚ΡŒ мСстами Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°.

# Π‘ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ…ΠΎΠ΄Ρ‹ ΠΈΠ³Ρ€ΠΎΠΊΠ°
Ссли cur_player == 'X':
cur_player = 'О'
Π΅Ρ‰Π΅:
cur_player = 'X'
 

Π§Ρ‚ΠΎ касаСтся ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹, это всС, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Но Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ прСдставлСна ​​систСма Ρ‚Π°Π±Π»ΠΎ для отслСТивания, Ссли ΠΈΠ³Ρ€ΠΎΠΊΠΈ хотят ΡΡ‹Π³Ρ€Π°Ρ‚ΡŒ Π² нСсколько ΠΈΠ³Ρ€.


Π¨Π°Π³ 8: Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΈΠΌΠ΅Π½Π° ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ²

Имя ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ° ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° любом Ρ‚Π°Π±Π»ΠΎ.

Ссли __name__ == "__main__":

print ("Π˜Π³Ρ€ΠΎΠΊ 1")
player1 = input ("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ имя:")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")

print ("Π˜Π³Ρ€ΠΎΠΊ 2")
player2 = input ("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ имя:")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")
 

Π¨Π°Π³ 9: Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΈΠ³Ρ€Π΅

Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ, такая ΠΊΠ°ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ, Π²Ρ‹Π±ΠΎΡ€ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² (Π²Π·ΡΡ‚ΡŒ крСстик ΠΈΠ»ΠΈ ноль), доступныС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ (крСстик ΠΈ ноль) ΠΈ Ρ‚Π°Π±Π»ΠΎ, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сохранСны.

# БохраняСт ΠΈΠ³Ρ€ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ X ΠΈ O
cur_player = player1

# Π₯Ρ€Π°Π½ΠΈΡ‚ Π²Ρ‹Π±ΠΎΡ€ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ²
player_choice = {'X': "", 'O': ""}

# БохраняСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
options = ['X', 'O']

# Π₯Ρ€Π°Π½ΠΈΡ‚ Ρ‚Π°Π±Π»ΠΎ
score_board = {player1: 0, player2: 0}
 

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ — это ΠΈΠ³Ρ€ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π²Π²Π΅Π» имя.


Π¨Π°Π³ 10: Π”ΠΈΠ·Π°ΠΉΠ½ Ρ‚Π°Π±Π»ΠΎ

Π’Π°Π±Π»ΠΎ хранится Π² Π²ΠΈΠ΄Π΅ словаря, Π³Π΄Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ — это ΠΈΠΌΠ΅Π½Π° ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ², Π° значСния — ΠΈΡ… Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Π΅ числа.

# Ѐункция для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Ρ‚Π°Π±Π»ΠΎ
def print_scoreboard (score_board):
Π Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ("--------------------------------")
print ("Π”ΠžΠ‘ΠšΠ Π‘Π§Π•Π’ΠžΠ’")
Π Π°ΡΠΏΠ΅Ρ‡Π°Ρ‚Π°Ρ‚ΡŒ("--------------------------------")

ΠΈΠ³Ρ€ΠΎΠΊΠΈ = список (score_board.keys ())
print ("", ΠΈΠ³Ρ€ΠΎΠΊΠΈ [0], "", Score_board [ΠΈΠ³Ρ€ΠΎΠΊΠΈ [0]])
print ("", ΠΈΠ³Ρ€ΠΎΠΊΠΈ [1], "", Score_board [ΠΈΠ³Ρ€ΠΎΠΊΠΈ [1]])

print ("-------------------------------- \ n")
 

Для отобраТСния Ρ‚Π°Π±Π»ΠΎ Π½Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Π½Π° ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ². ΠšΠ»ΡŽΡ‡ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ .keys () , Π° Π·Π°Ρ‚Π΅ΠΌ прСобразуСтся Π² список, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ ΠΎΡ†Π΅Π½ΠΎΠΊ.


Π¨Π°Π³ 11: Π’Π½Π΅ΡˆΠ½ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Ρ†ΠΈΠΊΠ»

Нам Π½ΡƒΠΆΠ΅Π½ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Ρ†ΠΈΠΊΠ», для управлСния мноТСством ΠΌΠ°Ρ‚Ρ‡Π΅ΠΉ Π² крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠ°Ρ‚Ρ‡ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ свою ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΡƒ ( 'X' ΠΈΠ»ΠΈ 'O' ). МСню Π²Ρ‹Π±ΠΎΡ€Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ³Ρ€Ρ‹:

# Game Loop для сСрии Tic Tac Toe
# Π¦ΠΈΠΊΠ» продолТаСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΈΠ³Ρ€ΠΎΠΊΠΈ Π½Π΅ Π²Ρ‹ΠΉΠ΄ΡƒΡ‚
Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ True:

# МСню Π²Ρ‹Π±ΠΎΡ€Π° ΠΈΠ³Ρ€ΠΎΠΊΠ°
print ("ΠŸΠΎΠ²Π΅Ρ€Π½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ", cur_player)
print ("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 1 для X")
print ("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 2 вмСсто O")
print (Β«Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 3, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈΒ»)
 

Π’Π°Π±Π»ΠΎ ΠΈ мСню выглядят Ρ‚Π°ΠΊ:

Вабло и мСню


Π¨Π°Π³ 12: ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²Ρ‹Π±ΠΎΡ€Π° ΠΈΠ³Ρ€ΠΎΠΊΠ°

На ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΈΠ³Ρ€ΠΎΠΊΠ°.

# ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ для Π²Π²ΠΎΠ΄Π° CHOICE
ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ:
Π²Ρ‹Π±ΠΎΡ€ = int (Π²Ρ…ΠΎΠ΄ ())
ΠΊΡ€ΠΎΠΌΠ΅ ValueError:
print ("ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π²ΠΎΠ΄ !!! ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π· \ n")
ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ

# Условия Π²Ρ‹Π±ΠΎΡ€Π° ΠΈΠ³Ρ€ΠΎΠΊΠ°
Ссли Π²Ρ‹Π±ΠΎΡ€ == 1:
player_choice ['X'] = cur_player
Ссли cur_player == player1:
player_choice ['O'] = player2
Π΅Ρ‰Π΅:
player_choice ['O'] = player1

elif choice == 2:
player_choice ['O'] = cur_player
Ссли cur_player == player1:
player_choice ['X'] = player2
Π΅Ρ‰Π΅:
player_choice ['X'] = player1

elif choice == 3:
print ("ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹")
print_scoreboard (Ρ‚Π°Π±Π»ΠΎ_счСтов)
ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ

Π΅Ρ‰Π΅:
print ("ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ !!!! ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ снова \ n")
 

По Π²Ρ‹Π±ΠΎΡ€Ρƒ ΠΈΠ³Ρ€ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Π΅ сохранСны.Π­Ρ‚ΠΎ Π²Π°ΠΆΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ ΠΌΡ‹ ΡƒΠ·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠ³Ρ€ΠΎΠΊ Π²Ρ‹ΠΈΠ³Ρ€Π°Π».


Π¨Π°Π³ 13: Π’Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сопоставлСниС

ПослС сохранСния всСй Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΏΠΎΡ€Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ нСзависимый ΠΌΠ°Ρ‚Ρ‡ ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹ΠΉ Π·Π½Π°ΠΊ.

# БохраняСт побСдитСля Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ³Ρ€Π΅ Π² крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ
ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ = single_game (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ [Π²Ρ‹Π±ΠΎΡ€-1])
 

Π¨Π°Π³ 14: ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Ρ‚Π°Π±Π»ΠΎ

Нам Π½ΡƒΠΆΠ½ΠΎ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Ρ‚Π°Π±Π»ΠΎ послС ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ°Ρ‚Ρ‡Π° крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ.

# ΠžΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ‚ Ρ‚Π°Π±Π»ΠΎ Π² соотвСтствии с ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΌ
Ссли ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ! = 'D':
player_won = player_choice [ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ]
Score_board [player_won] = Score_board [player_won] + 1

print_scoreboard (Ρ‚Π°Π±Π»ΠΎ_счСтов)
 

Если ΠΈΠ³Ρ€Π° Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π°ΡΡŒ Π²Π½ΠΈΡ‡ΡŒΡŽ, Ρ‚ΠΎ обновляСм Ρ‚Π°Π±Π»ΠΎ.


Π¨Π°Π³ 15: Π‘ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠ°

Π­Ρ‚ΠΎ прСкрасная идСя, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ³Ρ€ΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ Π·Π½Π°ΠΊ ΠΎΠ½ Ρ…ΠΎΡ‡Π΅Ρ‚. Для этого мСняСм мСстами Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² cur_player .

# Π‘ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ X ΠΈΠ»ΠΈ O
Ссли cur_player == player1:
cur_player = player2
Π΅Ρ‰Π΅:
cur_player = player1
 

ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠΎΠ΄

# Ѐункция для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Tic Tac Toe
def print_tic_tac_toe (значСния):
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ t | |")
print ("\ t {} | {} | {}". Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ (значСния [0], значСния [1], значСния [2]))
print ('\ t _____ | _____ | _____')

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ t | |")
print ("\ t {} | {} | {}". Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ (значСния [3], значСния [4], значСния [5]))
print ('\ t _____ | _____ | _____')

ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ t | |")

print ("\ t {} | {} | {}".Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ (значСния [6], значСния [7], значСния [8]))
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ t | |")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")


# Ѐункция для ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ Ρ‚Π°Π±Π»ΠΎ
def print_scoreboard (score_board):
print ("\ t --------------------------------")
print ("\ t Π”ΠžΠ‘ΠšΠ Π‘Π§Π•Π’ΠžΠ’")
print ("\ t --------------------------------")

ΠΈΠ³Ρ€ΠΎΠΊΠΈ = список (score_board.keys ())
print ("\ t", ΠΈΠ³Ρ€ΠΎΠΊΠΈ [0], "\ t", Ρ‚Π°Π±Π»ΠΎ [ΠΈΠ³Ρ€ΠΎΠΊΠΈ [0]])
print ("\ t", ΠΈΠ³Ρ€ΠΎΠΊΠΈ [1], "\ t", Ρ‚Π°Π±Π»ΠΎ [ΠΈΠ³Ρ€ΠΎΠΊΠΈ [1]])

print ("\ t -------------------------------- \ n")

# Ѐункция, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π²Ρ‹ΠΈΠ³Ρ€Π°Π» Π»ΠΈ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΈΠ³Ρ€ΠΎΠΊ
def check_win (player_pos, cur_player):

# ВсС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ
soln = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [1, 4, 7], [2, 5, 8], [3, 6, 9] Β» , [1, 5, 9], [3, 5, 7]]

# Π¦ΠΈΠΊΠ», Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€Π΅Π½Π° Π»ΠΈ какая-Π»ΠΈΠ±ΠΎ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Π°Ρ комбинация
для x в soln:
Ссли всС (y в player_pos [cur_player] для y в x):

# Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ True, Ссли удовлСтворяСт любая Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ½Π°Ρ комбинация
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ True
# Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ False, Ссли комбинация Π½Π΅ удовлСтворяСт
return False

# Ѐункция ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ, нарисована Π»ΠΈ ΠΈΠ³Ρ€Π°
def check_draw (player_pos):
Ссли len (player_pos ['X']) + len (player_pos ['O']) == 9:
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ True
return False

# Ѐункция для ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ Tic Tac Toe
def single_game (cur_player):

# ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΠ΅Ρ‚ крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ
values ​​= ['' для x Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ (9)]

# БохраняСт ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, занятыС X ΠΈ O
player_pos = {'X': [], 'O': []}

# Game Loop для ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ³Ρ€Ρ‹ Tic Tac Toe
Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ True:
print_tic_tac_toe (значСния)

# ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΡƒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ для Π²Π²ΠΎΠ΄Π° MOVE
ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ:
print ("Π˜Π³Ρ€ΠΎΠΊ", cur_player, "ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚.Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : ", end =" ")
ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ = int (Π²Ρ…ΠΎΠ΄ ())
ΠΊΡ€ΠΎΠΌΠ΅ ValueError:
print («НСвСрный Π²Π²ΠΎΠ΄ !!! ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π·Β»)
ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° работоспособности для MOVE inout
Ссли ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ <1 ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅> 9:
print («НСвСрный Π²Π²ΠΎΠ΄ !!! ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π·Β»)
ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ

# ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Π½Π΅ занят Π»ΠΈ ящик
Ссли значСния [move-1]! = '':
print (Β«ΠœΠ΅ΡΡ‚ΠΎ ΡƒΠΆΠ΅ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΎ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π· !!Β»)
ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ

# ΠžΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΈΠ³Ρ€Π΅

# ОбновлСниС статуса сСтки
значСния [move-1] = cur_player

# ОбновлСниС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ²
player_pos [cur_player].Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ (ΠΏΠ΅Ρ€Π΅ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ)

# Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ°
Ссли check_win (player_pos, cur_player):
print_tic_tac_toe (значСния)
print ("Π˜Π³Ρ€ΠΎΠΊ", cur_player, "Π²Ρ‹ΠΈΠ³Ρ€Π°Π» ΠΈΠ³Ρ€Ρƒ !!")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ cur_player

# Π’Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€ΠΎΠ·Ρ‹Π³Ρ€Ρ‹ΡˆΠ° ΠΈΠ³Ρ€Ρ‹
Ссли check_draw (player_pos):
print_tic_tac_toe (значСния)
print ("Π˜Π³Ρ€Π° нарисована")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")
Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ 'D'

# Π‘ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ…ΠΎΠ΄Ρ‹ ΠΈΠ³Ρ€ΠΎΠΊΠ°
Ссли cur_player == 'X':
cur_player = 'О'
Π΅Ρ‰Π΅:
cur_player = 'X'

Ссли __name__ == "__main__":

print ("Π˜Π³Ρ€ΠΎΠΊ 1")
player1 = input ("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ имя:")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")

print ("Π˜Π³Ρ€ΠΎΠΊ 2")
player2 = input ("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ имя:")
ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ("\ ΠΏ")

# БохраняСт ΠΈΠ³Ρ€ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ X ΠΈ O
cur_player = player1

# Π₯Ρ€Π°Π½ΠΈΡ‚ Π²Ρ‹Π±ΠΎΡ€ ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ²
player_choice = {'X': "", 'O': ""}

# БохраняСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹
options = ['X', 'O']

# Π₯Ρ€Π°Π½ΠΈΡ‚ Ρ‚Π°Π±Π»ΠΎ
score_board = {player1: 0, player2: 0}
print_scoreboard (Ρ‚Π°Π±Π»ΠΎ_счСтов)

# Game Loop для сСрии Tic Tac Toe
# Π¦ΠΈΠΊΠ» продолТаСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° ΠΈΠ³Ρ€ΠΎΠΊΠΈ Π½Π΅ Π²Ρ‹ΠΉΠ΄ΡƒΡ‚
Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ True:

# МСню Π²Ρ‹Π±ΠΎΡ€Π° ΠΈΠ³Ρ€ΠΎΠΊΠ°
print ("ΠŸΠΎΠ²Π΅Ρ€Π½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ", cur_player)
print ("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 1 для X")
print ("Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 2 вмСсто O")
print (Β«Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 3, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈΒ»)

# ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ для Π²Π²ΠΎΠ΄Π° CHOICE
ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ:
Π²Ρ‹Π±ΠΎΡ€ = int (Π²Ρ…ΠΎΠ΄ ())
ΠΊΡ€ΠΎΠΌΠ΅ ValueError:
print ("ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Π²ΠΎΠ΄ !!! ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ Π΅Ρ‰Π΅ Ρ€Π°Π· \ n")
ΠŸΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ

# Условия Π²Ρ‹Π±ΠΎΡ€Π° ΠΈΠ³Ρ€ΠΎΠΊΠ°
Ссли Π²Ρ‹Π±ΠΎΡ€ == 1:
player_choice ['X'] = cur_player
Ссли cur_player == player1:
player_choice ['O'] = player2
Π΅Ρ‰Π΅:
player_choice ['O'] = player1

elif choice == 2:
player_choice ['O'] = cur_player
Ссли cur_player == player1:
player_choice ['X'] = player2
Π΅Ρ‰Π΅:
player_choice ['X'] = player1

elif choice == 3:
print ("ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹")
print_scoreboard (Ρ‚Π°Π±Π»ΠΎ_счСтов)
ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ

Π΅Ρ‰Π΅:
print ("ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ !!!! ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠΉΡ‚Π΅ снова \ n")

# БохраняСт побСдитСля Π² ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ ΠΈΠ³Ρ€Π΅ Tic Tac Toe
ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ = single_game (Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ [Π²Ρ‹Π±ΠΎΡ€-1])

# Π Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ‚Π°Π±Π»ΠΎ Π² соотвСтствии с ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΌ
Ссли ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ! = 'D':
player_won = player_choice [ΠΏΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»ΡŒ]
Score_board [player_won] = Score_board [player_won] + 1

print_scoreboard (Ρ‚Π°Π±Π»ΠΎ_счСтов)
# Π‘ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ X ΠΈΠ»ΠΈ O
Ссли cur_player == player1:
cur_player = player2
Π΅Ρ‰Π΅:
cur_player = player1
 

ΠŸΠΎΡ€Π° ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ!

ВсС шаги ΠΏΠΎ созданию ΠΈΠ³Ρ€Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Ρ‹.ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΠΎΠΈΠ³Ρ€Π°Ρ‚ΡŒ Π² ΠΈΠ³Ρ€Ρƒ.

Π˜Π³Ρ€ΠΎΠΊ 1
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ имя: Π›ΡƒΡ„Ρ„ΠΈ


Π˜Π³Ρ€ΠΎΠΊ 2
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ имя: Π‘Π°Π½Π΄ΠΆΠΈ


--------------------------------
Π’ΠΠ‘Π›Πž
--------------------------------
Π›ΡƒΡ„Ρ„ΠΈ 0
Π‘Π°Π½Π΄ΠΆΠΈ 0
--------------------------------

ΠŸΠΎΠ²Π΅Ρ€Π½ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π›ΡƒΡ„Ρ„ΠΈ
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 1 для X
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 2 для O
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 3, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈ
1


| |
| |
_____ | _____ | _____
| |
| |
_____ | _____ | _____
| |
| |
| |


Π˜Π³Ρ€ΠΎΠΊ X Ρ…ΠΎΠ΄.Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 5


| |
| |
_____ | _____ | _____
| |
| X |
_____ | _____ | _____
| |
| |
| |


Π˜Π³Ρ€ΠΎΠΊ O Ρ…ΠΎΠ΄. Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 1


| |
O | |
_____ | _____ | _____
| |
| X |
_____ | _____ | _____
| |
| |
| |


Π˜Π³Ρ€ΠΎΠΊ X Ρ…ΠΎΠ΄. Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 9


| |
O | |
_____ | _____ | _____
| |
| X |
_____ | _____ | _____
| |
| | Икс
| |


Π˜Π³Ρ€ΠΎΠΊ O Ρ…ΠΎΠ΄.Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 2


| |
O | O |
_____ | _____ | _____
| |
| X |
_____ | _____ | _____
| |
| | Икс
| |


Π˜Π³Ρ€ΠΎΠΊ X Ρ…ΠΎΠ΄. Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 3


| |
O | O | Икс
_____ | _____ | _____
| |
| X |
_____ | _____ | _____
| |
| | Икс
| |


Π˜Π³Ρ€ΠΎΠΊ O Ρ…ΠΎΠ΄. Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 7


| |
O | O | Икс
_____ | _____ | _____
| |
| X |
_____ | _____ | _____
| |
O | | Икс
| |


Π˜Π³Ρ€ΠΎΠΊ X Ρ…ΠΎΠ΄.Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 6


| |
O | O | Икс
_____ | _____ | _____
| |
| X | Икс
_____ | _____ | _____
| |
O | | Икс
| |


Π˜Π³Ρ€ΠΎΠΊ X Π²Ρ‹ΠΈΠ³Ρ€Π°Π» ΠΈΠ³Ρ€Ρƒ !!


--------------------------------
Π’ΠΠ‘Π›Πž
--------------------------------
Π›ΡƒΡ„Ρ„ΠΈ 1
Π‘Π°Π½Π΄ΠΆΠΈ 0
--------------------------------

ΠŸΠΎΠ²Π΅Ρ€Π½ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π‘Π°Π½Π΄ΠΆΠΈ
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 1 для X
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 2 для O
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 3, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈ
2


| |
| |
_____ | _____ | _____
| |
| |
_____ | _____ | _____
| |
| |
| |


Π˜Π³Ρ€ΠΎΠΊ O Ρ…ΠΎΠ΄.Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 5


| |
| |
_____ | _____ | _____
| |
| O |
_____ | _____ | _____
| |
| |
| |


Π˜Π³Ρ€ΠΎΠΊ X Ρ…ΠΎΠ΄. Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 3


| |
| | Икс
_____ | _____ | _____
| |
| O |
_____ | _____ | _____
| |
| |
| |


Π˜Π³Ρ€ΠΎΠΊ O Ρ…ΠΎΠ΄. Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 2


| |
| O | Икс
_____ | _____ | _____
| |
| O |
_____ | _____ | _____
| |
| |
| |


Π˜Π³Ρ€ΠΎΠΊ X Ρ…ΠΎΠ΄.Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 8


| |
| O | Икс
_____ | _____ | _____
| |
| O |
_____ | _____ | _____
| |
| X |
| |


Π˜Π³Ρ€ΠΎΠΊ O Ρ…ΠΎΠ΄. Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 1


| |
O | O | Икс
_____ | _____ | _____
| |
| O |
_____ | _____ | _____
| |
| X |
| |


Π˜Π³Ρ€ΠΎΠΊ X Ρ…ΠΎΠ΄. Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 9


| |
O | O | Икс
_____ | _____ | _____
| |
| O |
_____ | _____ | _____
| |
| X | Икс
| |


Π˜Π³Ρ€ΠΎΠΊ O Ρ…ΠΎΠ΄.Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 6


| |
O | O | Икс
_____ | _____ | _____
| |
| O | О
_____ | _____ | _____
| |
| X | Икс
| |


Π˜Π³Ρ€ΠΎΠΊ X Ρ…ΠΎΠ΄. Какая ΠΊΠΎΡ€ΠΎΠ±ΠΊΠ°? : 7


| |
O | O | Икс
_____ | _____ | _____
| |
| O | О
_____ | _____ | _____
| |
X | X | Икс
| |


Π˜Π³Ρ€ΠΎΠΊ X Π²Ρ‹ΠΈΠ³Ρ€Π°Π» ΠΈΠ³Ρ€Ρƒ !!


--------------------------------
Π’ΠΠ‘Π›Πž
--------------------------------
Π›ΡƒΡ„Ρ„ΠΈ 2
Π‘Π°Π½Π΄ΠΆΠΈ 0
--------------------------------

ΠŸΠΎΠ²Π΅Ρ€Π½ΠΈΡΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π›ΡƒΡ„Ρ„ΠΈ
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 1 для X
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 2 для O
Π’Π²Π΅Π΄ΠΈΡ‚Π΅ 3, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΠΉΡ‚ΠΈ
3
ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹
--------------------------------
Π’ΠΠ‘Π›Πž
--------------------------------
Π›ΡƒΡ„Ρ„ΠΈ 2
Π‘Π°Π½Π΄ΠΆΠΈ 0
--------------------------------
 


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

ΠœΡ‹ надССмся, Ρ‡Ρ‚ΠΎ эта ΡΡ‚Π°Ρ‚ΡŒΡ Π±Ρ‹Π»Π° интСрСсной ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠ²Π½ΠΎΠΉ для читатСля.Π― Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΠ» ΠΊΠΎΠ΄ Π½Π° Github. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚ΡŒ здСсь для получСния ΠΊΠΎΠ΄Π°. Если Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ прСдлоТСния ΠΏΠΎ ΠΈΠ³Ρ€Π΅, Π½Π΅ ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.


.

Π˜Π³Ρ€Π° Β«ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈΒ» Π½Π° Python

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я ΠΏΠΎΠΊΠ°ΠΆΡƒ Π²Π°ΠΌ, ΠΊΠ°ΠΊ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΈΠ³Ρ€Ρƒ Β«ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈΒ» Π² консольном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ C #.

Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

ΠšΡ€Π΅ΡΡ‚ΠΈΠΊΠΈ-Π½ΠΎΠ»ΠΈΠΊΠΈ — ΠΎΡ‡Π΅Π½ΡŒ простая ΠΈΠ³Ρ€Π° для Π΄Π²ΡƒΡ… ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ². Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° ΠΈΠ³Ρ€ΠΎΠΊΠ°. Π­Ρ‚Π° ΠΈΠ³Ρ€Π° Ρ‚Π°ΠΊΠΆΠ΅ извСстна ΠΊΠ°ΠΊ «крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈΒ» ΠΈΠ»ΠΈ «крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈΒ». Один ΠΈΠ³Ρ€ΠΎΠΊ ΠΈΠ³Ρ€Π°Π΅Ρ‚ с X, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ — с O. Π’ этой ΠΈΠ³Ρ€Π΅ Ρƒ нас Π΅ΡΡ‚ΡŒ доска, состоящая ΠΈΠ· сСтки 3×3. ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ сСток ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΎ.

Доска Π² крСстики-Π½ΠΎΠ»ΠΈΠΊΠΈ выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

ΠŸΡ€Π°Π²ΠΈΠ»Π° ΠΈΠ³Ρ€Ρ‹

  1. Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΈΠ³Ρ€ΠΎΠΊ ΠΈΠ³Ρ€Π°Π΅Ρ‚ с Β«Π₯Β». Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, ΠΊΡ‚ΠΎ Ρ…ΠΎΡ‡Π΅Ρ‚ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Β«XΒ», Π° ΠΊΡ‚ΠΎ — Β«OΒ».
  2. Волько ΠΎΠ΄ΠΈΠ½ ΠΈΠ³Ρ€ΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.
  3. Если ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΈΠ· ΠΈΠ³Ρ€ΠΎΠΊΠΎΠ² Π·Π°ΠΏΠΎΠ»Π½ΠΈΠ» ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚, Ρ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ³Ρ€ΠΎΠΊ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΈΠ³Ρ€ΠΎΠΊ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΠΌΠ΅Π½ΠΈΡ‚ΡŒ этот ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚.
  4. Π•ΡΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²Π° условия, ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ Π½ΠΈΡ‡ΡŒΡ ΠΈΠ»ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ±Π΅Π΄Π°.
  5. Π˜Π³Ρ€ΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ удастся Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ‚Ρ€ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°ΠΊΠ° (X ΠΈΠ»ΠΈ O) Π² Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΌ, Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠΌ ΠΈΠ»ΠΈ диагональном ряду, Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ³Ρ€Ρƒ.

УсловиС Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ°

ΠŸΠΎΠ±Π΅Π΄ΠΈΡ‚Π΅Π»Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΡ‚, ΠΊΡ‚ΠΎ поставит Ρ‚Ρ€ΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΊΠΈ (X ΠΈΠ»ΠΈ O) ΠΏΠΎ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΠΈ, Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΠΈ ΠΈΠ»ΠΈ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ.

Код для ΠΈΠ³Ρ€Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ:

  1. import os
  2. import time
  3. board = [», », », », », », », ‘ ‘,’ ‘,’ ‘]
  4. player = 1
  5. ######## Ρ„Π»Π°Π³ΠΈ win ##########
  6. Win = 1
  7. Draw = -1
  8. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ = 0
  9. Π‘Ρ‚ΠΎΠΏ = 1
  10. ###################################
  11. Π˜Π³Ρ€Π° = Запуск
  12. ΠžΡ‚ΠΌΠ΅Ρ‚ΠΊΠ° = ‘X’
  13. # Π­Ρ‚Π° функция рисуСт ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅
  14. def DrawBoard ():
  15. print («% c |% c |% c»% (доска [1], доска [2], доска [3]))
  16. print («___ | ___ | ___»)
  17. print («% c |% c |% c»% (доска [4], доска [5], доска [6]))
  18. print («___ | ___ | ___ «)
  19. ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ («% c |% c |% c «% (доска [7], доска [8], доска [9]))
  20. ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ (» | | «)
  21. 9001 5

  22. # Π­Ρ‚Π° функция провСряСт ΠΏΡƒΡΡ‚ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΈΠ»ΠΈ Π½Π΅Ρ‚
  23. def CheckPosition (x):
  24. if (board [x] == »):
  25. return True
  26. else:
  27. return False
  28. # Π­Ρ‚Π° функция провСряСт, Π²Ρ‹ΠΈΠ³Ρ€Π°Π» Π»ΠΈ ΠΈΠ³Ρ€ΠΎΠΊ
  29. def CheckWin ():
  30. global Game
  31. # Π“ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ условиС Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ°
  32. if (board [1] == board [2] and board [2] == board [3] ] И доска [1]! = »):
  33. Game = Win
  34. elif (доска [4] == доска [5] ΠΈ доска [5] == доска [6] ΠΈ доска [4]! = ‘ ‘):
  35. Game = Win
  36. elif (доска [7] == доска [8] ΠΈ доска [8] == доска [9] ΠΈ доска [7]! =’ ‘):
  37. Game = Win
  38. # Π’Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΠ΅ условиС Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ°
  39. elif (доска [1] == доска [4] ΠΈ доска [4] == доска [7] ΠΈ доска [1]! = »): 90 016
  40. Game = Win
  41. elif (доска [2] == доска [5] ΠΈ доска [5] == доска [8] ΠΈ доска [2]! = »):
  42. Game = Win
  43. elif ( доска [3] == доска [6] ΠΈ доска [6] == доска [9] ΠΈ доска [3]! = »):
  44. Game = Win
  45. #Diagonal Winning Condition
  46. elif (board [1 ] == доска [5] ΠΈ доска [5] == доска [9] ΠΈ доска [5]! = »):
  47. Game = Win
  48. elif (доска [3] == доска [5] ΠΈ доска [5] == доска [7] ΠΈ доска [5]! = »):
  49. Game = Win
  50. # Match Tie or Draw Condition
  51. elif (board [1]! = » And board [2] ! = » And board [3]! = » And board [4]! = » And board [5]! = » And board [6]! = » And board [7]! = » И board [8]! = » ΠΈ board [9]! = »):
  52. Game = Draw
  53. else:
  54. Game = Запуск
  55. print («Ti Π˜Π³Ρ€Π° c-Tac-Toe, разработанная Π‘ΡƒΡ€Π°Π±ΠΎΠΌ Π‘ΠΎΠΌΠ°Π½ΠΈ Β»)
  56. print (Β« Π˜Π³Ρ€ΠΎΠΊ 1 [X] — Π˜Π³Ρ€ΠΎΠΊ 2 [O] \ n Β»)
  57. print ()
  58. print ()
  59. print (Β« ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π° ΠŸΠΎΠ΄ΠΎΠΆΠ΄ΠΈΡ‚Π΅… «)
  60. time.sleep (3)
  61. while (Game == Running):
  62. os.system (‘cls’)
  63. DrawBoard ()
  64. if (player% 2! = 0):
  65. print (Β«Π’Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠ° 1Β»)
  66. Mark = ‘X’
  67. else:
  68. print (Β«Π’Π΅Ρ€ΠΎΡΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΈΠ³Ρ€ΠΎΠΊΠ° 2Β»)
  69. Mark = ‘O’
  70. choice = int (input (Β«Π’Π²Π΅Π΄ΠΈΡ‚Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΌΠ΅ΠΆΠ΄Ρƒ [1-9] Π³Π΄Π΅ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ: «))
  71. if (CheckPosition (choice)):
  72. board [choice] = Mark
  73. player + = 1
  74. CheckWin ()
  75. os.system (‘cls’)
  76. DrawBoard ()
  77. if (Game == Draw):
  78. print (Β«Game DrawΒ»)
  79. elif (Game == Win):
  80. player- = 1
  81. if ( player% 2! = 0):
  82. print (Β«Π˜Π³Ρ€ΠΎΠΊ 1 Π²Ρ‹ΠΈΠ³Ρ€Π°Π»Β»)
  83. else:
  84. print (Β«Π˜Π³Ρ€ΠΎΠΊ 2 Π²Ρ‹ΠΈΠ³Ρ€Π°Π»Β»)

Π’Ρ‹Π²ΠΎΠ΄

.

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *