Example #1
0
 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>&nbsp;&nbsp;"
     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() )
Example #2
0
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 )
Example #3
0
 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/")
Example #4
0
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()