Уведомления

Группа в 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
Сообщения: 1472
Репутация: +  207  -
Профиль   Отправить e-mail  

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

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

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

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

Офлайн

#3 Ноя. 3, 2019 19:53:24

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

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

Добрый день всем!Учу Питон всего три недели!Написал маленькую программу!Вопрос как завернуть ее в графическую оболочку,а то она работает только а консоли!Или я тороплю события?

Офлайн

#4 Ноя. 4, 2019 10:02:14

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

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

Dencik
Написал маленькую программу!Вопрос как завернуть ее в графическую оболочку,а то она работает только а консоли!Или я тороплю события?
ИМХО да, торопите. Ваша программа скорее всего работает весьма линейно и не содержит никаких интерфейсов, а все ГУИ-фреймворки событийно-ориентированы. Научитесь сначала просто писать ГУИ приложения , а потом уже будете думать как снабдить вашу “маленькую программу” графическим интерфейсом.

Офлайн

#5 Ноя. 4, 2019 13:30:16

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 3470
Репутация: +  192  -
Профиль   Отправить e-mail  

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

Dencik
Добрый день всем!Учу Питон всего три недели!
PEHDOM
ИМХО да, торопите.
Ну может и нет. Я смотрел как gui писать на первой неделе изучения питона. Правда у меня был опыт других языков.

Но вам правильно говорят, “засунуть” консольный код в GUI задача близкая к невозможной. У таких программ различная внутренняя организация. После засовывания это будет другая программа. И наоборот назад из нее после засовывания консоль не высунешь.



Отредактировано doza_and (Ноя. 4, 2019 13:32:29)

Офлайн

#6 Ноя. 4, 2019 15:29:23

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 936
Репутация: +  20  -
Профиль   Адрес электронной почты  

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

> “засунуть” консольный код в GUI
Добрая половина гуёвого софта в Linux так и пишется. Теперь я знаю, кто это делает. Тайна раскрыта :-).



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version