示例#1
0
def test_my_player_is_not_moving():
    my_team = SimpleTeam("test", KangarooPlayer(), KangarooPlayer())
    test_layout = """
        ############
        # 0 #  # 1 #
        #   #  #   #
        # 2 .  . 3 #
        ############
    """
    teams = [
        # register my_team for bots 0, 2
        my_team,
        # register a pre-defined team as an enemy
        # First one moves left-down-down-left-left, second one left
        SimpleTeam(SteppingPlayer("<vv<<"), SteppingPlayer("<<<<<"))
    ]

    gm = GameMaster(test_layout, teams, number_bots=4, game_time=5, seed=20)

    # play `game_time` rounds
    gm.play()

    # check the position of my bots
    # Tests fail, because our player is random
    # assert gm.universe.bots[0].current_pos == (2, 1)
    # assert gm.universe.bots[2].current_pos == (2, 3)

    # For reference, testing the test player
    assert gm.universe.bots[1].current_pos == (6, 3)
    assert gm.universe.bots[3].current_pos == (4, 3)
示例#2
0
    def test_kill_count(self):
        test_start = (""" ######
                #0  1#
                #....#
                ###### """)
        # the game lasts two rounds, enough time for bot 1 to eat food
        NUM_ROUNDS = 5
        teams = [
            SimpleTeam(SteppingPlayer('>--->')),
            SimpleTeam(SteppingPlayer(
                '<<<<<'))  # bot 1 moves west twice to eat the single food
        ]
        gm = GameMaster(test_start, teams, 2, game_time=NUM_ROUNDS)

        gm.set_initial()
        gm.play_round()
        assert gm.game_state["times_killed"] == [0, 0]
        gm.play_round()
        assert gm.game_state["times_killed"] == [0, 1]
        gm.play_round()
        assert gm.game_state["times_killed"] == [0, 1]
        gm.play_round()
        assert gm.game_state["times_killed"] == [0, 2]
        gm.play_round()
        assert gm.game_state["times_killed"] == [1, 2]
示例#3
0
    def test_team_names(self):
        test_layout = (""" ##################
            #0#.  .  # .     #
            #2#####    #####1#
            #     . #  .  .#3#
            ################## """)

        team_1 = SimpleTeam("team1", SteppingPlayer([]), SteppingPlayer([]))
        team_2 = SimpleTeam("team2", SteppingPlayer([]), SteppingPlayer([]))
        game_master = GameMaster(test_layout, [team_1, team_2], 4, 200)

        assert game_master.game_state["team_name"][0] == ""
        assert game_master.game_state["team_name"][1] == ""

        game_master.set_initial()
        assert game_master.game_state["team_name"][0] == "team1"
        assert game_master.game_state["team_name"][1] == "team2"

        # check that all players know it, before the game started
        assert team_1._players[0].current_state["team_name"][0] == "team1"
        assert team_1._players[0].current_state["team_name"][1] == "team2"
        assert team_1._players[1].current_state["team_name"][0] == "team1"
        assert team_1._players[1].current_state["team_name"][1] == "team2"

        assert team_2._players[0].current_state["team_name"][0] == "team1"
        assert team_2._players[0].current_state["team_name"][1] == "team2"
        assert team_2._players[1].current_state["team_name"][0] == "team1"
        assert team_2._players[1].current_state["team_name"][1] == "team2"
示例#4
0
 def test_too_few_registered_teams(self):
     test_layout_4 = (""" ##################
         #0#.  .  # .     #
         #2#####    #####1#
         #     . #  .  .#3#
         ################## """)
     team_1 = SimpleTeam(SteppingPlayer([]), SteppingPlayer([]))
     with pytest.raises(ValueError):
         GameMaster(test_layout_4, [team_1], 4, 200)
示例#5
0
    def test_team_names_in_simpleteam(self):
        test_layout = (""" ##################
            #0#.  .  # .     #
            #2#####    #####1#
            #     . #  .  .#3#
            ################## """)

        team_1 = SimpleTeam('team1', SteppingPlayer([]), SteppingPlayer([]))
        team_2 = SimpleTeam('team2', SteppingPlayer([]), SteppingPlayer([]))

        game_master = GameMaster(test_layout, [team_1, team_2], 4, 200)
        game_master.set_initial()

        assert game_master.game_state["team_name"][0] == "team1"
        assert game_master.game_state["team_name"][1] == "team2"
