2023-11-23 15:37:02 +00:00
import random
import torch as T
2023-11-23 11:44:23 +00:00
import numpy as np
import matplotlib . pyplot as plt
2023-11-19 03:27:47 +00:00
from game import Game
2023-11-17 02:19:03 +00:00
from tqdm import tqdm
2023-09-27 18:03:37 +00:00
2023-11-19 03:27:47 +00:00
from os import environ
environ [ ' PYGAME_HIDE_SUPPORT_PROMPT ' ] = ' 1 '
2023-09-27 18:03:37 +00:00
2023-11-23 15:37:02 +00:00
random . seed ( 1 )
np . random . seed ( 1 )
T . manual_seed ( 1 )
2023-11-23 11:44:23 +00:00
2023-11-24 13:23:12 +00:00
n_episodes = 10000
2023-11-24 13:55:04 +00:00
game_len = 5000
2023-11-17 02:19:03 +00:00
2023-11-23 15:37:02 +00:00
figure_file = ' plots/score.png '
2023-11-17 02:19:03 +00:00
2023-11-23 15:37:02 +00:00
game = Game ( )
agent_list = [ 0 for _ in range ( game . max_num_players ) ]
score_history = np . zeros (
shape = ( game . max_num_players , n_episodes ) )
best_score = np . zeros ( game . max_num_players )
avg_score = np . zeros ( game . max_num_players )
for i in tqdm ( range ( n_episodes ) ) :
# TODO: Make game.level.reset_map() so we don't __init__ everything all the time (such a waste)
if i != 0 :
game . level . __init__ ( reset = True )
# TODO: Make game.level.reset_map() so we don't pull out and load the agent every time (There is -definitevly- a better way)
for player in game . level . player_sprites :
for agent in agent_list :
player . agent = agent_list [ player . player_id ]
player . stats . exp = score_history [ player . player_id ] [ i - 1 ]
agent_list = [ 0 for _ in range ( game . max_num_players ) ]
for j in range ( game_len ) :
if not game . level . done :
game . run ( )
game . calc_score ( )
2023-11-17 02:19:03 +00:00
2023-11-23 11:44:23 +00:00
for player in game . level . player_sprites :
2023-11-23 15:37:02 +00:00
if player . is_dead ( ) :
agent_list [ player . player_id ] = player . agent
player . kill ( )
2023-11-19 03:27:47 +00:00
2023-11-23 15:37:02 +00:00
# if (j == game_len-1 or game.level.done) and game.level.enemy_sprites != []:
# for player in game.level.player_sprites:
# for enemy in game.level.enemy_sprites:
# player.stats.exp *= .95
else :
break
2023-11-23 11:44:23 +00:00
2023-11-23 15:37:02 +00:00
for player in game . level . player_sprites :
if not player . is_dead ( ) :
agent_list [ player . player_id ] = player . agent
exp_points = player . stats . exp
score_history [ player . player_id ] [ i ] = exp_points
avg_score [ player . player_id ] = np . mean (
score_history [ player . player_id ] )
if avg_score [ player . player_id ] > best_score [ player . player_id ] :
best_score [ player . player_id ] = avg_score [ player . player_id ]
print ( f " Saving models for agent { player . player_id } ... " )
2023-11-24 13:55:04 +00:00
player . agent . save_models (
actr_chkpt = f " player_ { player . player_id } _actor " , crtc_chkpt = f " player_ { player . player_id } _critic " )
2023-11-23 15:37:02 +00:00
print ( " Models saved ... \n " )
2023-11-23 11:44:23 +00:00
2023-11-23 15:37:02 +00:00
print (
f " \n Cumulative score for player { player . player_id } : { score_history [ 0 ] [ i ] } \n Average score for player { player . player_id } : { avg_score [ player . player_id ] } \n Best score for player { player . player_id } : { best_score [ player . player_id ] } " )
2023-11-23 11:44:23 +00:00
2023-11-23 15:37:02 +00:00
plt . plot ( score_history [ 0 ] )
game . quit ( )
plt . show ( )