OSDN Git Service

4b9a11923544ec9dc5cb3355d50ac0bbb1f86d0e
[deep-learning/learning.git] / reversi.py
1 '''
2 Created on 2015/08/25
3
4 @author: fuke
5 '''
6 import pygame,os,sys
7 from pygame.locals import *
8 from network import Comp
9
10
11 pygame.font.init()
12 comp = Comp()
13 screen = pygame.display.set_mode((400,400))
14
15 none, black, white = 0,1,2
16
17 def Path():
18     for name in sys.argv:
19         if os.path.exists(name) == True:
20             return os.path.dirname(name)
21        
22 img = pygame.image.load(os.path.join(Path(),'png','tips.png')).convert()
23 bkblack = pygame.image.load(os.path.join(Path(),'png','min_black.png')).convert()
24 bkwhite = pygame.image.load(os.path.join(Path(),'png','min_white.png')).convert()
25
26 index_x = 6
27 index_y = 5
28 size = 50
29    
30 class Player():
31     auto = False
32     stone = none
33
34 class Grid():       
35     def __init__(self):        
36         self.grid = [[none for y in range(8)] for x in range(8)]
37         self.stone = none   
38          
39     def Assign(self,item):
40         for x in range(8):
41             for y in range(8):
42                 self.grid[x][y] = item.grid[x][y]
43     
44 class StoneGrid():
45     def __init__(self):    
46         self.item = Grid()
47         self.buffer = Grid()
48         self.map = Grid()
49         self.arr = Grid()
50         self.turn_number = 0
51         self.turn_index = 0
52         self.active = True
53         self.gameover = False
54         self.text = pygame.font.SysFont(pygame.font.get_fonts()[0], 25, True).render('reversi',False,(0,0,255)).convert()        
55     
56     def Clear(self):
57         for x in range(8):
58             for y in range(8):
59                 self.item.grid[x][y] = none
60         self.item.grid[3][3] = black
61         self.item.grid[4][4] = black
62         self.item.grid[4][3] = white 
63         self.item.grid[3][4] = white 
64         self.turn_index = 0
65         self.turn_number = 0
66         
67     def CalScore(self,stone,x,y):
68         self.buffer.Assign(self.item)
69         if self.CanSetStone(stone, x, y, True) == True:
70             for i in range(8):
71                 for j in range(8):
72                     if self.CanSetStone(stone, i, j, False) == True:
73                         self.score += 1
74             self.item.Assign(self.buffer)
75             return True
76         else:
77             return False
78                                            
79     def CanSetStone(self,stone,x,y,reverse):
80         p = [True,False]        
81         def Method(m,n):            
82             if p[0] == False:
83                 return
84             i = 1
85             while True:
86                 d = x+m*i
87                 e = y+n*i
88                 if not ((0 <= d)and(d < 8)and(0 <= e)and(e < 8)):
89                     break
90                 s = self.item.grid[d][e]
91                 if s == none:
92                     break
93                 elif s == stone:                                
94                     if i > 1:
95                         if reverse == True:   
96                             if p[1] == False:
97                                 self.item.grid[x][y] = stone
98                                 p[1] = True                         
99                             j = 1
100                             while j <= i-1:
101                                 self.item.grid[x+m*j][y+n*j] = stone
102                                 j += 1
103                         else:
104                             p[0],p[1] = False,True
105                     break
106                 else:
107                     i += 1
108                    
109         if self.item.grid[x][y] == none:            
110             Method(-1,-1)
111             Method(-1, 0)
112             Method(-1, 1)
113             Method(0, -1)
114             Method(0, 1)
115             Method(1, -1)
116             Method(1, 0)
117             Method(1, 1)
118         if (p[1] == True)and(reverse == True):
119             ChangePlayer()
120         return p[1]
121                             
122     def NextStone(self,stone,pos):
123         result = False
124         n = 0
125         self.score = 0
126         for i in range(8):
127             for j in range(8):
128                 if self.CalScore(stone, i, j) == True:
129                     if result == False:
130                         result = True
131                     self.arr.grid[i][j] = self.score
132                     if self.score > n:
133                         n = self.score
134                     pos[0],pos[1] = i,j
135                 else:
136                     self.arr.grid[i][j] = -1
137         for i in range(8):
138             for j in range(8):
139                 k = self.arr.grid[i][j]
140                 if k != -1:
141                     self.arr.grid[i][j] = (n-k)/n
142         return result
143     
144     def Start(self):       
145         global index 
146         index = player1
147         self.Clear()
148         self.active = True
149         self.gameover = False
150         
151     def ReStart(self):
152         self.active = True
153         self.gameover = False
154         self.turn_index = self.turn_number
155         
156     def Pause(self):
157         self.active = False
158                
159     def Paint(self):
160         if self.effect_stone == black:
161             s = bkwhite           
162         else:
163             s = bkblack
164         i = 0
165         while i < len(self.list):
166             p = self.list[i]
167             screen.blit(s,(p.Left*50,p.Top*50),(p.X*50,p.Y*50,50,50))
168             i += 1
169                     
170 def Paint():
171     for x in range(8):
172         for y in range(8):
173             s = stone_grid.item.grid[x][y]
174             r = pygame.Rect(x*size,y*size,(x+1)*size,(y+1)*size)
175             if s == white:
176                 screen.blit(img,r,pygame.Rect(2*size,0,3*size,size))
177             elif s == black:
178                 screen.blit(img,r,pygame.Rect(size,0,2*size,size))
179             else:
180                 screen.blit(img,r,pygame.Rect(0,0,size,size))
181     if stone_grid.gameover == True:
182         screen.blit(stone_grid.text,pygame.Rect(0,0,800,50))
183     pygame.display.update()
184        
185 def ChangePlayer():  
186     def Main():
187         global index        
188         if index == player1:
189             index = player2
190             return 'white'
191         else:
192             index = player1
193             return 'black'        
194     
195     def Execute():
196         for x in range(8):
197             for y in range(8):
198                 if stone_grid.CanSetStone(index.stone, x, y, False) == True:
199                     return True
200         return False
201         
202     s = Main()+str(stone_grid.turn_index+1)
203     if Execute() == False:
204         s = Main()+str(stone_grid.turn_index+1)
205         if Execute() == False:
206             s = 'game over'
207             i = 0
208             j = 0
209             for x in range(8):
210                 for y in range(8):
211                     if stone_grid.item.grid[x][y] == black:
212                         i += 1
213                     elif stone_grid.item.grid[x][y] == white:
214                         j += 1
215             pygame.display.set_caption(s+str(stone_grid.turn_index+1))
216             if i > j:
217                 s = 'Player1 Win!'
218             elif i < j:
219                 s = 'Player2 Win!'
220             else:
221                 s = 'Draw'            
222             stone_grid.text = pygame.font.SysFont(pygame.font.get_fonts()[0],25,True).render(s+'(Player1){0}(Player2){1}'.format(i,j),False,(0,0,255)).convert()
223             stone_grid.gameover = True
224             Paint()
225         else:
226             pygame.display.set_caption(s)
227     else:
228         pygame.display.set_caption(s)
229         
230 def CompStone():
231     pos = [0,0]
232     i = 1 
233     stone_grid.active = False
234     if stone_grid.NextStone(index.stone, pos) == True:
235         if index.stone == black:
236             pre = comp.sente_stone(stone_grid.item.grid,stone_grid.arr.grid)
237         elif index.stone == white:
238             pre = comp.gote_stone(stone_grid.item.grid,stone_grid.arr) 
239         if stone_grid.CanSetStone(index.stone, pre[0], pre[1], True) == False:                                 
240             stone_grid.CanSetStone(index.stone, pos[0], pos[1], True) 
241     ChangePlayer()
242                  
243 player1 = Player()
244 player2 = Player()
245 index = player1
246 player1.stone = black
247 player1.auto = True
248 player2.auto = True
249 player2.stone = white
250 stone_grid = StoneGrid()
251 stone_grid.Start()
252 pygame.event.get()
253 temp = pygame.time.get_ticks()
254 Paint()
255 while True:    
256     if pygame.time.get_ticks()-temp > 300:
257         if (stone_grid.active == True)and(index.auto == True):        
258             CompStone()                                      
259         temp = pygame.time.get_ticks()
260     pygame.time.wait(150)
261     for x in pygame.event.get():
262         if x.type == QUIT:
263             sys.exit()    
264     t = pygame.mouse.get_pressed()[0]
265     if (stone_grid.gameover == True)and(t == True):
266         stone_grid.Start()
267     if (index.auto == False)and(stone_grid.active == True)and(t == True):            
268         stone_grid.active = False
269         s = pygame.mouse.get_pos()
270         stone_grid.CanSetStone(index.stone,s[0]//size,s[1]//size,True)  
271         stone_grid.active = True    
272