示例#6
0
    def test_simple_failing_bots(self):
        layout = """
        ##########
        #        #
        #0  ..  1#
        ##########
        """
        server = SimpleServer(layout_string=layout, rounds=5, players=2)

        for bind_address in server.bind_addresses:
            assert bind_address.startswith("tcp://")

        client1_address = server.bind_addresses[0].replace("*", "localhost")
        client2_address = server.bind_addresses[1].replace("*", "localhost")

        class FailingPlayer:
            def _set_initial(self, dummy, dummy2):
                pass

            def _set_index(self, dummy):
                pass

            def _get_move(self, universe, game_state):
                pass

        client1 = SimpleClient(SimpleTeam("team1", SteppingPlayer("^>>v<")),
                               address=client1_address)
        client2 = SimpleClient(SimpleTeam("team2", FailingPlayer()),
                               address=client2_address)

        client1.autoplay_process()
        client2.autoplay_process()
        server.run()
        server.shutdown()
示例#7
0
    def test_lose_on_eating_all(self):
        test_start = (""" ######
                #0 . #
                # . 1#
                ###### """)
        teams = [
            SimpleTeam(StoppingPlayer()),
            SimpleTeam(SteppingPlayer('<<<'))
        ]
        # bot 1 eats all the food and the game stops
        gm = GameMaster(test_start, teams, 2, 100)
        gm.universe.teams[0].score = 2

        # this test viewer caches all events lists seen through observe
        class TestViewer(AbstractViewer):
            def __init__(self):
                self.cache = list()

            def observe(self, universe, game_state):
                self.cache.append(game_state)

        # run the game
        tv = TestViewer()
        gm.register_viewer(tv)
        gm.set_initial()
        gm.play()

        # check
        assert tv.cache[-1]["round_index"] == 1
        assert gm.universe.teams[0].score == 2
        assert gm.universe.teams[1].score == 1
        assert tv.cache[-1]["team_wins"] is not None
        assert tv.cache[-1]["team_wins"] == 0
        assert gm.game_state["round_index"] == 1
示例#8
0
    def test_win_on_timeout_team_1(self):
        test_start = (""" ######
                #0 ..#
                #.. 1#
                ###### """)
        # the game lasts two rounds, enough time for bot 1 to eat food
        NUM_ROUNDS = 2

        teams = [
            SimpleTeam(StoppingPlayer()),
            SimpleTeam(SteppingPlayer(
                '<<'))  # bot 1 moves west twice to eat the single food
        ]
        gm = GameMaster(test_start, teams, 2, game_time=NUM_ROUNDS)

        # this test viewer caches all events lists seen through observe
        class TestViewer(AbstractViewer):
            def __init__(self):
                self.cache = list()

            def observe(self, universe, game_state):
                self.cache.append(game_state)

        # run the game
        tv = TestViewer()
        gm.register_viewer(tv)
        gm.set_initial()
        gm.play()

        # check
        assert tv.cache[-1]["team_wins"] is not None
        assert tv.cache[-1]["team_wins"] == 1
        assert gm.game_state["round_index"] == NUM_ROUNDS
示例#9
0
    def test_no_food(self):
        team_1 = SimpleTeam(SteppingPlayer([]), SteppingPlayer([]))
        team_2 = SimpleTeam(SteppingPlayer([]), SteppingPlayer([]))

        both_starving_layout = (""" ######
                #0   #
                #   1#
                ###### """)
        with pytest.warns(NoFoodWarning):
            GameMaster(both_starving_layout, [team_1, team_2], 2, 1)

        one_side_starving_layout = (""" ######
                #0  .#
                #   1#
                ###### """)
        with pytest.warns(NoFoodWarning):
            GameMaster(one_side_starving_layout, [team_1, team_2], 2, 1)
示例#10
0
    def test_viewer_may_change_gm(self):

        class MeanViewer(AbstractViewer):
            def set_initial(self, universe):
                universe.teams[1].score = 50

            def observe(self, universe, game_state):
                universe.teams[0].score = 100
                universe.bots[0].current_pos = (4,2)
                universe.maze[0,0] = False

                game_state["team_wins"] = 0

        test_start = (
            """ ######
                #0 . #
                #.. 1#
                ###### """)

        number_bots = 2

        teams = [
            SimpleTeam(SteppingPlayer([(0,0)])),
            SimpleTeam(SteppingPlayer([(0,0)]))
        ]
        gm = GameMaster(test_start, teams, number_bots, 200)

        original_universe = gm.universe.copy()

        class TestViewer(AbstractViewer):
            def observe(self, universe, game_state):
                # universe has been altered
                assert original_universe != gm.universe

        gm.register_viewer(MeanViewer())
        gm.register_viewer(TestViewer())

        gm.set_initial()
        gm.play_round()

        assert original_universe != gm.universe
