Вы находитесь на странице: 1из 14

Урок № 4

«Крестики-
нолики»

Цель урока: научиться работать с информационным и


диалоговым окнами. Создать свое приложение «Крести-
ки-нолики».

Н
а предыдущих занятиях были изучены возмож-
ности библиотеки Tkinter. Напишем игру «Кре-
стики-нолики», знакомую многим. Восполь-
зуемся возможностями библиотеки Tkinter и модулем
random.
«Крестики-нолики»

Messagebox
Информационное окно
В Tkinter используется MessageBox для вывода со-
общения в новом окне и имеет два параметра. Первый
параметр функции задает имя, которое отображается
в заголовке диалогового окна. Второй параметр – текст
сообщения. Данные функции возвращают строку, кото-
рая обычно игнорируется, поскольку не несет информа-
ции.
Приведенный ниже код позволяет показать окно с
сообщением Tkinter:
■■ в Python версии 3 и выше:
from tkinter import messagebox
messagebox.showinfo("Title", "Message")
■■ в Python версии 2.х:
import Tkinter
import tkMessageBox
tkMessageBox.showinfo("Title", "Message")

3
Урок № 4

Messagebox включает возможность отображения со-


общения об ошибке, предупреждения и информацион-
ного окна (showerror(), showwarning(), showinfo()).

