X-Git-Url: https://git.ucc.asn.au/?p=progcomp2013.git;a=blobdiff_plain;f=qchess%2Fsrc%2Fmain.py;h=6ebf70c0972984a4a7db73cb3196a237084b940a;hp=137d1cb7f77a19395459012138d00d764bb707f7;hb=87681496dec0b1bdadaf0733137010615997fb05;hpb=a35e4dc5f4fb6325785b6f8b123266976107b748 diff --git a/qchess/src/main.py b/qchess/src/main.py index 137d1cb..6ebf70c 100644 --- a/qchess/src/main.py +++ b/qchess/src/main.py @@ -16,6 +16,7 @@ import os import time turn_delay = 0.5 +sleep_timeout = None [game, graphics] = [None, None] def make_player(name, colour): @@ -24,10 +25,22 @@ def make_player(name, colour): return HumanPlayer(name, colour) s = name[1:].split(":") if s[0] == "network": - address = None + ip = None + port = 4562 + #print str(s) if len(s) > 1: - address = s[1] - return NetworkReceiver(colour, address) + if s[1] != "": + ip = s[1] + if len(s) > 2: + port = int(s[2]) + + if ip == None: + if colour == "black": + port += 1 + elif colour == "white": + port += 1 + + return NetworkPlayer(colour, Network((ip, port)), None) if s[0] == "internal": import inspect @@ -47,7 +60,11 @@ def make_player(name, colour): sys.stderr.write(sys.argv[0] + " : Can't find an internal agent matching \"" + s[1] + "\"\n") sys.stderr.write(sys.argv[0] + " : Choices are: " + str(map(lambda e : e[0], internal_agents)) + "\n") return None - + if s[0] == "fifo": + if len(s) > 1: + return FifoPlayer(s[1], colour) + else: + return FifoPlayer(str(os.getpid())+"."+colour, colour) else: return ExternalAgent(name, colour) @@ -64,12 +81,16 @@ def main(argv): global turn_delay global agent_timeout - global log_file + global log_files global src_file global graphics_enabled global always_reveal_states + global sleep_timeout + + + server_addr = None - max_lines = None + max_moves = None src_file = None style = "quantum" @@ -109,23 +130,42 @@ def main(argv): elif arg[1] == '-' and arg[2:] == "reveal": always_reveal_states = True elif (arg[1] == '-' and arg[2:] == "graphics"): - graphics_enabled = not graphics_enabled + graphics_enabled = True + elif (arg[1] == '-' and arg[2:] == "no-graphics"): + graphics_enabled = False elif (arg[1] == '-' and arg[2:].split("=")[0] == "file"): # Load game from file if len(arg[2:].split("=")) == 1: src_file = sys.stdin else: - src_file = open(arg[2:].split("=")[1].split(":")[0]) - - if len(arg[2:].split(":")) == 2: - max_lines = int(arg[2:].split(":")[1]) - + f = arg[2:].split("=")[1] + if f[0:7] == "http://": + src_file = HttpReplay(f) + else: + src_file = FileReplay(f.split(":")[0]) + + if len(f.split(":")) == 2: + max_moves = int(f.split(":")[1]) + + elif (arg[1] == '-' and arg[2:].split("=")[0] == "server"): + #debug("Server: " + str(arg[2:])) + if len(arg[2:].split("=")) <= 1: + server_addr = True + else: + server_addr = arg[2:].split("=")[1] + elif (arg[1] == '-' and arg[2:].split("=")[0] == "log"): # Log file if len(arg[2:].split("=")) == 1: - log_file = sys.stdout + log_files.append(LogFile(sys.stdout,"")) else: - log_file = open(arg[2:].split("=")[1], "w") + f = arg[2:].split("=")[1] + if f == "": + log_files.append(LogFile(sys.stdout, "")) + elif f[0] == '@': + log_files.append(ShortLog(f[1:])) + else: + log_files.append(LogFile(open(f, "w", 0), f)) elif (arg[1] == '-' and arg[2:].split("=")[0] == "delay"): # Delay if len(arg[2:].split("=")) == 1: @@ -139,12 +179,34 @@ 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 os.system("less data/help.txt") # The best help function return 0 - + + # Dedicated server? + + #debug("server_addr = " + str(server_addr)) + + if server_addr != None: + if server_addr == True: + return dedicated_server() + else: + if len(players) > 1: + sys.stderr.write("Only a single player may be provided when --server is used\n") + return 1 + if len(players) == 1: + return client(server_addr, players[0].name) + else: + return client(server_addr) + # Create the board @@ -165,17 +227,21 @@ def main(argv): if graphics_enabled: sys.stderr.write(sys.argv[0] + " : (You won't get a GUI, because --file was used, and the author is lazy)\n") return 44 - game = ReplayThread(players, src_file, end=end, max_lines=max_lines) + game = ReplayThread(players, src_file, end=end, max_moves=max_moves) else: board = Board(style) + board.max_moves = max_moves game = GameThread(board, players) + # Initialise GUI 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 @@ -185,6 +251,15 @@ def main(argv): # If there are no players listed, display a nice pretty menu if len(players) != 2: if graphics != None: + + server_addr = graphics.SelectServer() + if server_addr != None: + pygame.quit() # Time to say goodbye + if server_addr == True: + return dedicated_server() + else: + return client(server_addr) + players = graphics.SelectPlayers(players) else: sys.stderr.write(sys.argv[0] + " : Usage " + sys.argv[0] + " white black\n") @@ -195,27 +270,23 @@ def main(argv): sys.stderr.write(sys.argv[0] + " : Graphics window closed before players chosen\n") return 45 - - # Wrap NetworkSender players around original players if necessary - for i in range(len(players)): - if isinstance(players[i], NetworkReceiver): - players[i].board = board # Network players need direct access to the board - for j in range(len(players)): - if j == i: + old = players[:] + for p in old: + if isinstance(p, NetworkPlayer): + for i in range(len(old)): + if old[i] == p or isinstance(old[i], NetworkPlayer): continue - if isinstance(players[j], NetworkSender) or isinstance(players[j], NetworkReceiver): - continue - players[j] = NetworkSender(players[j], players[i].address) - players[j].board = board - - # Connect the networked players + players[i] = NetworkPlayer(old[i].colour, p.network, old[i]) + for p in players: - if isinstance(p, NetworkSender) or isinstance(p, NetworkReceiver): - if graphics != None: - graphics.board.display_grid(graphics.window, graphics.grid_sz) - graphics.message("Connecting to " + p.colour + " player...") - p.connect() - + #debug(str(p)) + if isinstance(p, NetworkPlayer): + p.board = game.board + if not p.network.connected: + if not p.network.server: + time.sleep(0.2) + p.network.connect() + # If using windows, select won't work; use horrible TimeoutPlayer hack if agent_timeout > 0: @@ -254,19 +325,28 @@ def main(argv): error = game.error - if log_file != None and log_file != sys.stdout: - log_file.write("# EOF\n") - log_file.close() + for l in log_files: + l.close() if src_file != None and src_file != sys.stdin: src_file.close() + sys.stdout.write(game.final_result + "\n") + return error + + + + + + + # This is how python does a main() function... if __name__ == "__main__": + retcode = 0 try: - sys.exit(main(sys.argv)) + retcode = main(sys.argv) except KeyboardInterrupt: sys.stderr.write(sys.argv[0] + " : Got KeyboardInterrupt. Stopping everything\n") if isinstance(graphics, StoppableThread): @@ -277,6 +357,19 @@ if __name__ == "__main__": game.stop() if game.is_alive(): game.join() - - sys.exit(102) + retcode = 102 + #except Exception, e: + # sys.stderr.write(sys.argv[0] + " : " + e.message + "\n") + # retcode = 103 + + try: + sys.stdout.close() + except: + pass + try: + sys.stderr.close() + except: + pass + sys.exit(retcode) +