示例#11
0
    def test_simple_remote_game(self):
        layout = """
        ##########
        #        #
        #0  ..  1#
        ##########
        """
        server = SimpleServer(layout_string=layout, rounds=5, players=2)

        for bind_address in server.bind_addresses:
            assert bind_address.startswith("tcp://")

        client1_address = server.bind_addresses[0].replace("*", "localhost")
        client2_address = server.bind_addresses[1].replace("*", "localhost")

        client1 = SimpleClient(SimpleTeam("team1", SteppingPlayer("^>>v<")),
                               address=client1_address)
        client2 = SimpleClient(SimpleTeam("team2", SteppingPlayer("^<<v>")),
                               address=client2_address)

        client1.autoplay_process()
        client2.autoplay_process()
        server.run()
        server.shutdown()
示例#12
0
    def test_failing_player(self):
        class FailingPlayer(AbstractPlayer):
            def get_move(self):
                return 1

        test_layout = (""" ######
                #0 . #
                #.. 1#
                ###### """)
        teams = [SimpleTeam(FailingPlayer()), SimpleTeam(SteppingPlayer("^"))]

        gm = GameMaster(test_layout, teams, 2, 1)

        gm.play()
        assert gm.game_state["timeout_teams"] == [1, 0]
示例#13
0
    def test_play_step(self):

        test_start = (""" ########
                # 0  ..#
                #..  1 #
                ######## """)

        number_bots = 2

        teams = [
            SimpleTeam(SteppingPlayer('>>>>')),
            SimpleTeam(SteppingPlayer('<<<<'))
        ]
        gm = GameMaster(test_start, teams, number_bots, 4)

        gm.set_initial()

        gm.play_round()
        assert gm.universe.bots[0].current_pos == (3, 1)
        assert gm.universe.bots[1].current_pos == (4, 2)
        assert gm.game_state["round_index"] == 0
        assert gm.game_state["bot_id"] is None
        assert not gm.game_state["finished"]

        gm.play_step()
        assert gm.universe.bots[0].current_pos == (4, 1)
        assert gm.universe.bots[1].current_pos == (4, 2)
        assert gm.game_state["round_index"] == 1
        assert gm.game_state["bot_id"] == 0
        assert gm.game_state["finished"] == False

        gm.play_step()
        assert gm.universe.bots[0].current_pos == (4, 1)
        assert gm.universe.bots[1].current_pos == (3, 2)
        assert gm.game_state["round_index"] == 1
        assert gm.game_state["bot_id"] == 1
        assert gm.game_state["finished"] == False

        gm.play_step()
        assert gm.universe.bots[0].current_pos == (5, 1)
        assert gm.universe.bots[1].current_pos == (3, 2)
        assert gm.game_state["round_index"] == 2
        assert gm.game_state["bot_id"] == 0
        assert gm.game_state["finished"] == False

        gm.play_step()
        assert gm.universe.bots[0].current_pos == (5, 1)
        assert gm.universe.bots[1].current_pos == (2, 2)
        assert gm.game_state["round_index"] == 2
        assert gm.game_state["bot_id"] == 1
        assert gm.game_state["finished"] == False

        gm.play_round()
        # first call tries to finish current round (which already is finished)
        # so nothing happens
        assert gm.universe.bots[0].current_pos == (5, 1)
        assert gm.universe.bots[1].current_pos == (2, 2)
        assert gm.game_state["round_index"] == 2
        assert gm.game_state["bot_id"] is None
        assert gm.game_state["finished"] == False
        assert gm.game_state["team_wins"] == None
        assert gm.game_state["game_draw"] == None

        gm.play_round()
        # second call works
        assert gm.universe.bots[0].current_pos == (6, 1)
        assert gm.universe.bots[1].current_pos == (2, 2)
        assert gm.game_state["round_index"] == 3
        assert gm.game_state["bot_id"] == 0
        assert gm.game_state["finished"] == True
        assert gm.game_state["team_wins"] == 0
        assert gm.game_state["game_draw"] == None

        # Game finished immediately once all food for one group was eaten
        # team 0 finished first and the round was NOT played regularly to the end
        # (hence round_index == 3 and bot_id == 0)

        # nothing happens anymore
        gm.play_round()
        assert gm.universe.bots[0].current_pos == (6, 1)
        assert gm.universe.bots[1].current_pos == (2, 2)
        assert gm.game_state["round_index"] == 3
        assert gm.game_state["bot_id"] == 0
        assert gm.game_state["finished"] == True
        assert gm.game_state["team_wins"] == 0
        assert gm.game_state["game_draw"] == None

        # nothing happens anymore
        gm.play_round()
        assert gm.universe.bots[0].current_pos == (6, 1)
        assert gm.universe.bots[1].current_pos == (2, 2)
        assert gm.game_state["round_index"] == 3
        assert gm.game_state["bot_id"] == 0
        assert gm.game_state["finished"] == True
        assert gm.game_state["team_wins"] == 0
        assert gm.game_state["game_draw"] == None