Диалоговое окно
Позволяет задать пользователю однозначный во-
прос, на который ожидается ответ «да/нет». Возвращае-
мое значение является логическим типом и возвращает
True/False. Если пользователь выбирает кнопку «Отме-
на», возвращается None.
answer = messagebox.askokcancel("Question","Open
this file?")

4
«Крестики-нолики»

answer = messagebox.askretrycancel("Question", "Try


that again?")

answer = messagebox.askyesno("Question","Yes or no")

answer = messagebox.askyesnocancel("Question",
"Continue playing?")

5
Урок № 4

Simpledialog
Если необходимо предоставить возможность поль-
зователю ввести данные и считать значение строки,
можно использовать объект simpledialog. Пользова-
тель может ввести значение и нажать Оk. Если пользо-
ватель нажимает «Отмена», то возвращается None. Им-
портируем simpledialog.
from tkinter import simpledialog
Предложим пользователю ввести число. Для этого
воспользуемся функцией askinteger(), которая име-
ет такие параметры: имя окна, текст, минимальное и
максимальное допустимое значение. Считать можно
целые числа askinteger(), числа с плавающей точкой
askfloat(), строки ()askstr.
answer = simpledialog.askinteger("Input", "Input
number", parent = window, minvalue = 0,
maxvalue = 100)
if answer is not None:
print("Your number", answer)
else:
print("No number")

6
«Крестики-нолики»

Приложение

from tkinter import *


from tkinter import messagebox
from random import randint

ActivePlayer = 1
p1 = []
p2 = []

window = Tk()
window.title("Game")

7
Урок № 4

button1 = Button(window, text = "")


button1.grid(row = 0, column = 0, sticky = "snew",
ipadx = 40, ipady = 40)
button1.config(command = lambda: ButtonClick(1))

button2 = Button(window, text = "")


button2.grid(row = 0, column = 1, sticky = "snew",
ipadx = 40, ipady = 40)
button2.config(command = lambda: ButtonClick(2))

button3 = Button(window, text = "")


button3.grid(row = 0, column = 2, sticky = "snew",
ipadx = 40, ipady = 40)
button3.config(command = lambda: ButtonClick(3))

button4 = Button(window, text = "")


button4.grid(row = 1, column = 0, sticky = "snew",
ipadx = 40, ipady = 40)
button4.config(command = lambda: ButtonClick(4))

button5 = Button(window, text = "")


button5.grid(row = 1, column = 1, sticky = "snew",
ipadx = 40, ipady = 40)
button5.config(command = lambda: ButtonClick(5))

button6 = Button(window, text = "")


button6.grid(row = 1, column = 2, sticky = "snew",
ipadx = 40, ipady = 40)

8
«Крестики-нолики»

button6.config(command = lambda: ButtonClick(6))

button7 = Button(window, text = "")


button7.grid(row = 2, column = 0, sticky = "snew",
ipadx = 40, ipady = 40)
button7.config(command = lambda: ButtonClick(7))

button8 = Button(window, text = "")


button8.grid(row = 2, column = 1, sticky = "snew",
ipadx = 40, ipady = 40)
button8.config(command = lambda: ButtonClick(8))

button9 = Button(window, text = "")


button9.grid(row = 2, column = 2, sticky = "snew",
ipadx = 40, ipady = 40)
button9.config(command = lambda: ButtonClick(9))

def ButtonClick(id):
global ActivePlayer
global p1
global p2
print("ID:{}".format(id))

if (ActivePlayer == 1):
SetLayout(id, "X")
p1.append(id)
ActivePlayer = 2

9
Урок № 4

print("P1:{}".format(p1))

elif (ActivePlayer == 2):


SetLayout(id, "O")
p2.append(id)
ActivePlayer = 1
print("P2:{}".format(p2))

ChooseWinner()

def SetLayout(id, PlayerSymbol):


if (id == 1):
button1.config(text = PlayerSymbol,
state = DISABLED)
elif (id == 2):
button2.config(text = PlayerSymbol,
state = DISABLED)
elif (id == 3):
button3.config(text = PlayerSymbol,
state = DISABLED)
elif (id == 4):
button4.config(text = PlayerSymbol,
state = DISABLED)
elif (id == 5):
button5.config(text = PlayerSymbol,
state = DISABLED)

10
«Крестики-нолики»

elif (id == 6):


button6.config(text = PlayerSymbol,
state = DISABLED)
elif (id == 7):
button7.config(text = PlayerSymbol,
state = DISABLED)
elif (id == 8):
button8.config(text = PlayerSymbol,
state = DISABLED)
elif (id == 9):
button9.config(text = PlayerSymbol,
state = DISABLED)

def ChooseWinner():
Winner = -1
''' W I N N E R - 1 '''
if ((1 in p1) and (2 in p1) and (3 in p1)):
Winner = 1
if ((1 in p2) and (2 in p2) and (3 in p2)):
Winner = 2

if ((4 in p1) and (5 in p1) and (6 in p1)):


Winner = 1
if ((4 in p2) and (5 in p2) and (6 in p2)):
Winner = 2

11
Урок № 4

if ((7 in p1) and (8 in p1) and (9 in p1)):


Winner = 1
if ((7 in p2) and (8 in p2) and (9 in p2)):
Winner = 2
''' W I N N E R - 2 '''
if ((1 in p1) and (4 in p1) and (7 in p1)):
Winner = 1
if ((1 in p2) and (4 in p2) and (7 in p2)):
Winner = 2

if ((2 in p1) and (6 in p1) and (8 in p1)):


Winner = 1
if ((2 in p2) and (6 in p2) and (8 in p2)):
Winner = 2

if ((3 in p1) and (7 in p1) and (9 in p1)):


Winner = 1
if ((3 in p2) and (7 in p2) and (9 in p2)):
Winner = 2
''' W I N N E R - 3 '''
if ((1 in p1) and (5 in p1) and (9 in p1)):
Winner = 1
if ((1 in p2) and (5 in p2) and (9 in p2)):
Winner = 2

if ((3 in p1) and (5 in p1) and (7 in p1)):


Winner = 1

12
«Крестики-нолики»

if ((3 in p2) and (5 in p2) and (7 in p2)):


Winner = 2

if Winner == 1:
messagebox.showinfo("Winner", "Player 1 is
Winner")
elif Winner == 2:
messagebox.showinfo("Winner", "Player 2 is
Winner")

def AutoPlay():
global p1
global p2
EmplyCells = []
for i in range(9):
if ( (i+1 in p1) or (i+1 in p2)):
EmplyCells.append(i+1)

RandomIndex = randint(0, len(EmplyCells)-1)


ButtonClick(EmplyCells[RandomIndex])

window.mainloop()

13
Урок № 4
«Крестики-нолики»

© Компьютерная Академия «Шаг»


www.itstep.org

Все права на охраняемые авторским правом фото-, аудио- и видеопроизведения,


фрагменты которых использованы в материале, принадлежат их законным владель-
цам. Фрагменты произведений используются в иллюстративных целях в объёме,
оправданном поставленной задачей, в рамках учебного процесса и в учебных целях,
в соответствии со ст. 1274 ч. 4 ГК РФ и ст. 21 и 23 Закона Украины «Про авторське
право і суміжні права». Объём и способ цитируемых произведений соответствует
принятым нормам, не наносит ущерба нормальному использованию объектов
авторского права и не ущемляет законные интересы автора и правообладателей.
Цитируемые фрагменты произведений на момент использования не могут быть
заменены альтернативными, не охраняемыми авторским правом аналогами, и
как таковые соответствуют критериям добросовестного использования и честного
использования.
Все права защищены. Полное или частичное копирование материалов запрещено.
Согласование использования произведений или их фрагментов производится
с авторами и правообладателями. Согласованное использование материалов
возможно только при указании источника.
Ответственность за несанкционированное копирование и коммерческое исполь-
зование материалов определяется действующим законодательством Украины.

Вам также может понравиться