Enable screensaver
[progcomp2013.git] / qchess / qchess.py
index 327d193..5883ca5 100755 (executable)
@@ -20,7 +20,7 @@ class Piece():
                
                self.move_pattern = None
                self.coverage = None
-               self.possible_moves = None
+               self.possible_moves = {}
                
 
        def init_from_copy(self, c):
@@ -59,7 +59,10 @@ class Piece():
                # Draw the two possible types underneath the current_type image
                for i in range(len(self.types)):
                        if always_reveal_states == True or self.types[i][0] != '?':
-                               img = small_images[self.colour][self.types[i]]
+                               if self.types[i][0] == '?':
+                                       img = small_images[self.colour][self.types[i][1:]]
+                               else:
+                                       img = small_images[self.colour][self.types[i]]
                        else:
                                img = small_images[self.colour]["unknown"] # If the type hasn't been revealed, show a placeholder
 
@@ -294,7 +297,7 @@ class Board():
                #print "Moving " + str(x) + "," + str(y) + " to " + str(x2) + "," + str(y2) + "; possible_moves are " + str(self.possible_moves(piece))
                
                if not [x2,y2] in self.possible_moves(piece):
-                       raise Exception("ILLEGAL move")
+                       raise Exception("ILLEGAL move " + str(x2)+","+str(y2))
                
                self.grid[x][y] = None
                taken = self.grid[x2][y2]
@@ -405,7 +408,7 @@ class Board():
                
                for i in range(len(p.types)):
                        t = p.types[i]
-                       prob = 0.5
+                       prob = 1.0 / float(len(p.types))
                        if t == "unknown" or p.types[i][0] == '?':
                                total_types = 0
                                for t2 in self.unrevealed_types[p.colour].keys():
@@ -413,17 +416,17 @@ class Board():
                                
                                for t2 in self.unrevealed_types[p.colour].keys():
                                        prob2 = float(self.unrevealed_types[p.colour][t2]) / float(total_types)
-                                       p.current_type = t2
-                                       for point in self.possible_moves(p, reject_allied):
+                                       #p.current_type = t2
+                                       for point in self.possible_moves(p, reject_allied, state=t2):
                                                result[point[0]][point[1]] += prob2 * prob
                                
                        else:
-                               p.current_type = t
-                               for point in self.possible_moves(p, reject_allied):
-                                       result[point[0]][point[1]] += prob
+                               #p.current_type = t
+                               for point in self.possible_moves(p, reject_allied, state=t):
+                                               result[point[0]][point[1]] += prob
                
                #self.verify()
-               p.current_type = "unknown"
+               #p.current_type = "unknown"
                return result
 
        def prob_is_type(self, p, state):
@@ -461,8 +464,7 @@ class Board():
                        p.current_type = old_type
                        return result
                
-               if p.possible_moves != None:
-                       return p.possible_moves
+               
                
                
                result = []
@@ -614,7 +616,7 @@ class Board():
 import subprocess
 import select
 import platform
-
+import re
 
 agent_timeout = -1.0 # Timeout in seconds for AI players to make moves
                        # WARNING: Won't work for windows based operating systems
@@ -666,7 +668,7 @@ class ExternalAgent(Player):
                if self.p.stdout in ready:
                        #sys.stderr.write("Reading from " + str(self.p) + " 's stdout...\n")
                        try:
-                               result = self.p.stdout.readline().strip("\r\n")
+                               result = self.p.stdout.readline().strip(" \t\r\n")
                                #sys.stderr.write("Read \'" + result + "\' from " + str(self.p) + "\n")
                                return result
                        except: # Exception, e:
@@ -680,7 +682,8 @@ class ExternalAgent(Player):
                line = self.get_response()
                
                try:
-                       result = map(int, line.split(" "))
+                       m = re.match("\s*(\d+)\s+(\d+)\s*", line)
+                       result = map(int, [m.group(1), m.group(2)])
                except:
                        raise Exception("GIBBERISH \"" + str(line) + "\"")
                return result
@@ -696,7 +699,9 @@ class ExternalAgent(Player):
                line = self.get_response()
                
                try:
-                       result = map(int, line.split(" "))
+                       m = re.match("\s*(\d+)\s+(\d+)\s*", line)
+                       result = map(int, [m.group(1), m.group(2)])
+
                except:
                        raise Exception("GIBBERISH \"" + str(line) + "\"")
                return result
