import helper,database,login,gnugo import string from cherrypy import cpg from cherrypy.lib import httptools class PlayGame: """ displays a game and processes user input. """ def index(self,game,coord=None): username = cpg.request.sessionMap["username"] myuser = database.Users.byUsername(username) sessionid = cpg.request.sessionMap["_sessionId"] if myuser.sessionid == sessionid: if coord != None: return self.process_form(game,coord) else: return self.display_goban(game) else: httptools.redirect("/login") def is_my_turn(self,gobandict): """ gets request and util.FiedStorage form. check wether or not the current this is the players turn. return true or false. """ me = gobandict["username"] player1 = gobandict["player1"] player2 = gobandict["player2"] play = gobandict["play"] if ((player1 == me) and (play == "black")) or ((player2 == me) and (play == "white")): return True else: return False def display_goban(self,gamename,settings={}): """ gets: dictionary containing the layout of the used goban. returns: string containing the HTML code for a clickable goban. """ hoshis19x19 = [(4,4),(4,10),(4,16),(10,4),(10,10),(10,16),(16,4),(16,10),(16,16)] hoshis13x13 = [(4,4),(4,10),(7,7),(10,4),(10,10)] hoshis9x9 = [(3,3),(3,7),(5,5),(7,3),(7,7)] #TODO: check form[game] before the following asignment mygame = database.GobanTable.get(gamename) sgf = mygame.sgf gobandict = gnugo.parse_static_gnugo_sgf(sgf) gobandict["username"] = cpg.request.sessionMap["username"] gobandict["player1"],gobandict["player2"] = mygame.players() size = mygame.size settings["Data.TurnNumber"] = mygame.turn_number settings["Data.GobanSize"] = size settings["Data.GameName"] = gamename settings["Data.Play"] = gobandict["play"] if self.is_my_turn(gobandict): settings["Data.MyTurn"] = "True" else: settings["Data.MyTurn"] = "False" print gobandict for x in range(1,size+1): for y in range(1,size+1): settings["Data.Goban.%d.%d.x" % (x,y)] = x settings["Data.Goban.%d.%d.y" % (x,y)] = y if gobandict[(x,y)] == 1: settings["Data.Goban.%d.%d.color" % (x,y)] = "_white" elif gobandict[(x,y)] == 2: settings["Data.Goban.%d.%d.color" % (x,y)] = "_black" else: settings["Data.Goban.%d.%d.color" % (x,y)] = "" #now check wether or not this field is hoshi if size == 19: # 9 hoshis if (x,y) in hoshis19x19: settings["Data.Goban.%d.%d.hoshi" % (x,y)] = 1 else: pass elif size == 13: if (x,y) in hoshis13x13: settings["Data.Goban.%d.%d.hoshi" % (x,y)] = 1 else: pass elif size == 9: if (x,y) in hoshis9x9: settings["Data.Goban.%d.%d.hoshi" % (x,y)] = 1 else: pass return helper.cs_render("templates/playgame.cs",settings) def process_form(self,gamename,coord): """ gets name of a go game, coordinates of user's move. processes move. """ x,y = string.split(coord,",") position = (int(x),int(y)) mygame = database.GobanTable.get(gamename) size = mygame.size turn = mygame.turn_number sgf = mygame.sgf gobandict = gnugo.parse_static_gnugo_sgf(sgf) gobandict["player1"],gobandict["player2"] = mygame.players() gobandict["username"] = cpg.request.sessionMap["username"] gobandict["name"] = gamename gobandict["turn_number"] = turn gobandict["sgf"] = sgf settings = {} if (gobandict[position] == 0): #empty field if self.is_my_turn(gobandict): if gnugo.is_legal(gobandict,position): #gnugo says the move is ok #let gnugo make the above move, let gnugo write move to file new_sgf = gnugo.make_move_in_sgf(gobandict,position) #write new sgf file into database mygame.sgf = new_sgf mygame.turn_number = turn + 1 mygame.set_time() return self.display_goban(gamename) else: #move not ok settings["Data.Message"] = "This is not a legal move (says Gnugo)." return self.display_goban(gamename,settings) else: settings["Data.Message"] = "This is not your turn. You have to wait for the other player." return self.display_goban(gamename,settings) else: #position not empty settings["Data.Message"] = "Could not make move: Field not empty." return self.display_goban(gamename,settings) index.exposed = True