Guest User

slobojanin sergey

a guest
Feb 25th, 2011
330
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 13.24 KB | None | 0 0
  1. import os,sys
  2. import pygame
  3. from pygame.locals import *
  4.  
  5.  
  6. class Display(object):
  7.     pygame.init()
  8.     display = pygame.display.set_mode((480,480))
  9.     pygame.display.set_caption(os.getcwd())    
  10.  
  11.  
  12. class ResManager(object):
  13.     '''set data path and load image'''
  14.     def __init__(self, data_dir = '',
  15.                  image_dir = 'img'):
  16.         self.data_dir = data_dir
  17.         self.image_dir = image_dir
  18.  
  19.  
  20.  
  21.     def get_image(self, name):
  22.         fullname = os.path.join(self.data_dir, os.path.join(self.image_dir, name))
  23.  
  24.         try:
  25.             image = pygame.image.load(fullname)
  26.         except pygame.error, message:
  27.             return None
  28.         else:
  29.             image = image.convert_alpha()
  30.             return image
  31.            
  32.            
  33. class EmptyFigure(object):
  34.     color = None            
  35.            
  36.            
  37. class Figure(Display):
  38.     '''parent calss'''
  39.    
  40.     def __init__(self,name='',image=None,color = None):
  41.         self.color = color
  42.         self.font = pygame.font.Font(None, 24)
  43.         # если файл фигуры ненайден
  44.         if not image:                          
  45.             # в качестве картинки используем текст с именем фигуры
  46.             image = self.font.render(name, 0, {'black':(0,0,0),'white':(250,250,250)}[self.color])
  47.         self.image = image
  48.        
  49.     def draw(self,source,pos):
  50.         'рисуем фигурку'
  51.         source.blit(self.image, (pos[0]*60,pos[1]*60))
  52.     def getPossibleMove(self,board,pos):
  53.         posmov = []
  54.         for x in xrange(8):
  55.             for y in xrange(8):
  56.                 p = board[x][y]
  57.                 if p and p.color == self.color: continue
  58.                 posmov.append((x,y))  
  59.            
  60.         return posmov
  61.        
  62. class BlackPeshka(Figure):
  63.     def getPossibleMove(self,board,pos):
  64.         posmov = []
  65.         figx,figy = pos
  66.         if figy == 1: na4hod =3 # в начале пешка може ходить через клетку
  67.         else: na4hod =2
  68.        
  69.         for y in xrange(1,na4hod):
  70.             p = board.getFigure((figx,y + figy))
  71.             if p and p.color:
  72.                 break
  73.             else:
  74.                 posmov.append((figx,y + figy))
  75.    
  76.         p1 = board.getFigure((figx+1,figy+1))
  77.         if p1 and p1.color and p1.color != self.color:
  78.              posmov.append((figx+1,figy+1))
  79.              
  80.         p2 = board.getFigure((figx-1,figy+1))
  81.         if p2 and p2.color and p2.color != self.color:
  82.              posmov.append((figx-1,figy+1))
  83.         return posmov
  84.        
  85. class WhitePeshka(Figure):
  86.     def getPossibleMove(self,board,pos):
  87.         posmov = []
  88.         figx,figy = pos
  89.         if figy == 6: na4hod =3 # в начале пешка може ходить через клетку
  90.         else: na4hod =2
  91.        
  92.         for y in xrange(1,na4hod):
  93.             p = board.getFigure((figx,  figy -y))
  94.             if p and p.color:
  95.                 break
  96.             else:
  97.                 posmov.append((figx,figy-y))
  98.    
  99.         p1 = board.getFigure((figx+1,figy-1))
  100.         if p1 and p1.color and p1.color != self.color:
  101.              posmov.append((figx+1,figy-1))
  102.              
  103.         p2 = board.getFigure((figx-1,figy-1))
  104.         if p2 and p2.color and p2.color != self.color:
  105.              posmov.append((figx-1,figy-1))
  106.         return posmov
  107.        
  108. class Ladia(Figure):
  109.     def getPossibleMove(self,board,pos):
  110.         posmov = []
  111.         figx,figy = pos
  112.        
  113.         for x in xrange(1,8):
  114.             figpos = (figx+x,  figy)
  115.             p = board.getFigure(figpos)
  116.             if not p: break
  117.             if not p.color:
  118.                 posmov.append(figpos)
  119.             if p.color:
  120.                 if p.color != self.color: posmov.append(figpos)
  121.                 break        
  122.         for x in xrange(1,8):
  123.             figpos = (figx-x,  figy)
  124.             p = board.getFigure(figpos)
  125.             if not p: break
  126.             if not p.color:
  127.                 posmov.append(figpos)
  128.             if p.color:
  129.                 if p.color != self.color: posmov.append(figpos)
  130.                 break    
  131.         for x in xrange(1,8):
  132.             figpos = (figx,  figy+x)
  133.             p = board.getFigure(figpos)
  134.             if not p: break
  135.             if not p.color:
  136.                 posmov.append(figpos)
  137.             if p.color:
  138.                 if p.color != self.color: posmov.append(figpos)
  139.                 break    
  140.         for x in xrange(1,8):
  141.             figpos = (figx,  figy-x)
  142.             p = board.getFigure(figpos)
  143.             if not p: break
  144.             if not p.color:
  145.                 posmov.append(figpos)
  146.             if p.color:
  147.                 if p.color != self.color: posmov.append(figpos)
  148.                 break
  149.  
  150.         return posmov  
  151.        
  152. class Kon(Figure):
  153.     def getPossibleMove(self,board,pos):
  154.         posmov = []
  155.         figx,figy = pos
  156.  
  157.         for figpos in ((figx-1,figy+2),(figx-1,figy-2),(figx+1,figy+2),\
  158.             (figx+1,figy-2), (figx-2,figy+1),(figx-2,figy-1),(figx+2,figy+1),(figx+2,figy-1)):
  159.             p = board.getFigure(figpos)
  160.             if not p: continue
  161.             if not p.color:
  162.                 posmov.append(figpos)
  163.             if p.color:
  164.                 if p.color != self.color: posmov.append(figpos)
  165.                
  166.         return posmov  
  167.    
  168. class Slon(Figure):
  169.     def getPossibleMove(self,board,pos):
  170.         posmov = []
  171.         figx,figy = pos
  172.        
  173.         for x in xrange(1,8):
  174.             figpos = (figx+x,  figy+x)
  175.             p = board.getFigure(figpos)
  176.             if not p: break
  177.             if not p.color:
  178.                 posmov.append(figpos)
  179.             if p.color:
  180.                 if p.color != self.color: posmov.append(figpos)
  181.                 break        
  182.         for x in xrange(1,8):
  183.             figpos = (figx-x,  figy-x)
  184.             p = board.getFigure(figpos)
  185.             if not p: break
  186.             if not p.color:
  187.                 posmov.append(figpos)
  188.             if p.color:
  189.                 if p.color != self.color: posmov.append(figpos)
  190.                 break    
  191.         for x in xrange(1,8):
  192.             figpos = (figx-x,  figy+x)
  193.             p = board.getFigure(figpos)
  194.             if not p: break
  195.             if not p.color:
  196.                 posmov.append(figpos)
  197.             if p.color:
  198.                 if p.color != self.color: posmov.append(figpos)
  199.                 break    
  200.         for x in xrange(1,8):
  201.             figpos = (figx+x,  figy-x)
  202.             p = board.getFigure(figpos)
  203.             if not p: break
  204.             if not p.color:
  205.                 posmov.append(figpos)
  206.             if p.color:
  207.                 if p.color != self.color: posmov.append(figpos)
  208.                 break
  209.  
  210.         return posmov  
  211.    
  212. class Ferz(Figure):
  213.     # Ladia + Slon
  214.     def getPossibleMove(self,board,pos):
  215.         a = Ladia(color = self.color).getPossibleMove(board,pos)
  216.         b = Slon(color = self.color).getPossibleMove(board,pos)
  217.         return a+b
  218. class Korol(Figure):
  219.     def getPossibleMove(self,board,pos):
  220.         posmov = []
  221.         figx,figy = pos
  222.  
  223.         for figpos in ((figx-1,figy+1),(figx-1,figy-1),(figx+1,figy+1),\
  224.             (figx+1,figy-1), (figx,figy+1),(figx,figy-1),(figx+1,figy),(figx-1,figy)):
  225.             p = board.getFigure(figpos)
  226.             if not p: continue
  227.             if not p.color:
  228.                 posmov.append(figpos)
  229.             if p.color:
  230.                 if p.color != self.color: posmov.append(figpos)
  231.                
  232.         return posmov  
  233.    
  234.    
  235.    
  236.    
  237.    
  238.        
  239. class Board(list,Display):  
  240.     '''класс реализует контейнер для фигур'''
  241.     def __init__(self):
  242.         for x in range(8):self.append(map(lambda x:EmptyFigure(),range(8)))
  243.        
  244.     def drawboard(self,curentfigure,possibleHod):
  245.         "рисуем клетки"
  246.         d = 60
  247.         for x in xrange(0,8):
  248.             for y in xrange(0,8):
  249.                 if x%2 != y%2:
  250.                     x1,y1 = x*d,y*d
  251.                     pygame.draw.polygon(self.display, (100,100,100), ((x1,y1), (x1,y1+d), (x1+d,y1+d), (x1+d,y1) ))
  252.        
  253.         if possibleHod:
  254.             for pos in possibleHod:
  255.                 self._drawcurentfigure(pos,linecolor = (0,10,200))
  256.         if curentfigure:
  257.             self._drawcurentfigure(curentfigure,linecolor = (10,200,10))
  258.         for x in range(0,8):
  259.             for y in range(0,8):
  260.                 p = self[x][y]
  261.  
  262.                 if p.color: p.draw(self.display,(x,y))  
  263.                    
  264.     def getpos(self,pos):
  265.         x,y =  pos[0]/60,pos[1]/60
  266.         print x,y
  267.         return x,y
  268.     def getcolor(self,pos):
  269.         p = self[pos[0]][pos[1]]
  270.         if p:
  271.             return p.color
  272.     def getFigure(self,pos) :
  273.         x,y = pos
  274.         if 0>x or x>7 or 0>y or y>7:return None
  275.        
  276.         #try:
  277.         return self[x][y]
  278.         #except IndexError:
  279.         #   return None
  280.        
  281.            
  282.     def moveFigure(self,last,next):
  283.         self[next[0]][next[1]] = self[last[0]][last[1]]
  284.         self[last[0]][last[1]] = EmptyFigure()
  285.        
  286.     def _drawcurentfigure(self,curentfigure,linecolor =  None):
  287.         'выделяем выбраную фигуру'      
  288.         x,y = curentfigure
  289.         d = 60
  290.         x1,y1 = x*d,y*d
  291.         w = 4
  292.        
  293.         pygame.draw.line(self.display, linecolor,  (x1,y1),  (x1+d,y1),w)
  294.         pygame.draw.line(self.display, linecolor,  (x1,y1),  (x1,y1+d),w)
  295.         pygame.draw.line(self.display, linecolor,  (x1+d,y1+d),  (x1+d,y1),w)
  296.         pygame.draw.line(self.display, linecolor,  (x1,y1+d),  (x1+d,y1+d),w)                
  297.     def initFigure(self,manager):
  298.         for x in xrange(8):
  299.             self[x][1] = BlackPeshka(name = u'пешка',color = 'black',image= manager.get_image('bp.png'))
  300.             self[x][6] = WhitePeshka(name = u'пешка',color = 'white',image= manager.get_image('wp.png'))
  301.         self[0][7] = Ladia(name = u'ладья', color = 'white',image= manager.get_image('wl.png'))
  302.         self[7][7] = Ladia(name = u'ладья', color = 'white',image= manager.get_image('wl.png'))
  303.         self[1][7] = Kon(name = u'конь' , color = 'white',image= manager.get_image('wkon.png'))
  304.         self[6][7] = Kon(name = u'конь' , color = 'white',image= manager.get_image('wkon.png'))
  305.         self[2][7] = Slon(name = u'слон' , color = 'white',image= manager.get_image('ws.png'))
  306.         self[5][7] = Slon(name = u'слон' , color = 'white',image= manager.get_image('ws.png'))
  307.         self[3][7] = Ferz(name = u'ферзь', color = 'white',image= manager.get_image('wf.png'))
  308.         self[4][7] = Korol(name = u'король',color = 'white',image= manager.get_image('wk.png'))
  309.                                                
  310.         self[0][0] = Ladia(name = u'ладья', color = 'black',image= manager.get_image('bl.png'))
  311.         self[7][0] = Ladia(name = u'ладья', color = 'black',image= manager.get_image('bl.png'))
  312.         self[1][0] = Kon(name = u'конь'  ,color = 'black',image= manager.get_image('bkon.png'))
  313.         self[6][0] = Kon(name = u'конь'  ,color = 'black',image= manager.get_image('bkon.png'))
  314.         self[2][0] = Slon(name = u'слон' , color = 'black',image= manager.get_image('bs.png'))
  315.         self[5][0] = Slon(name = u'слон' , color = 'black',image= manager.get_image('bs.png'))
  316.         self[3][0] = Ferz(name = u'ферзь' ,color = 'black',image= manager.get_image('bf.png'))
  317.         self[4][0] = Korol(name = u'король',color = 'black',image= manager.get_image('bk.png'))
  318.                    
  319.          
  320. class MyChess(Display):
  321.     ''' игра шахматы  '''
  322.     def __init__(self):
  323.  
  324.         self.manager = ResManager( data_dir =os.getcwd())
  325.         self.possibleHod =  None
  326.         self.curentfigure = None
  327.        
  328.     def startgame(self):
  329.         'restart game, set default pos figure and vars'
  330.         self.curentfigure = None
  331.         self.board = Board()
  332.         self.board.initFigure(self.manager)
  333.        
  334.  
  335.     def run(self):
  336.         'start game'
  337.        
  338.         hod = 'white'
  339.         while 1:
  340.            
  341.             # проверка на события пришедшее от пользователя
  342.             for event in pygame.event.get():
  343.                 if event.type == pygame.QUIT:
  344.                     sys.exit()
  345.                 elif event.type == MOUSEBUTTONDOWN :
  346.                     # клик левой кн мыши
  347.                     if event.button == 1:
  348.                         curentpos = self.board.getpos(event.pos)
  349.                         if hod ==  self.board.getcolor(curentpos):
  350.                             self.curentfigure = curentpos
  351.                             self.possibleHod = self.board.getFigure(curentpos).getPossibleMove(self.board,curentpos)
  352.                             print self.possibleHod
  353.                         elif self.curentfigure and curentpos in  self.possibleHod :
  354.                             self.possibleHod = None
  355.                             self.board.moveFigure(self.curentfigure,curentpos)
  356.                             self.curentfigure = None
  357.                             if hod == 'white': hod = 'black'
  358.                             else: hod ='white'    
  359.                                    
  360.                     print hod
  361.                        
  362.             self.display.fill((250,200,200))
  363.             self.board.drawboard(self.curentfigure,self.possibleHod)
  364.  
  365.             pygame.display.flip()
  366.  
  367.  
  368.  
  369. def main():
  370.     a = MyChess()
  371.     a.startgame()
  372.     a.run()
  373.  
  374.  
  375.  
  376. if __name__ == '__main__': main()
Advertisement
Add Comment
Please, Sign In to add comment