def get(self): map_name = self.request.get("maps") player1 = self.request.get("player1") player2 = self.request.get("player2") player_code = self.request.get("code").replace('\r','') if not player_code: player_code = "def turn(b,r,c):"+'\n'+" return 'E'"; self.response.out.write( header() ) pl = tron_db.Program.all().fetch(50) mp = tron_db.Map.all().fetch(50) s = "<b>play an (unranked) match. it's you against the machine, or bot vs bot</b><p>" s += "<form action=/play>" s += "<textarea rows=10 cols=90 name=code>"+player_code+"</textarea><br>" s += "<select name=player1 title=player1>" if player1: s += "<option>" + player1 + "</option>\n" s += "<option> ME </option>\n" for p in pl: s += "<option>" + p.name + "</option>\n" s += "</select>" s += "<select name=player2 title=player2 >" if player2: s += "<option>" + player2 + "</option>\n" for p in pl: s += "<option>" + p.name + "</option>\n" s += "<option> ME </option>\n" s += "</select>" s += "<select name=maps title=map>" if map_name: s += "<option>" + map_name + "</option>\n" for m in mp: g,r,c,p = tron.parse_map(m.text) if p == 2: s += "<option>" + str(m.key().name()) + "</option>\n" s += "</select> " s += "<input type=submit value='play a game'>" s += "</form>" if map_name and player1 and player2: map = tron_db.Map.get_by_key_name(map_name) if player1=="ME" and player_code: pl1 = tron_db.Program(text=player_code,name=player1) else: pl1 = tron_db.Program.all().filter("name",player1).get() if player2=="ME" and player_code: pl2 = tron_db.Program(text=player_code,name=player2) else: pl2 = tron_db.Program.all().filter("name",player2).get() if map and pl1 and pl2: g = tron.Game() playgame(g,[pl1,pl2],map.text, map_name) plan = [player1,player2] hist = [g.players[0]['hist'],g.players[1]['hist']] rank = [g.players[0]['score'],g.players[1]['score']] s += drawReplay(42,plan,hist,g.errors,rank,map_name,map.text,g.turn ) else: logging.warn("invalid setup " + str(map) + " " + str(pl1) + " " + str(pl2)) self.response.out.write( s ) self.response.out.write( footer() )
def run_game(): # get a map g = tron.Game() maps = tron_db.Map.all(keys_only=True).fetch(1000) mkey = random.choice(maps) map = tron_db.Map.get(mkey) try: g.grid, g.height, g.width, players = tron.parse_map(map.text) except: logging.warn("MAP " + str(map.key().name()) + " borked!") return # get players keys = tron_db.Program.all(keys_only=True).fetch(1000) rnk = random.sample(keys, players) prog = [] for k in rnk: p = tron_db.Program.get(k) g.add_player( p.text, p.name ) prog.append(p) # dbg info s = map.key().name() + " : " for i,p in enumerate(g.players): s += p['name'] + " "; logging.info( s ); # play a game g.run() #serialize it sav = tron_db.GameInfo( mapname=map.key().name(), turn=g.turn ) for i,p in enumerate(g.players): if g.errors[i]: logging.info(p['name'] + " : " + g.errors[i]) sav.errors.append(g.errors[i]) sav.players.append(p['name']) sav.history.append(p['hist'][:500]) sav.rank.append(p['score']) if p['score'] == 0: prog[i].won += 1 if g.errors[i]: prog[i].errors += 1 prog[i].ngames += 1 #~ prog[i].put() sav.put() # update ranking calc_ranks( prog, sav.rank )
def post(self): author = self.request.get("author") name = self.request.get("name") text = self.request.get("text") try: g,r,c,p = tron.parse_map(text) #~ except Exception, e: #~ self.response.out.write( header() + "your map was rejected("+str(e)+")" + footer() ) except : self.response.out.write( header() + "your map was rejected()" + footer() ) return if author and name and text: m = tron_db.Map(key_name=name, text=text, author=author) m.put() self.redirect("/maps/")
def playgame(g,players,map_text,map_name ): # get a map try: g.grid, g.height, g.width, nplayers = tron.parse_map(map_text) except: logging.warn("MAP " + str(map_name) + " borked!") return None for p in players: g.add_player( p.text, p.name ) # dbg info s = "play: " + map_name + " : " for i,p in enumerate(g.players): s += p['name'] + " "; logging.info( s ); # play a game g.run()