Beispiel #1
0
class Game(object):
    """ Before instantiating this object, make sure you have a user_config.json """
    def __init__(self, sio):
        self.sio = sio

        # Game data.
        self.player_index = None

        self.map = None  # Initialized in the first update call.
        self.update_count = 0
        self.file = None  # For logging.
        self.path_name = "replay_log/"

    def on_connect(self):
        print("connect")

        f = open("user_config.json", "r")
        config_json = json.load(f)
        f.close()
        user_id = config_json["user_id"]
        username = config_json["username"]

        self.sio.emit("set_username", user_id, username)

        custom_game_id = "tinbotprivategame"

        #self.sio.emit("join_private", custom_game_id, user_id)
        #self.sio.emit("set_force_start", custom_game_id, True)
        self.sio.emit("join_1v1", user_id)
        print("bot.generals.io/games/" + custom_game_id)

    def on_disconnect(self):
        if self.file:
            self.file.close()
        print("disconnect")

    def on_reconnect(self):
        print("reconnect")

    def game_start(self, data, teams):
        self.player_index = data["playerIndex"]
        replay_url = 'http://bot.generals.io/replays/' + data["replay_id"]
        print("Game starting! Replay available at " + replay_url)

        self.file = open(self.path_name + data["replay_id"], "w")

    def game_update(self, data, *args):
        """ Update """
        self.update_count += 1
        if not self.map:
            self.map = Map(data, self.player_index)
            return

        self.map.update(data)
        # Source.
        largest_army = self.map.get_largest_owned_army()
        source = largest_army

        # Destination.
        dest = None
        if (self.map.general_tiles):
            dest = self.map.get_closest_enemy_general_tile(largest_army)
        elif (self.map.enemy_tiles):
            dest = self.map.get_closest_enemy_tile(largest_army)
        elif (self.map.empty_tiles):
            dest = self.map.get_closest_empty_tile(largest_army)

        # Next attack.
        path = self.map.construct_path(largest_army, dest)
        attack_dest = None
        if path:
            attack_dest = path[0]
            # Send attack command.
            self.attack(self.map.coord_to_index(source, self.map.width),
                        self.map.coord_to_index(attack_dest, self.map.width),
                        False)

        #Print to console.
        self.map.print_everything()
        if path:
            print("Moving from " + str(source) + " to " + str(attack_dest) +
                  " towards " + str(dest))
        else:
            print("Moving from " + str(source) + " towards " + str(dest))
        print("Path: " + str(path))
        print("Generals: " + str(self.map.generals))

        # Log to file.
        self.file.write("Turn " + str(self.update_count) + "\n")
        if path:
            self.file.write("Path: " + str(path))
            self.file.write("Source: " + str(source) + ", To: " +
                            str(attack_dest) + "\n")
            self.file.write("Moving toward: " + str(dest) + "\n")
        else:
            self.file.write("THERE ARE NO PATH PLEASE TAKE A LOOK")
            self.file.write("Source: " + str(source) + ", Dest: " + str(dest) +
                            "\n")
        self.file.write("\n-------------------\n")

    def attack(self, start, end, is50):
        """ Wrapper function for the api's attack. """
        self.sio.emit("attack", start, end, is50)

    def leave_game(self, *data):
        self.sio.emit("leave_game")