OSDN Git Service

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