OSDN Git Service

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