#!/usr/bin/python DEBUG = 1 import sys,string import cgi import helper,gnugo,database picklefile = "goban.pickledump" ############################################################################### def display_goban(goban,req,form): """ gets: dictionary containing the layout of the used goban. returns: string containing the HTML code for a clickable goban. """ data = "" 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)] data += '\n

\n

\n' data += """ """ % (form["sessionid"],form["username"],form["game"]) #TODO: check form[game] before the following asignment mygame = database.GobanTable.byName(form["game"]) sgf = mygame.sgf helper.debug(req,form,sgf) gobandict = gnugo.parse_static_gnugo_sgf(sgf) try: size = goban["size"] except: #TODO: proper error management raise "[EE] display_goban: got broken goban dictionary." sys.exit(1) for x in range(1,size+1): for y in range(1,size+1): # check for white or black stone if gobandict[(x,y)] == 1: stone = "_white" elif gobandict[(x,y)] == 2: stone = "_black" else: stone = "" sx = str(x) sy = str(y) # check position: if (x == 1) and (y == 1): # upper left data += '' elif (x == 1) and (y == size): # upper right data += '' elif (x == size) and (y == size): # lower right data += '
\n' elif (x == size) and (y == 1): # lower left data += '' elif (y == 1): #left line data += '' elif (x == 1): # top line data += '' elif (y == size): # right line data += '' elif (x == size): #bottom line data += '' else: # hoshi or empty inner field defaultfield = '' #too lazy to make special images for hoshi fields with stones: if gobandict[(x,y)] == 1: hoshifield = '' elif gobandict[(x,y)] == 2: hoshifield = '' else: #empty hoshi hoshifield = '' if size == 19: # 9 hoshis if (x,y) in hoshis19x19: data += hoshifield else: data += defaultfield elif size == 13: if (x,y) in hoshis13x13: data += hoshifield else: data += defaultfield elif size == 9: if (x,y) in hoshis9x9: data += hoshifield else: data += defaultfield data += '\n' data += '\n

' return data def process_form(req,form,gobandict): """ gets a goban dictionary. reads out the returned CGI form. if the goban has been clicked, return a (x,y) tuple of the position. """ ret = "" #if form == empty (which means if page is displayed for the first time): if form.keys() != []: #cut out the name of the clicked button for item in form.keys(): if string.find(item,").x")>0: coordstring = string.split(item,".x")[0] position = helper.string_to_tuple(coordstring) ret = set_stone(gobandict, position,req,form) return ret def set_stone(gobandict, position,req,form): """gets a goban dictionary and a (x,y)-tuple. Returns a modified goban.""" size = gobandict["size"] name = gobandict["name"] turn = gobandict["turn_number"] if (gobandict[position] == 0): #empty field if gnugo.is_legal(gobandict,position,req,form): #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(req,form,gobandict,position) #write new sgf file into database mygame = database.GobanTable.byName(name) mygame.sgf = new_sgf mygame.turn_number = turn + 1 mygame.set_time() return "" else: #move not ok return "This is not a legal move (says Gnugo)." else: #position not empty return "Could not make move: Field not empty."