Guest User

slobojanin sergey

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