Уведомления

Группа в Telegram: присоединиться

#1 Апрель 29, 2019 08:01:27

Kirich
Зарегистрирован: 2019-04-28
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Крестики, нолики

Помогите пожалуйста! Объясните как работает этот код и что значат отдельные модули и дефы (Что такое GUI и так далее). Заранее спасибо!

from tkinter import Tk, Button
from tkinter.font import Font
from copy import deepcopy

class Board:

def __init__(self,other=None):
self.player = ‘X’
self.opponent = ‘O’
self.empty = ‘.’
self.size = 3
self.fields = {}
for y in range(self.size):
for x in range(self.size):
self.fields = self.empty
if other:
self.__dict__ = deepcopy(other.__dict__)

def move(self,x,y):
board = Board(self)
board.fields = board.player
(board.player,board.opponent) = (board.opponent,board.player)
return board

def __minimax(self, player):
if self.won():
if player:
return (-1,None)
else:
return (+1,None)
elif self.tied():
return (0,None)
elif player:
best = (-2,None)
for x,y in self.fields:
if self.fields==self.empty:
value = self.move(x,y).__minimax(not player)
if value>best:
best = (value,(x,y))
return best
else:
best = (+2,None)
for x,y in self.fields:
if self.fields==self.empty:
value = self.move(x,y).__minimax(not player)
if value<best:
best = (value,(x,y))
return best

def best(self):
return self.__minimax(True)

def tied(self):
for (x,y) in self.fields:
if self.fields==self.empty:
return False
return True

def won(self):
for y in range(self.size):
winning =
for x in range(self.size):
if self.fields == self.opponent:
winning.append((x,y))
if len(winning) == self.size:
return winning
for x in range(self.size):
winning =
for y in range(self.size):
if self.fields == self.opponent:
winning.append((x,y))
if len(winning) == self.size:
return winning
winning =
for y in range(self.size):
x = y
if self.fields == self.opponent:
winning.append((x,y))
if len(winning) == self.size:
return winning
winning =
for y in range(self.size):
x = self.size-1-y
if self.fields == self.opponent:
winning.append((x,y))
if len(winning) == self.size:
return winning
return None

def __str__(self):
string = ''
for y in range(self.size):
for x in range(self.size):
string+=self.fields
string+=“\n”
return string

class GUI:

def __init__(self):
self.app = Tk()
self.app.title('TicTacToe')
self.app.resizable(width=False, height=False)
self.board = Board()
self.font = Font(family=“Helvetica”, size=32)
self.buttons = {}
for x,y in self.board.fields:
handler = lambda x=x,y=y: self.move(x,y)
button = Button(self.app, command=handler, font=self.font, width=2, height=1)
button.grid(row=y, column=x)
self.buttons = button
handler = lambda: self.reset()
button = Button(self.app, text='reset', command=handler)
button.grid(row=self.board.size+1, column=0, columnspan=self.board.size, sticky=“WE”)
self.update()

def reset(self):
self.board = Board()
self.update()

def move(self,x,y):
self.app.config(cursor=“watch”)
self.app.update()
self.board = self.board.move(x,y)
self.update()
move = self.board.best()
if move:
self.board = self.board.move(*move)
self.update()
self.app.config(cursor=“”)

def update(self):
for (x,y) in self.board.fields:
text = self.board.fields
self.buttons = text
self.buttons = ‘black’
if text==self.board.empty:
self.buttons = ‘normal’
else:
self.buttons = ‘disabled’
winning = self.board.won()
if winning:
for x,y in winning:
self.buttons = ‘red’
for x,y in self.buttons:
self.buttons = ‘disabled’
for (x,y) in self.board.fields:
self.buttons.update()

def mainloop(self):
self.app.mainloop()

if __name__ == ‘__main__’:
GUI().mainloop()

Прикреплённый файлы:
attachment Крестики нолики.py (4,2 KБ)

Офлайн

#2 Май 2, 2019 11:15:50

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 1344
Репутация: +  200  -
Профиль   Отправить e-mail  

Крестики, нолики

Kirich
что значат отдельные модули и дефы (Что такое GUI и так далее). Заранее спасибо
ну млин вот так вам взять и обьяснить за пять минут то что люди месяцами(а то и годами) учат.
Для того чтобы вы смогли понимать “что значат отдельные модули и дефы (Что такое GUI и так далее)”
вам бы в идеале освоить чтото типа такого. https://www.litmir.me/bd/?b=218572

но если у вас уже есть навыки програмирования и вы знаете какойнить ЯП то для старта достаточно проштудирвать чтонить типа такого https://pythonworld.ru/samouchitel-python
этого должно хватить чтобы вы уловили основную суть

Отредактировано PEHDOM (Май 2, 2019 11:18:35)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version