Найти тему

Программируем на Python: создаём игру "Крестики-Нолики"

Здравствуйте, дорогие друзья. На нашем канале мы уже создавали большое количество игр на языке программирования Python: "Камень, ножницы, бумага", "Бросок кубика", "Угадай число", "Змейка", китайскую игру "Ним" и "Тетрис". Ссылки на описание каждой игры будут в конце этой статьи.
Но сегодня мы напишем одну из самых известных и увлекательных игр - "Крестики-Нолики". В начале рассмотрим сам код с комментариями на скриншотах, а потом продублируем его в текстовом варианте.

Часть 1
Часть 1
Часть 2
Часть 2
Часть 3
Часть 3

А теперь для удобства, чтобы вы смогли скопировать себе код, мы дублируем его в текстовом варианте:

from tkinter import *

import random

root = Tk()

root.title('Крестики-нолики')

game_run = True

pole = []

kolvo_figur = 0

def new_game():

for row in range(3):

for col in range(3):

pole[row][col]['text'] = ' '

pole[row][col]['background'] = 'lavender'

global game_run

game_run = True

global kolvo_figur

kolvo_figur = 0

def click(row, col):

if game_run and pole[row][col]['text'] == ' ':

pole[row][col]['text'] = 'X'

global kolvo_figur

kolvo_figur += 1

check_win('X')

if game_run and kolvo_figur < 5:

computer_move()

check_win('O')

def check_win(smb):

for n in range(3):

check_line(pole[n][0], pole[n][1], pole[n][2], smb)

check_line(pole[0][n], pole[1][n], pole[2][n], smb)

check_line(pole[0][0], pole[1][1], pole[2][2], smb)

check_line(pole[2][0], pole[1][1], pole[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

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(pole[n][0], pole[n][1], pole[n][2], 'O'):

return

if can_win(pole[0][n], pole[1][n], pole[2][n], 'O'):

return

if can_win(pole[0][0], pole[1][1], pole[2][2], 'O'):

return

if can_win(pole[2][0], pole[1][1], pole[0][2], 'O'):

return

for n in range(3):

if can_win(pole[n][0], pole[n][1], pole[n][2], 'X'):

return

if can_win(pole[0][n], pole[1][n], pole[2][n], 'X'):

return

if can_win(pole[0][0], pole[1][1], pole[2][2], 'X'):

return

if can_win(pole[2][0], pole[1][1], pole[0][2], 'X'):

return

while True:

row = random.randint(0, 2)

col = random.randint(0, 2)

if pole[row][col]['text'] == ' ':

pole[row][col]['text'] = 'O'

break

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)

pole.append(line)

new_button = Button(root, text='Новая игра', command=new_game)

new_button.grid(row=3, column=0, columnspan=3, sticky='nsew')

root.mainloop()

А вот так выглядит графический интерфейс самой игры, да он примитивен, но большего и не надо:

Крестики-Нолики
Крестики-Нолики

Наша очередная компьютерная игра готова. Как вы видите ничего сложного.
На этом у меня на сегодня всё. Также предлагаю подписаться на наш Ютуб-канал
ПиМ [ZveKa]. До новых встреч на просторах Яндекс Дзена.

Программируем на Python: пишем китайскую игру "Ним"

Программируем на Python: создаём игру "Змейка"

Программируем на Python: создаём игру "Тетрис"

Программируем на Python: игра "Бросок кубика"

Программируем на Python: игра "Угадай число"

Программируем на Python: игра "Камень, ножницы, бумага"