示例#14
0
    def test_game(self):

        test_start = (""" ######
                #0 . #
                #.. 1#
                ###### """)

        number_bots = 2

        # The problem here is that the layout does not allow us to specify a
        # different inital position and current position. When testing universe
        # equality by comparing its string representation, this does not matter.
        # But if we want to compare using the __eq__ method, but specify the
        # target as ascii encoded maze/layout we need to convert the layout to a
        # CTFUniverse and then modify the initial positions. For this we define
        # a closure here to quickly generate a target universe to compare to.
        # Also we adapt the score, in case food has been eaten

        def create_TestUniverse(layout, black_score=0, white_score=0):
            initial_pos = [(1, 1), (4, 2)]
            universe = CTFUniverse.create(layout, number_bots)
            universe.teams[0].score = black_score
            universe.teams[1].score = white_score
            for i, pos in enumerate(initial_pos):
                universe.bots[i].initial_pos = pos
            if not (1, 2) in universe.food_list:
                universe.teams[1].score += 1
            if not (2, 2) in universe.food_list:
                universe.teams[1].score += 1
            if not (3, 1) in universe.food_list:
                universe.teams[0].score += 1
            return universe

        teams = [
            SimpleTeam(SteppingPlayer('>-v>>>')),
            SimpleTeam(SteppingPlayer('<<-<<<'))
        ]
        gm = GameMaster(test_start, teams, number_bots, 200)

        gm.set_initial()
        gm.play_round()
        test_first_round = (""" ######
                # 0. #
                #..1 #
                ###### """)
        assert create_TestUniverse(test_first_round) == gm.universe

        gm.play_round()
        test_second_round = (""" ######
                # 0. #
                #.1  #
                ###### """)
        assert create_TestUniverse(test_second_round) == gm.universe

        gm.play_round()
        test_third_round = (""" ######
                #  . #
                #.0 1#
                ###### """)
        assert create_TestUniverse(
            test_third_round,
            black_score=gm.universe.KILLPOINTS) == gm.universe

        gm.play_round()
        test_fourth_round = (""" ######
                #0 . #
                #. 1 #
                ###### """)
        assert create_TestUniverse(
            test_fourth_round,
            black_score=gm.universe.KILLPOINTS,
            white_score=gm.universe.KILLPOINTS) == gm.universe

        gm.play_round()
        test_fifth_round = (""" ######
                # 0. #
                #.1  #
                ###### """)
        assert create_TestUniverse(
            test_fifth_round,
            black_score=gm.universe.KILLPOINTS,
            white_score=gm.universe.KILLPOINTS) == gm.universe

        print(gm.universe.pretty)
        gm.play_round()
        test_sixth_round = (""" ######
                #  0 #
                #.1  #
                ###### """)
        print(gm.universe.pretty)
        # The game will have finished after bot 0 has eaten the pellet
        assert create_TestUniverse(
            test_sixth_round,
            black_score=gm.universe.KILLPOINTS,
            white_score=gm.universe.KILLPOINTS) == gm.universe
        assert gm.game_state['finished'] is True

        teams = [
            SimpleTeam(SteppingPlayer('>-v>>>')),
            SimpleTeam(SteppingPlayer('<<-<<<'))
        ]
        # now play the full game
        gm = GameMaster(test_start, teams, number_bots, 200)
        gm.play()
        test_sixth_round = (""" ######
                #  0 #
                #.1  #
                ###### """)
        assert create_TestUniverse(
            test_sixth_round,
            black_score=gm.universe.KILLPOINTS,
            white_score=gm.universe.KILLPOINTS) == gm.universe