Форум сайта python.su
В Display не стоит писать
pygame.init()
display = pygame.display.set_mode((480,480))
pygame.display.set_caption(os.getcwd())
def draw(self,source,pos):
'рисуем фигурку'
Офлайн
http://pastebin.com/7Q0r6nn0 переделал.
pygame теперь инициализируется в классе MyChess,
а display для отрисовки передается как параметр.
У белой и черной пешки разные классы потому что метод getPossibleMove немного различается. Белые ходят в верх, черные в низ.
По поводу докстрингов учту на будущее.
Офлайн
страшное слово MVC. Не успею осилитьНа http://en.wikipedia.org/wiki/Model–View–Controller всё весьма просто описано. Там осиливать, по сути, нечего.
Офлайн
Категорически не согласен: http://asvetlov.blogspot.com/2011/02/blog-post_05.html
Имеете что возразить - пишите здесь или там в комметнариях.
Офлайн
Андрей СветловА лучше перед этим почитать те 20 комментов в Google Buzz по этой статье =)
Имеете что возразить - пишите здесь или там в комметнариях.
Офлайн
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'))
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)
Офлайн
Лучше координаты фигуры поместить в нее.
board сделать глобальным и не передавать его при расчете.
Не надо использовать магические строки ‘black’ и ‘white’, лучше завести константы
Имена картинок лучше сделать свойством класса фигура, например
class Figure(object):
@property
def image(self):
return self.name + '_' + self.color + '.png'
class Slon(Figure):
name = 'slon'
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
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)
Офлайн
zheromoЧем? Думаю, нужно с предметной областью разобраться - кто есть кто и за что отвечает. Возможно, координату должна помнить фигура, но пока нет ясности.
Лучше координаты фигуры поместить в нее.
zheromoГлобальные переменные не нужны. Но то, что доска ссылается на фигуру, а фигура на доску - немного смущает. Опять же надо разбираться с ответственностями.
board сделать глобальным и не передавать его при расчете.
zheromoДа. Можно ещё в конструкторе булевскую переменную задать типа “является белым”, если фигуры могут иметь только 2 определённых цвета.
Не надо использовать магические строки ‘black’ и ‘white’, лучше завести константы
zheromoДумаю, это лишнее. Зачем же вводить поведение, которое помешает в расстановке этюдов, сохранённых партий?
Если этюды расставлять не планируется, или если цвет сделать необязательным параметром, то фигура может сама определять свой цвет.
Офлайн
Интересная задача - определение возможности хода.
Ход невозможен, если:
1. поле уже занято своей фигурой или пешкой
2. после хода король остается под ударом
3. король приблизится вплотную к чужому королю
4. на доске пат
5. нельзя рокировать если король или ладья ходили
6. нельзя рокировать, если король прыгает через “битое поле”
7. дорогу закрывает чужая фигура или пешка (прыгать через чужие фигуры может только конь)
Как реагировать на шахи?
1. уйти
2. схавать атакующую фигуру
3. закрытся
Закрытся нельзя, если шах двойной. Рокировать нельзя при любом шахе.
Ходы пешкой - с начальной позиции можно ходить на 1 или 2 поля. Достигнув последней горизонтали, превращается в любую фигуру кроме короля.
Вообщем тут программировать довольно много :)
Офлайн
По идее конкретная Фигура или Пешка должа сама знать, как она ходит согласно правилам.
А возможность или невозможность хода должна определять Доска.
Офлайн