Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 25, 2011 19:10:19

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

ООП

В Display не стоит писать

    pygame.init()
display = pygame.display.set_mode((480,480))
pygame.display.set_caption(os.getcwd())
Или не нужно от него наследоваться.
Понимаете ли, инициализацию движка обычно делают в чем-то вроде Application, в то время как ваши фигуры куда скромнее.

def draw(self,source,pos):
'рисуем фигурку'
Это - пустяк. Но приучайте себя следовать http://www.python.org/dev/peps/pep-0257/ и http://www.python.org/dev/peps/pep-0287/
Когда я вижу докстринг, оформленный не по правилам - это настораживает. И режет глаз.

Почему белая пешка и черная - разные классы? И почему они не наследуются от пешки?


Вопросов много. Ответите на первый список - будем продолжать.



Офлайн

#2 Фев. 25, 2011 20:35:22

sp3
От:
Зарегистрирован: 2010-01-12
Сообщения: 405
Репутация: +  18  -
Профиль   Отправить e-mail  

ООП

http://pastebin.com/7Q0r6nn0 переделал.
pygame теперь инициализируется в классе MyChess,
а display для отрисовки передается как параметр.

У белой и черной пешки разные классы потому что метод getPossibleMove немного различается. Белые ходят в верх, черные в низ.
По поводу докстрингов учту на будущее.



Офлайн

#3 Фев. 26, 2011 08:28:20

.Serj.
От:
Зарегистрирован: 2008-09-27
Сообщения: 181
Репутация: +  0  -
Профиль   Отправить e-mail  

ООП

страшное слово MVC. Не успею осилить
На http://en.wikipedia.org/wiki/Model–View–Controller всё весьма просто описано. Там осиливать, по сути, нечего.



Офлайн

#4 Фев. 26, 2011 11:40:55

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

ООП

Категорически не согласен: http://asvetlov.blogspot.com/2011/02/blog-post_05.html
Имеете что возразить - пишите здесь или там в комметнариях.



Офлайн

#5 Фев. 26, 2011 11:43:36

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

ООП

Андрей Светлов
Имеете что возразить - пишите здесь или там в комметнариях.
А лучше перед этим почитать те 20 комментов в Google Buzz по этой статье =)



Офлайн

#6 Фев. 26, 2011 21:52:07

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

ООП

sp3
Kogrom
Я бы наследовал пешек, слонов, ферзей и т.д.
переписал немного
http://pastebin.com/CYEgBkZH
теперь каждый класс переопределяет метод getPossibleMove, который генерирует список с кортежами возможных ходов фигуры
Ок. Но опять осталось вот это:

    def initFigure(self,manager):
for x in xrange(8):
self[x][1] = BlackPeshka(name = u'пешка',color = 'black',image= manager.get_image('bp.png'))
self[x][6] = WhitePeshka(name = u'пешка',color = 'white',image= manager.get_image('wp.png'))
self[0][7] = Ladia(name = u'ладья', color = 'white',image= manager.get_image('wl.png'))
self[7][7] = Ladia(name = u'ладья', color = 'white',image= manager.get_image('wl.png'))
self[1][7] = Kon(name = u'конь' , color = 'white',image= manager.get_image('wkon.png'))
self[6][7] = Kon(name = u'конь' , color = 'white',image= manager.get_image('wkon.png'))
self[2][7] = Slon(name = u'слон' , color = 'white',image= manager.get_image('ws.png'))
self[5][7] = Slon(name = u'слон' , color = 'white',image= manager.get_image('ws.png'))
self[3][7] = Ferz(name = u'ферзь', color = 'white',image= manager.get_image('wf.png'))
self[4][7] = Korol(name = u'король',color = 'white',image= manager.get_image('wk.png'))

self[0][0] = Ladia(name = u'ладья', color = 'black',image= manager.get_image('bl.png'))
self[7][0] = Ladia(name = u'ладья', color = 'black',image= manager.get_image('bl.png'))
self[1][0] = Kon(name = u'конь' ,color = 'black',image= manager.get_image('bkon.png'))
self[6][0] = Kon(name = u'конь' ,color = 'black',image= manager.get_image('bkon.png'))
self[2][0] = Slon(name = u'слон' , color = 'black',image= manager.get_image('bs.png'))
self[5][0] = Slon(name = u'слон' , color = 'black',image= manager.get_image('bs.png'))
self[3][0] = Ferz(name = u'ферзь' ,color = 'black',image= manager.get_image('bf.png'))
self[4][0] = Korol(name = u'король',color = 'black',image= manager.get_image('bk.png'))
Можно же упростить, если определить свой конструктор для каждой фигуры. Там будет определяться рисунок, что устранит возможность написать что-то типа:

self = BlackPeshka(name = u'слон',color = ‘black’,image= manager.get_image('bk.png'))

Не понял, зачем нужно имя, кстати.

Итого:
    for x in xrange(8):
