Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os,sys
- import pygame
- from pygame.locals import *
- class Display(object):
- pygame.init()
- display = pygame.display.set_mode((480,480))
- pygame.display.set_caption(os.getcwd())
- class ResManager(object):
- '''set data path and load image'''
- def __init__(self, data_dir = '',
- image_dir = 'img'):
- self.data_dir = data_dir
- self.image_dir = image_dir
- def get_image(self, name):
- fullname = os.path.join(self.data_dir, os.path.join(self.image_dir, name))
- try:
- image = pygame.image.load(fullname)
- except pygame.error, message:
- return None
- else:
- image = image.convert_alpha()
- return image
- class EmptyFigure(object):
- color = None
- class Figure(Display):
- '''parent calss'''
- def __init__(self,name='',image=None,color = None):
- self.color = color
- self.font = pygame.font.Font(None, 24)
- # если файл фигуры ненайден
- if not image:
- # в качестве картинки используем текст с именем фигуры
- image = self.font.render(name, 0, {'black':(0,0,0),'white':(250,250,250)}[self.color])
- self.image = image
- def draw(self,source,pos):
- 'рисуем фигурку'
- source.blit(self.image, (pos[0]*60,pos[1]*60))
- def getPossibleMove(self,board,pos):
- posmov = []
- for x in xrange(8):
- for y in xrange(8):
- p = board[x][y]
- if p and p.color == self.color: continue
- posmov.append((x,y))
- return posmov
- class BlackPeshka(Figure):
- def getPossibleMove(self,board,pos):
- posmov = []
- figx,figy = pos
- if figy == 1: na4hod =3 # в начале пешка може ходить через клетку
- else: na4hod =2
- for y in xrange(1,na4hod):
- p = board.getFigure((figx,y + figy))
- if p and p.color:
- break
- else:
- posmov.append((figx,y + figy))
- p1 = board.getFigure((figx+1,figy+1))
- if p1 and p1.color and p1.color != self.color:
- posmov.append((figx+1,figy+1))
- p2 = board.getFigure((figx-1,figy+1))
- if p2 and p2.color and p2.color != self.color:
- posmov.append((figx-1,figy+1))
- return posmov
- class WhitePeshka(Figure):
- def getPossibleMove(self,board,pos):
- posmov = []
- figx,figy = pos
- if figy == 6: na4hod =3 # в начале пешка може ходить через клетку
- else: na4hod =2
- for y in xrange(1,na4hod):
- p = board.getFigure((figx, figy -y))
- if p and p.color:
- break
- else:
- posmov.append((figx,figy-y))
- p1 = board.getFigure((figx+1,figy-1))
- if p1 and p1.color and p1.color != self.color:
- posmov.append((figx+1,figy-1))
- p2 = board.getFigure((figx-1,figy-1))
- if p2 and p2.color and p2.color != self.color:
- posmov.append((figx-1,figy-1))
- return posmov
- class Ladia(Figure):
- def getPossibleMove(self,board,pos):
- posmov = []
- figx,figy = pos
- for x in xrange(1,8):
- figpos = (figx+x, figy)
- p = board.getFigure(figpos)
- if not p: break
- if not p.color:
- posmov.append(figpos)
- if p.color:
- if p.color != self.color: posmov.append(figpos)
- break
- for x in xrange(1,8):
- figpos = (figx-x, figy)
- p = board.getFigure(figpos)
- if not p: break
- if not p.color:
- posmov.append(figpos)
- if p.color:
- if p.color != self.color: posmov.append(figpos)
- break
- for x in xrange(1,8):
- figpos = (figx, figy+x)
- p = board.getFigure(figpos)
- if not p: break
- if not p.color:
- posmov.append(figpos)
- if p.color:
- if p.color != self.color: posmov.append(figpos)
- break
- for x in xrange(1,8):
- figpos = (figx, figy-x)
- p = board.getFigure(figpos)
- if not p: break
- if not p.color:
- posmov.append(figpos)
- if p.color:
- if p.color != self.color: posmov.append(figpos)
- break
- return posmov
- class Kon(Figure):
- def getPossibleMove(self,board,pos):
- posmov = []
- figx,figy = pos
- for figpos in ((figx-1,figy+2),(figx-1,figy-2),(figx+1,figy+2),\
- (figx+1,figy-2), (figx-2,figy+1),(figx-2,figy-1),(figx+2,figy+1),(figx+2,figy-1)):
- p = board.getFigure(figpos)
- if not p: continue
- if not p.color:
- posmov.append(figpos)
- if p.color:
- if p.color != self.color: posmov.append(figpos)
- return posmov
- class Slon(Figure):
- def getPossibleMove(self,board,pos):
- posmov = []
- figx,figy = pos
- for x in xrange(1,8):
- figpos = (figx+x, figy+x)
- p = board.getFigure(figpos)
- if not p: break
- if not p.color:
- posmov.append(figpos)
- if p.color:
- if p.color != self.color: posmov.append(figpos)
- break
- for x in xrange(1,8):
- figpos = (figx-x, figy-x)
- p = board.getFigure(figpos)
- if not p: break
- if not p.color:
- posmov.append(figpos)
- if p.color:
- if p.color != self.color: posmov.append(figpos)
- break
- for x in xrange(1,8):
- figpos = (figx-x, figy+x)
- p = board.getFigure(figpos)
- if not p: break
- if not p.color:
- posmov.append(figpos)
- if p.color:
- if p.color != self.color: posmov.append(figpos)
- break
- for x in xrange(1,8):
- figpos = (figx+x, figy-x)
- p = board.getFigure(figpos)
- if not p: break
- if not p.color:
- posmov.append(figpos)
- if p.color:
- if p.color != self.color: posmov.append(figpos)
- break
- return posmov
- 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 Korol(Figure):
- def getPossibleMove(self,board,pos):
- posmov = []
- figx,figy = pos
- for figpos in ((figx-1,figy+1),(figx-1,figy-1),(figx+1,figy+1),\
- (figx+1,figy-1), (figx,figy+1),(figx,figy-1),(figx+1,figy),(figx-1,figy)):
- p = board.getFigure(figpos)
- if not p: continue
- if not p.color:
- posmov.append(figpos)
- if p.color:
- if p.color != self.color: posmov.append(figpos)
- return posmov
- class Board(list,Display):
- '''класс реализует контейнер для фигур'''
- def __init__(self):
- for x in range(8):self.append(map(lambda x:EmptyFigure(),range(8)))
- def drawboard(self,curentfigure,possibleHod):
- "рисуем клетки"
- d = 60
- for x in xrange(0,8):
- for y in xrange(0,8):
- if x%2 != y%2:
- x1,y1 = x*d,y*d
- pygame.draw.polygon(self.display, (100,100,100), ((x1,y1), (x1,y1+d), (x1+d,y1+d), (x1+d,y1) ))
- if possibleHod:
- for pos in possibleHod:
- self._drawcurentfigure(pos,linecolor = (0,10,200))
- if curentfigure:
- self._drawcurentfigure(curentfigure,linecolor = (10,200,10))
- for x in range(0,8):
- for y in range(0,8):
- p = self[x][y]
- if p.color: p.draw(self.display,(x,y))
- def getpos(self,pos):
- x,y = pos[0]/60,pos[1]/60
- print x,y
- return x,y
- def getcolor(self,pos):
- p = self[pos[0]][pos[1]]
- if p:
- return p.color
- def getFigure(self,pos) :
- x,y = pos
- if 0>x or x>7 or 0>y or y>7:return None
- #try:
- return self[x][y]
- #except IndexError:
- # return None
- def moveFigure(self,last,next):
- self[next[0]][next[1]] = self[last[0]][last[1]]
- self[last[0]][last[1]] = EmptyFigure()
- def _drawcurentfigure(self,curentfigure,linecolor = None):
- 'выделяем выбраную фигуру'
- x,y = curentfigure
- d = 60
- x1,y1 = x*d,y*d
- w = 4
- pygame.draw.line(self.display, linecolor, (x1,y1), (x1+d,y1),w)
- pygame.draw.line(self.display, linecolor, (x1,y1), (x1,y1+d),w)
- pygame.draw.line(self.display, linecolor, (x1+d,y1+d), (x1+d,y1),w)
- pygame.draw.line(self.display, linecolor, (x1,y1+d), (x1+d,y1+d),w)
- 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'))
- class MyChess(Display):
- ''' игра шахматы '''
- def __init__(self):
- self.manager = ResManager( data_dir =os.getcwd())
- self.possibleHod = None
- self.curentfigure = None
- def startgame(self):
- 'restart game, set default pos figure and vars'
- self.curentfigure = None
- self.board = Board()
- self.board.initFigure(self.manager)
- def run(self):
- 'start game'
- hod = 'white'
- while 1:
- # проверка на события пришедшее от пользователя
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- sys.exit()
- elif event.type == MOUSEBUTTONDOWN :
- # клик левой кн мыши
- if event.button == 1:
- curentpos = self.board.getpos(event.pos)
- if hod == self.board.getcolor(curentpos):
- self.curentfigure = curentpos
- self.possibleHod = self.board.getFigure(curentpos).getPossibleMove(self.board,curentpos)
- print self.possibleHod
- elif self.curentfigure and curentpos in self.possibleHod :
- self.possibleHod = None
- self.board.moveFigure(self.curentfigure,curentpos)
- self.curentfigure = None
- if hod == 'white': hod = 'black'
- else: hod ='white'
- print hod
- self.display.fill((250,200,200))
- self.board.drawboard(self.curentfigure,self.possibleHod)
- pygame.display.flip()
- def main():
- a = MyChess()
- a.startgame()
- a.run()
- if __name__ == '__main__': main()
Advertisement
Add Comment
Please, Sign In to add comment