OSDN Git Service

細かい見直し 仕上げ
[deep-learning/learning.git] / reversi.py
index 6e66e63..c844f43 100755 (executable)
@@ -5,7 +5,6 @@ Created on 2015/08/25
 '''
 import pygame,os,sys
 from pygame.locals import *
-from threading import Thread
 from network import Comp
 
 
@@ -13,7 +12,7 @@ pygame.font.init()
 comp = Comp()
 screen = pygame.display.set_mode((400,400))
 
-none, black, white, effect = 0,1,2,3
+none, black, white = 0,1,2
 
 def Path():
     for name in sys.argv:
@@ -32,17 +31,11 @@ class Player():
     auto = False
     stone = none
 
-class Effect(Thread):
-    def __init__(self):
-        self.X = 0
-        self.Y = 0
-        self.Left = 0
-        self.Top = 0
-
 class Grid():       
     def __init__(self):        
         self.grid = [[none for y in range(8)] for x in range(8)]
-        self.stone = none    
+        self.stone = none   
+         
     def Assign(self,item):
         for x in range(8):
             for y in range(8):
@@ -50,15 +43,11 @@ class Grid():
     
 class StoneGrid():
     def __init__(self):    
-        self.arr = [-1 for x in range(65)]
-        self.map = [-1 for x in range(65)]
         self.item = Grid()
-        self.buffer = [Grid() for x in range(61)]
-        self.turn_number = 0
+        self.buffer = Grid()
+        self.arr = Grid()
         self.turn_index = 0
         self.active = True
-        self.list = []        
-        self.effect_stone = none
         self.gameover = False
         self.text = pygame.font.SysFont(pygame.font.get_fonts()[0], 25, True).render('reversi',False,(0,0,255)).convert()        
     
@@ -71,15 +60,18 @@ class StoneGrid():
         self.item.grid[4][3] = white 
         self.item.grid[3][4] = white 
         self.turn_index = 0
-        self.turn_number = 0
-        self.buffer[0].Assign(self.item)
         
     def CalScore(self,stone,x,y):
-        def Normal():
-            for x in range(8):
-                for y in range(8):
-                    if self.CanSetStone(stone, x, y, False) == True:
+        self.buffer.Assign(self.item)
+        if self.CanSetStone(stone, x, y, True) == True:
+            self.score = 0.5
+            for i in range(8):
+                for j in range(8):
+                    if self.CanSetStone(stone, i, j, False) == True:
                         self.score += 1
+            self.item.Assign(self.buffer)
+        else:
+            self.score = 0
                                            
     def CanSetStone(self,stone,x,y,reverse):
         p = [True,False]        
@@ -93,27 +85,21 @@ class StoneGrid():
                 if not ((0 <= d)and(d < 8)and(0 <= e)and(e < 8)):
                     break
                 s = self.item.grid[d][e]
-                if s == effect:
-                    s = self.effect_stone
                 if s == none:
                     break
                 elif s == stone:                                
                     if i > 1:
-                        if (p[1] == False)and(reverse == True):
-                            self.item.grid[x][y] = stone
-                            p[1] = True
-                        if reverse == True:                            
+                        if reverse == True:   
+                            if p[1] == False:
+                                self.item.grid[x][y] = stone
+                                p[1] = True                         
                             j = 1
                             while j <= i-1:
                                 self.item.grid[x+m*j][y+n*j] = stone
                                 j += 1
-                            Paint()
-                            break
                         else:
                             p[0],p[1] = False,True
-                            break
-                    else:
-                        break
+                    break
                 else:
                     i += 1
                    
@@ -128,23 +114,23 @@ class StoneGrid():
             Method(1, 1)
         return p[1]
                             
-    def NextStone(self,stone,pos):
-        result = False
+    def T_Data(self,stone):
         n = 0
-        self.score = 0
         for i in range(8):
             for j in range(8):
-                if self.CalScore(stone, i, j) == True:
-                    if result == False:
-                        result = True
-                    self.arr[1+(j-1)*8+i] = self.score
+                self.CalScore(stone, i, j)
+                if self.score > 0:
+                    self.arr.grid[i][j] = self.score
                     if self.score > n:
                         n = self.score
-                    pos[0],pos[1] = i,j
-        for i in range(1,len(self.arr)):
-            if self.arr[i] != -1:
-                self.arr[i] = (n-self.arr[i])/n
-        return result
+                else:
+                    self.arr.grid[i][j] = 0
+        if n > 0:
+            for i in range(8):
+                for j in range(8):
+                    k = self.arr.grid[i][j]
+                    if k != 0:
+                        self.arr.grid[i][j] = (n - k + 0.5) / n
     
     def Start(self):       
         global index 
@@ -152,14 +138,8 @@ class StoneGrid():
         self.Clear()
         self.active = True
         self.gameover = False
+        Paint()
         
-    def ReStart(self):
-        self.active = True
-        self.gameover = False
-        self.turn_index = self.turn_number
-        
-    def Pause(self):
-        self.active = False
                
     def Paint(self):
         if self.effect_stone == black:
@@ -181,8 +161,6 @@ def Paint():
                 screen.blit(img,r,pygame.Rect(2*size,0,3*size,size))
             elif s == black:
                 screen.blit(img,r,pygame.Rect(size,0,2*size,size))
-            elif s == effect:
-                continue
             else:
                 screen.blit(img,r,pygame.Rect(0,0,size,size))
     if stone_grid.gameover == True:
@@ -192,12 +170,13 @@ def Paint():
 def ChangePlayer():  
     def Main():
         global index        
+        Paint()      
         if index == player1:
             index = player2
             return 'white'
         else:
             index = player1
-            return 'black'        
+            return 'black'  
     
     def Execute():
         for x in range(8):
@@ -231,56 +210,56 @@ def ChangePlayer():
             Paint()
         else:
             pygame.display.set_caption(s)
+            stone_grid.turn_index += 1
     else:
         pygame.display.set_caption(s)
+        stone_grid.turn_index += 1
         
 def CompStone():
-    pos = [0,0]
-    stone_grid.map[0] = index.stone
-    stone_grid.arr[0] = index.stone
-    i = 1 
-    for y in range(8):
-        for x in range(8):
-            stone_grid.map[i] = stone_grid.item.grid[x][y]
-            i += 1
     stone_grid.active = False
-    if stone_grid.NextStone(index.stone, pos) == True:
-        if index.stone == black:
-            pre = comp.sente_stone(stone_grid.map,stone_grid.arr)
-        elif index.stone == white:
-            pre = comp.gote_stone(stone_grid.map,stone_grid.arr) 
-        if stone_grid.CanSetStone(index.stone, pre[0], pre[1], True) == False:                                 
-            stone_grid.CanSetStone(index.stone, pos[0], pos[1], True) 
+    stone_grid.T_Data(index.stone)
+    if index.stone == black:
+        pre = comp.sente_stone(stone_grid.item.grid,stone_grid.arr.grid)
+    elif index.stone == white:
+        pre = comp.gote_stone(stone_grid.item.grid,stone_grid.arr.grid) 
+    stone_grid.CanSetStone(index.stone, pre[0], pre[1], True)
+    stone_grid.active = True
+
+if __name__ == '__main__':
+    player1 = Player()
+    player2 = Player()
+    index = player1
+    player1.stone = black
+    player1.auto = True
+    player2.auto = True
+    player2.stone = white
+    stone_grid = StoneGrid()
+    stone_grid.Start()
+    temp = pygame.time.get_ticks()
+    Paint()
+    tt = (player1.auto == True)and(player2.auto == True)
+    if tt == True:
+        k = 10
     else:
-        ChangePlayer()
-                 
-player1 = Player()
-player2 = Player()
-index = player1
-player1.stone = black
-player1.auto = True
-player2.auto = True
-player2.stone = white
-stone_grid = StoneGrid()
-stone_grid.Start()
-pygame.event.get()
-temp = pygame.time.get_ticks()
-Paint()
-while True:    
-    if pygame.time.get_ticks()-temp > 300:
-        if (stone_grid.active == True)and(index.auto == True):        
-            CompStone()                                      
-        temp = pygame.time.get_ticks()
-    pygame.time.wait(150)
-    for x in pygame.event.get():
-        if x.type == QUIT:
-            sys.exit()    
-    t = pygame.mouse.get_pressed()[0]
-    if (stone_grid.gameover == True)and(t == True):
-        stone_grid.Start()
-    if (index.auto == False)and(stone_grid.active == True)and(t == True):            
-        stone_grid.active = False
-        s = pygame.mouse.get_pos()
-        stone_grid.CanSetStone(index.stone,s[0]//50,s[1]//50,True)         
-        stone_grid.active = True    
-        
\ No newline at end of file
+        k = 150
+    while True:    
+        if (pygame.time.get_ticks()-temp > 2*k)and(stone_grid.gameover == False):
+            if (stone_grid.active == True)and(index.auto == True):        
+                CompStone()            
+                ChangePlayer()                 
+            temp = pygame.time.get_ticks()
+        pygame.time.wait(k)
+        for x in pygame.event.get():
+            if x.type == QUIT:
+                sys.exit()    
+        t = pygame.mouse.get_pressed()[0]
+        if (stone_grid.gameover == True)and((t == True)or(tt == True)):
+            stone_grid.Start()
+        if (index.auto == False)and(stone_grid.active == True)and(t == True):            
+            stone_grid.active = False
+            s = pygame.mouse.get_pos()
+            if stone_grid.CanSetStone(index.stone,s[0]//size,s[1]//size,True) == True:
+                stone_grid.turn_index += 1            
+                ChangePlayer() 
+            stone_grid.active = True        
+