self[x][1] = Peshka('black')
self[x][6] = Peshka('white')

for (color, index) in (('white', 7), ('black', 0)):
self[0][index)] = Ladia(color)
self[7][index)] = Ladia(color)
self[1][index)] = Kon(color)
self[6][index) = Kon(color)
self[2][index)] = Slon(color)
self[5][index)] = Slon(color)
self[3][index)] = Ferz(color)
self[4][index)] = Korol(color)
Получается почти как в оригинале… Но тут ещё есть дублирование. Возможно, лучше использовать таблицу с буквенными обозначениями для генерации доски. Можно посмотреть, есть ли у шахматистов свои обозначения, типа ЧП, БП.



Офлайн

#7 Фев. 26, 2011 22:47:19

zheromo
От:
Зарегистрирован: 2010-10-02
Сообщения: 356
Репутация: +  2  -
Профиль   Отправить e-mail  

ООП

Лучше координаты фигуры поместить в нее.
board сделать глобальным и не передавать его при расчете.
Не надо использовать магические строки ‘black’ и ‘white’, лучше завести константы

Имена картинок лучше сделать свойством класса фигура, например

class Figure(object):
@property
def image(self):
return self.name + '_' + self.color + '.png'

class Slon(Figure):
name = 'slon'
name все равно будет нужен, например для печати нотации

Если этюды расставлять не планируется, или если цвет сделать необязательным параметром, то фигура может сама определять свой цвет.

class Figure(object):
def __init__(self, number, letter, color=None):
if not color:
if number<3:
color = WHITE
elif number>6:
color = BLACK
else:
raise ValueError()
elif not color in [WHITE,BLACK]:
raise ValueError()
self.number = number
self.letter = letter
self.color = color
Пешки не надо делить на два класса (черные и белые)
лучше ввести понятие направления движения directional - для белых 1, для черных -1

Еще не понравилось
class Ferz(Figure):
# Ladia + Slon
def getPossibleMove(self,board,pos):
a = Ladia(color = self.color).getPossibleMove(board,pos)
b = Slon(color = self.color).getPossibleMove(board,pos)
return a+b
луше как-то так

class Ferz(Ladia, Slon):
# Ladia + Slon
def getPossibleMove(self,board,pos):
return Ladia.getPossibleMove(board,pos) + Slon.getPossibleMove(board,pos)
ПС. Я внес именно бы эти изменения, но это только мое мнение и оно может и не быть единственно верным (и вообще верным)

ППС. Логику проверки ходов не смотрел, но не забудте про взятие на проходе и рокировки (dimabest подскажет с какой фигуры надо начинать ее делать)



Офлайн

#8 Фев. 26, 2011 23:22:38

Kogrom
От:
Зарегистрирован: 2009-12-03
Сообщения: 160
Репутация: +  0  -
Профиль   Отправить e-mail  

ООП

zheromo
Лучше координаты фигуры поместить в нее.
Чем? Думаю, нужно с предметной областью разобраться - кто есть кто и за что отвечает. Возможно, координату должна помнить фигура, но пока нет ясности.

zheromo
board сделать глобальным и не передавать его при расчете.
Глобальные переменные не нужны. Но то, что доска ссылается на фигуру, а фигура на доску - немного смущает. Опять же надо разбираться с ответственностями.

zheromo
Не надо использовать магические строки ‘black’ и ‘white’, лучше завести константы
Да. Можно ещё в конструкторе булевскую переменную задать типа “является белым”, если фигуры могут иметь только 2 определённых цвета.

zheromo
Если этюды расставлять не планируется, или если цвет сделать необязательным параметром, то фигура может сама определять свой цвет.
Думаю, это лишнее. Зачем же вводить поведение, которое помешает в расстановке этюдов, сохранённых партий?



Офлайн

#9 Фев. 27, 2011 04:48:56

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

ООП

Интересная задача - определение возможности хода.

Ход невозможен, если:
1. поле уже занято своей фигурой или пешкой
2. после хода король остается под ударом
3. король приблизится вплотную к чужому королю
4. на доске пат
5. нельзя рокировать если король или ладья ходили
6. нельзя рокировать, если король прыгает через “битое поле”
7. дорогу закрывает чужая фигура или пешка (прыгать через чужие фигуры может только конь)

Как реагировать на шахи?
1. уйти
2. схавать атакующую фигуру
3. закрытся

Закрытся нельзя, если шах двойной. Рокировать нельзя при любом шахе.

Ходы пешкой - с начальной позиции можно ходить на 1 или 2 поля. Достигнув последней горизонтали, превращается в любую фигуру кроме короля.

Вообщем тут программировать довольно много :)



Офлайн

#10 Фев. 27, 2011 04:57:57

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

ООП

По идее конкретная Фигура или Пешка должа сама знать, как она ходит согласно правилам.
А возможность или невозможность хода должна определять Доска.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version