137 lines
4.9 KiB
Python
137 lines
4.9 KiB
Python
import pygame
|
|
from mlgame.game.generic import quit_or_esc
|
|
from src.Game import Game
|
|
from tqdm import tqdm
|
|
import argparse
|
|
import importlib
|
|
|
|
|
|
|
|
class Contest():
|
|
"""
|
|
This class manages a 3 vs 3 game contest.
|
|
|
|
Parameters
|
|
----------
|
|
player : list
|
|
The list of players.
|
|
total_game : int
|
|
The total number of games.
|
|
frame : int
|
|
The frame of the game.
|
|
sound : str
|
|
The sound of the game.
|
|
is_manual : bool
|
|
The manual mode of the game.
|
|
|
|
Returns
|
|
-------
|
|
dict
|
|
The result of the game.
|
|
"""
|
|
def __init__(self, player: list, total_game: int, frame: int,
|
|
sound: str, is_manual: bool):
|
|
# initialize player
|
|
self.player1 = player[0]
|
|
self.player2 = player[1]
|
|
self.player3 = player[2]
|
|
self.player4 = player[3]
|
|
self.player5 = player[4]
|
|
self.player6 = player[5]
|
|
|
|
# initialize game
|
|
self.total_game = total_game
|
|
self.frame = frame
|
|
self.sound = sound
|
|
self.is_manual = is_manual
|
|
|
|
self.user_num = 6
|
|
self.green_team_num = 3
|
|
self.blue_team_num = 3
|
|
|
|
# initialize game times
|
|
self.game_times = 0
|
|
self.green_team_win = 0
|
|
self.blue_team_win = 0
|
|
|
|
def run(self):
|
|
with tqdm(total=self.total_game, unit="round") as pbar:
|
|
pbar.set_description("Playing")
|
|
print()
|
|
for _ in range(self.total_game):
|
|
# initialize game every round
|
|
game = Game(self.user_num, self.green_team_num,
|
|
self.blue_team_num, self.is_manual, self.frame, self.sound)
|
|
scene_init_info_dict = game.get_scene_init_data()
|
|
frame_count = 0
|
|
|
|
# update game
|
|
while game.is_running() and not quit_or_esc():
|
|
game.update({
|
|
"1P": self.player1.update(game.get_data_from_game_to_player()['1P'], []),
|
|
"2P": self.player2.update(game.get_data_from_game_to_player()['2P'], []),
|
|
"3P": self.player3.update(game.get_data_from_game_to_player()['3P'], []),
|
|
"4P": self.player4.update(game.get_data_from_game_to_player()['4P'], []),
|
|
"5P": self.player5.update(game.get_data_from_game_to_player()['5P'], []),
|
|
"6P": self.player6.update(game.get_data_from_game_to_player()['6P'], [])
|
|
})
|
|
frame_count += 1
|
|
|
|
# reset player
|
|
self.player1.reset()
|
|
self.player2.reset()
|
|
self.player3.reset()
|
|
self.player4.reset()
|
|
self.player5.reset()
|
|
self.player6.reset()
|
|
self.game_times += 1
|
|
|
|
# get game result
|
|
game_result = game.get_game_result()
|
|
if game_result['attachment'][0]["status"] == "GREEN_TEAM_WIN":
|
|
self.green_team_win += 1
|
|
else:
|
|
self.blue_team_win += 1
|
|
|
|
# update progress bar
|
|
pbar.postfix = f"green_team win: {self.green_team_win} | blue_team win: {self.blue_team_win}"
|
|
pbar.update(1)
|
|
# print()
|
|
if self.green_team_win > self.total_game/2 or self.blue_team_win > self.total_game/2:
|
|
break
|
|
|
|
|
|
print(f"Game times: {self.game_times} | green_team win: {self.green_team_win} | blue_team win: {self.blue_team_win}")
|
|
pygame.quit()
|
|
return {"green_team_win":self.green_team_win, "blue_team_win":self.blue_team_win}
|
|
|
|
def import_player(group_number, player_number):
|
|
module_name = f"ml.Group_{group_number}.ml_play_{player_number}"
|
|
module = importlib.import_module(module_name)
|
|
return getattr(module, f"MLPlay")
|
|
|
|
if __name__ == '__main__':
|
|
# Set configuration
|
|
sound = "off"
|
|
total_game = 9
|
|
frame = 2500
|
|
is_manual = False
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--green_team", type=str, required=True, help="The folder of the green team")
|
|
parser.add_argument("--blue_team", type=str, required=True, help="The folder of the blue team")
|
|
args = parser.parse_args()
|
|
print(args)
|
|
player1 = import_player(1, 1)
|
|
|
|
|
|
players = [ import_player(args.green_team, 1)('1P', {'sound': sound}),
|
|
import_player(args.green_team, 2)('2P', {'sound': sound}),
|
|
import_player(args.green_team, 3)('3P', {'sound': sound}),
|
|
import_player(args.blue_team, 1)('4P', {'sound': sound}),
|
|
import_player(args.blue_team, 2)('5P', {'sound': sound}),
|
|
import_player(args.blue_team, 3)('6P', {'sound': sound})]
|
|
|
|
contest = Contest(players, total_game , frame, sound, is_manual)
|
|
contest.run()
|
|
|