OSDN Git Service

miss in [x][y]
[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 threading import Thread
9 from network import * 
10
11
12 pygame.font.init()
13 screen = pygame.display.set_mode((400,400))
14
15 none, black, white, effect = 0,1,2,3
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 Effect(Thread):
35     def __init__(self):
36         self.X = 0
37         self.Y = 0
38         self.Left = 0
39         self.Top = 0
40
41 class Grid():       
42     def __init__(self):        
43         self.grid = [[none for y in range(8)] for x in range(8)]
44         self.stone = none    
45     def Assign(self,item):
46         for x in range(8):
47             for y in range(8):
48                 self.grid[x][y] = item.grid[x][y]
49     
50 class StoneGrid():
51     def __init__(self):    
52         self.arr = [-1 for x in range(65)]
53         self.map = [-1 for x in range(65)]
54         self.item = Grid()
55         self.buffer = [Grid() for x in range(61)]
56         self.turn_number = 0
57         self.turn_index = 0
58         self.active = True
59         self.list = []        
60         self.effect_stone = none
61         self.gameover = False
62         self.text = pygame.font.SysFont(pygame.font.get_fonts()[0], 25, True).render('reversi',False,(0,0,255)).convert()        
63     
64     def Clear(self):
65         for x in range(8):
66             for y in range(8):
67                 self.item.grid[x][y] = none
68         self.item.grid[3][3] = black
69         self.item.grid[4][4] = black
70         self.item.grid[4][3] = white 
71         self.item.grid[3][4] = white 
72         self.turn_index = 0
73         self.turn_number = 0
74         self.buffer[0].Assign(self.item)
75         
76     def CalScore(self,stone,x,y):
77         def Normal():
78             for x in range(8):
79                 for y in range(8):
80                     if self.CanSetStone(stone, x, y, False) == True:
81                         self.score += 1
82                                            
83     def CanSetStone(self,stone,x,y,reverse):
84         p = [True,False]        
85         def Method(m,n):            
86             if p[0] == False:
87                 return
88             i = 1
89             while True:
90                 d = x+m*i
91                 e = y+n*i
92                 if not ((0 <= d)and(d < 8)and(0 <= e)and(e < 8)):
93                     break
94                 s = self.item.grid[d][e]
95                 if s == effect:
96                     s = self.effect_stone
97                 if s == none:
98                     break
99                 elif s == stone:                                
100                     if i > 1:
101                         if (p[1] == False)and(reverse == True):
102                             self.item.grid[x][y] = stone
103                             p[1] = True
104                         if reverse == True:                            
105                             j = 1
106                             while j <= i-1:
107                                 self.item.grid[x+m*j][y+n*j] = stone
108                                 j += 1
109                             break
110                         else:
111                             p[0],p[1] = False,True
112                             break
113                     else:
114                         break
115                 else:
116                     i += 1
117                    
118         if self.item.grid[x][y] == none:            
119             Method(-1,-1)
120             Method(-1, 0)
121             Method(-1, 1)
122             Method(0, -1)
123             Method(0, 1)
124             Method(1, -1)
125             Method(1, 0)
126             Method(1, 1)
127         return p[1]
128                             
129     def NextStone(self,stone,pos):
130         result = False
131         n = 0
132         self.score = 0
133         for i in range(8):
134             for j in range(8):
135                 if self.CalScore(stone, i, j) == True:
136                     if result == False:
137                         result = True
138                     self.arr[1+(j-1)*8+i] = self.score
139                     if self.score > n:
140                         n = self.score
141                     pos[0],pos[1] = i,j
142         for i in range(1,len(self.arr)):
143             if self.arr[i] != -1:
144                 self.arr[i] = (n-self.arr[i])/n
145         return result
146     
147     def Start(self):       
148         global index 
149         index = player1
150         self.Clear()
151         self.active = True
152         self.gameover = False
153         
154     def ReStart(self):
155         self.active = True
156         self.gameover = False
157         self.turn_index = self.turn_number
158         
159     def Pause(self):
160         self.active = False
161         
162     def ListExecute(self):
163         while True:
164             i = 0            
165             for x in self.list:                
166                 if x.X < index_x-1:
167                     x.X += 1
168                 elif x.Y < index_y-1:
169                     x.X = 0
170                     x.Y += 1
171                 else:
172                     self.item.grid[x.Left][x.Top] = self.effect_stone
173                     self.list.remove(x)
174                 pygame.time.wait(5)                
175                 i += 1              
176                 self.Paint() 
177                 pygame.display.update()            
178             if len(self.list) == 0:                              
179                 if self.turn_index < 60:                               
180                     self.turn_index += 1
181                     self.turn_number += 1  
182                     self.buffer[self.turn_index].Assign(self.item)        
183                     self.buffer[self.turn_index].stone = self.effect_stone                                                    
184                     Paint()
185                     ChangePlayer()       
186                     if self.gameover == False:             
187                         self.active = True
188                 else:
189                     self.gameover = True
190                 break                   
191        
192     def Paint(self):
193         if self.effect_stone == black:
194             s = bkwhite           
195         else:
196             s = bkblack
197         i = 0
198         while i < len(self.list):
199             p = self.list[i]
200             screen.blit(s,(p.Left*50,p.Top*50),(p.X*50,p.Y*50,50,50))
201             i += 1
202                     
203 def Paint():
204     for x in range(8):
205         for y in range(8):
206             s = stone_grid.item.grid[x][y]
207             r = pygame.Rect(x*size,y*size,(x+1)*size,(y+1)*size)
208             if s == white:
209                 screen.blit(img,r,pygame.Rect(2*size,0,3*size,size))
210             elif s == black:
211                 screen.blit(img,r,pygame.Rect(size,0,2*size,size))
212             elif s == effect:
213                 continue
214             else:
215                 screen.blit(img,r,pygame.Rect(0,0,size,size))
216     if stone_grid.gameover == True:
217         screen.blit(stone_grid.text,pygame.Rect(0,0,800,50))
218     pygame.display.update()
219        
220 def ChangePlayer():  
221     def Main():
222         global index        
223         if index == player1:
224             index = player2
225             return 'white'
226         else:
227             index = player1
228             return 'black'        
229     
230     def Execute():
231         for x in range(8):
232             for y in range(8):
233                 if stone_grid.CanSetStone(index.stone, x, y, False) == True:
234                     return True
235         return False
236         
237     s = Main()+str(stone_grid.turn_index+1)
238     if Execute() == False:
239         s = Main()+str(stone_grid.turn_index+1)
240         if Execute() == False:
241             s = 'game over'
242             i = 0
243             j = 0
244             for x in range(8):
245                 for y in range(8):
246                     if stone_grid.item.grid[x][y] == black:
247                         i += 1
248                     elif stone_grid.item.grid[x][y] == white:
249                         j += 1
250             pygame.display.set_caption(s+str(stone_grid.turn_index+1))
251             if i > j:
252                 s = 'Player1 Win!'
253             elif i < j:
254                 s = 'Player2 Win!'
255             else:
256                 s = 'Draw'            
257             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()
258             stone_grid.gameover = True
259             Paint()
260         else:
261             pygame.display.set_caption(s)
262     else:
263         pygame.display.set_caption(s)
264         
265 def CompStone():
266     pos = [0,0]
267     stone_grid.map[0] = index.stone
268     stone_grid.arr[0] = index.stone
269     i = 1 
270     for y in range(8):
271         for x in range(8):
272             stone_grid.map[i] = stone_grid.item.grid[x][y]
273             i += 1
274     stone_grid.active = False
275     if stone_grid.NextStone(index.stone, pos) == True:
276         if index.stone == black:
277             pos = sente_stone(stone_grid.map,stone_grid.arr)
278         elif index.stone == white:
279             pos = gote_stone(stone_grid.map,stone_grid.arr)                                  
280         stone_grid.CanSetStone(index.stone, pos[0], pos[1], True) 
281     else:
282         ChangePlayer()
283                  
284 player1 = Player()
285 player2 = Player()
286 index = player1
287 player1.stone = black
288 player1.auto = True
289 player2.auto = True
290 player2.stone = white
291 stone_grid = StoneGrid()
292 stone_grid.Start()
293 pygame.event.get()
294 temp = pygame.time.get_ticks()
295 Paint()
296 while True:    
297     if pygame.time.get_ticks()-temp > 300:
298         if (stone_grid.active == True)and(index.auto == True):        
299             CompStone()                                      
300         temp = pygame.time.get_ticks()
301     pygame.time.wait(150)
302     for x in pygame.event.get():
303         if x.type == QUIT:
304             sys.exit()    
305     t = pygame.mouse.get_pressed()[0]
306     if (stone_grid.gameover == True)and(t == True):
307         stone_grid.Start()
308     if (index.auto == False)and(stone_grid.active == True)and(t == True):            
309         stone_grid.active = False
310         s = pygame.mouse.get_pos()
311         stone_grid.CanSetStone(index.stone,s[0]//50,s[1]//50,True)         
312         stone_grid.active = True    
313