@@ -1869,11 +1874,14 @@ def load_images(image_dir=os.path.join(os.path.curdir, "data", "images")):
                        small_images[c].update({p : pygame.image.load(os.path.join(image_dir, c + "_" + p + "_small.png"))})
 # --- images.py --- #
 graphics_enabled = True
+
 try:
        import pygame
+       os.environ["SDL_VIDEO_ALLOW_SCREENSAVER"] = "1"
 except:
        graphics_enabled = False
        
+import time
 
 
 
@@ -1894,6 +1902,8 @@ class GraphicsThread(StoppableThread):
                self.error = 0
                self.lock = threading.RLock()
                self.cond = threading.Condition()
+               self.sleep_timeout = None
+               self.last_event = time.time()
 
                #print "Test font"
                pygame.font.Font(os.path.join(os.path.curdir, "data", "DejaVuSans.ttf"), 32).render("Hello", True,(0,0,0))
@@ -1917,19 +1927,25 @@ class GraphicsThread(StoppableThread):
                
                while not self.stopped():
                        
-                       #print "Display grid"
-                       self.board.display_grid(window = self.window, grid_sz = self.grid_sz) # Draw the board
+                       if self.sleep_timeout == None or (time.time() - self.last_event) < self.sleep_timeout:
+                       
+                               #print "Display grid"
+                               self.board.display_grid(window = self.window, grid_sz = self.grid_sz) # Draw the board
 
-                       #print "Display overlay"
-                       self.overlay()
+                               #print "Display overlay"
+                               self.overlay()
 
-                       #print "Display pieces"
-                       self.board.display_pieces(window = self.window, grid_sz = self.grid_sz) # Draw the board                
+                               #print "Display pieces"
+                               self.board.display_pieces(window = self.window, grid_sz = self.grid_sz) # Draw the board                
+                               
+                       else:
+                               self.window.fill((0,0,0))
 
                        pygame.display.flip()
 
                        for event in pygame.event.get():
-                               if event.type == pygame.QUIT:
+                               self.last_event = time.time()
+                               if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_q):
                                        if isinstance(game, GameThread):
                                                with game.lock:
                                                        game.final_result = ""
@@ -1941,8 +1957,11 @@ class GraphicsThread(StoppableThread):
                                        break
                                elif event.type == pygame.MOUSEBUTTONDOWN:
                                        self.mouse_down(event)
+                                       
                                elif event.type == pygame.MOUSEBUTTONUP:
-                                       self.mouse_up(event)
+                                       self.mouse_up(event)                    
+                               
+                               
                                        
 
                                
@@ -2326,6 +2345,7 @@ import os
 import time
 
 turn_delay = 0.5
+sleep_timeout = None
 [game, graphics] = [None, None]
 
 def make_player(name, colour):
@@ -2378,6 +2398,7 @@ def main(argv):
        global src_file
        global graphics_enabled
        global always_reveal_states
+       global sleep_timeout
 
        max_moves = None
        src_file = None
@@ -2459,6 +2480,12 @@ def main(argv):
                                agent_timeout = -1
                        else:
                                agent_timeout = float(arg[2:].split("=")[1])
+               elif (arg[1] == '-' and arg[2:].split("=")[0] == "blackout"):
+                       # Screen saver delay
+                       if len(arg[2:].split("=")) == 1:
+                               sleep_timeout = -1
+                       else:
+                               sleep_timeout = float(arg[2:].split("=")[1])
                                
                elif (arg[1] == '-' and arg[2:] == "help"):
                        # Help
@@ -2498,6 +2525,8 @@ def main(argv):
        if graphics_enabled == True:
                try:
                        graphics = GraphicsThread(game.board, grid_sz = [64,64]) # Construct a GraphicsThread!
+                       
+                       graphics.sleep_timeout = sleep_timeout
 
                except Exception,e:
                        graphics = None
@@ -2604,4 +2633,4 @@ if __name__ == "__main__":
                sys.exit(102)
 
 # --- main.py --- #
-# EOF - created from make on Thu Feb 28 18:12:37 WST 2013
+# EOF - created from make on Sat Mar 23 12:55:44 WST 2013

UCC git Repository :: git.ucc.asn.au