def AI_match_forData(): #Tree based AI vs Tree based AI for data generating for problem_size in [1, 2, 3, 4, 5]: winners = [] net_data = [] #The data to be stored, one for each problem size for game_num in range(10): if (problem_size == 1): mini_select = 'False' #8*8 game else: mini_select = 'True' #4*4 game new_game = ms1.chess_state(mini=mini_select, minitype=problem_size) player1 = treebased_AI_data(new_game, 'W') player2 = treebased_AI_data(new_game, 'B') turn = 0 while (turn >= 0): print(problem_size, turn, winners) print('So far collected: ', len(net_data)) if (turn % 2 == 0): databatch = player1.make_option() new_state = player1.AI.chessstate player2.renew( new_state ) #We have to update game state for each AI once per turn else: databatch = player2.make_option() new_state = player2.AI.chessstate player1.renew(new_state) net_data.extend(databatch) #Update the data new_state.show_state() turn += 1 if (player1.checkmate('B') == 1): #White wins winners.append('W') break if (player2.checkmate('W') == 1): #Black wins winners.append('B') break if (turn == 50): #Time limit current_state = player1.AI.chessstate if (current_state.get_score('W') > current_state.get_score('B')): winners.append('W') elif (current_state.get_score('W') < current_state.get_score('B')): winners.append('B') else: winners.append('Draw') break print(winners) with open( 'C:/Users/28529/Desktop/SU/Courses/AI/project/new code/netdata_' + str(problem_size) + '.pkl', 'wb') as fp: pickle.dump(net_data, fp, pickle.HIGHEST_PROTOCOL) #Store data into pickle files del net_data
def AI_match(): #Tree based AI vs Baseline AI White_count = [0, 0, 0, 0, 0] Black_count = [0, 0, 0, 0, 0] Draw_count = [0, 0, 0, 0, 0] for problem_size in [1, 2, 3, 4, 5]: winners = [] for game_num in range(100): if (problem_size == 1): mini_select = 'False' #8*8 game else: mini_select = 'True' #4*4 game new_game = ms1.chess_state(mini=mini_select, minitype=problem_size) player1 = random_AI(new_game, 'W') player2 = treebased_AI(new_game, 'B') turn = 0 while (turn >= 0): print(problem_size, turn, winners) if (turn % 2 == 0): player1.make_option() new_state = player1.AI.chessstate player2.renew( new_state ) #We have to update game state for each AI once per turn else: player2.make_option() new_state = player2.AI.chessstate player1.renew(new_state) new_state.show_state() turn += 1 if (player1.checkmate('B') == 1): #White wins winners.append('W') White_count[problem_size - 1] += 1 break if (player2.checkmate('W') == 1): #Black wins winners.append('B') Black_count[problem_size - 1] += 1 break if (turn == 50): #Time limit current_state = player1.AI.chessstate if (current_state.get_score('W') > current_state.get_score('B')): winners.append('W') White_count[problem_size - 1] += 1 elif (current_state.get_score('W') < current_state.get_score('B')): winners.append('B') Black_count[problem_size - 1] += 1 else: winners.append('Draw') Draw_count[problem_size - 1] += 1 break print(winners) label_list = [ 'Problem 1', 'Problem 2', 'Problem 3', 'Problem 4', 'Problem 5' ] #Draw a figure to show results x = range(5) bar_width = 0.2 index_1 = np.arange(len(White_count)) index_2 = index_1 + bar_width index_3 = index_2 + bar_width plt.bar(index_1, height=White_count, width=bar_width, color='red', label='Baseline Wins') plt.bar(index_2, height=Black_count, width=bar_width, color='blue', label='Tree Wins') plt.bar(index_3, height=Draw_count, width=bar_width, color='green', label='Draw') plt.ylim(0, 100) plt.ylabel('Winning numbers') plt.xlabel('Problem sizes') plt.legend() plt.xticks(index_2, label_list) plt.show()
def AI_based_game(Mini, number, side): #Human vs AI color = '' if (side == '1'): color = 'B' #Because you have entered your side, then we pass AI the opposite side. elif (side == '2'): color = 'W' while (1): AI_select = input('AI: 1.Tree Based, 2.Random Choice' ) #Choose the type of AI to fight if (AI_select == '1'): new_game = ms1.chess_state(mini=Mini, minitype=number) Game_AI = treebased_AI(new_game, color) break elif (AI_select == '2'): new_game = ms1.chess_state(mini=Mini, minitype=number) Game_AI = random_AI(new_game, color) break else: print('Invalid operation. ') turn = 0 turnmod = ['B', 'W'] moving_player = ['Black', 'White'] AI_role = int(side) - 1 #Player_role = abs(int(side) - 3) - 1 while (turn < 50): turn += 1 print('####### TURN ' + str(turn) + ' #######') Game_AI.show_state() print('>>>>>>>>>' + moving_player[turn % 2] + ' Moving') if (moving_player[turn % 2] == moving_player[AI_role]): Game_AI.make_option() valid = 1 else: valid = 0 while (valid == 0): print( 'Please give command: 1.Make a move, 2.Swap two pieces, 3.Quit' ) # Select operation choice = input('Your Choice: ') if (choice == '3'): print('####### Game Over #######') # Quit the game return 0 elif (choice == '1'): # Make a move piece = input('Type the name of piece you want to move: ') if (Game_AI.find_chess(piece) == 0 ): # No such piece in the current list of pieces print('Inoperable piece. ') continue elif (Game_AI.find_chess(piece).side != turnmod[turn % 2]): # The piece belongs to the opponent print('Inoperable piece. ') continue else: goal = input( 'Type the destination where you want to move this piece: ' ) if (len(goal) != 2): # Incorrect format print('Invalid destination. ') continue elif ((goal[0] not in Game_AI.AI.chessstate.cols) or (goal[1] not in Game_AI.AI.chessstate.rows) ): # No such position on chessboard print('Invalid destination. ') continue else: successful = Game_AI.AI.chessstate.one_move( piece, goal) # Try to move the chess if (successful == 0): # Move cannot be done print('Invalid operation. ') continue else: valid = 1 # One turn is accomplished elif (choice == '2'): piece1 = input( 'Type the name of the first piece you want to swap: ') if (Game_AI.find_chess(piece1) == 0): print('Inoperable piece. ') continue elif (Game_AI.find_chess(piece1).side != turnmod[turn % 2]): print('Inoperable piece. ') continue else: piece2 = input( 'Type the name of the second piece you want to swap: ') if (Game_AI.find_chess(piece2) == 0): print('Inoperable piece. ') continue elif (Game_AI.find_chess(piece2).side != turnmod[turn % 2]): print('Inoperable piece. ') continue elif (piece1 == piece2): print('Please enter two different pieces. ') continue else: Game_AI.AI.chessstate.one_swap( piece1, piece2) # Try to swap two pieces valid = 1 # One turn is accomplished else: print('Invalid operation. ') continue if (Game_AI.checkmate( turnmod[(turn + 1) % 2]) == 1): # Check if there is a checkmate print('>>>>>>>>>' + moving_player[turn % 2] + ' Wins! ') break print('####### Game Over #######') return 0
def AI_based_game(Mini, number): #Initiate a real game color = 'W' #For convenience, AIs always move first while (1): print('Please select two players in the game: ') print( ' 1.Tree Based AI, 2.Baseline AI, 3.Neural Network AI, 4.Manually') select1 = input('Player one: ') select2 = input('Player two: ') if ((select1 in ['1', '2', '3', '4']) and (select2 in ['1', '2', '3', '4'])): select1 = int(select1) select2 = int(select2) if ((select1 == select2) and (select1 == 4)): #Completely Manual ms1.game_starts(Mini, number) return 0 elif ((select1 != 4) and (select2 != 4)): #AI match AI_match_forReal(number, select1, select2) return 0 else: #Human vs AI NN_flag = 0 for selection in [select1, select2]: if (selection != 4): AI_select = selection break if (AI_select == 1): new_game = ms1.chess_state(mini=Mini, minitype=number) Game_AI = ms2.treebased_AI(new_game, color) elif (AI_select == 2): new_game = ms1.chess_state(mini=Mini, minitype=number) Game_AI = ms2.random_AI(new_game, color) elif (AI_select == 3): new_game = ms1.chess_state(mini=Mini, minitype=number) Game_AI = NNbased_AI(new_game, color) if (number == 1): code = 'N' else: code = 'M' + str(number - 2) net = chess_net(code) net.load_state_dict( tr.load( 'C:/Users/28529/Desktop/SU/Courses/AI/project/new code/model_' + code + '.pth')) # Load the network NN_flag = 1 break else: print('Invalid operation. ') turn = 0 turnmod = ['B', 'W'] moving_player = ['Black', 'White'] AI_role = 1 while (turn < 50): turn += 1 print('####### TURN ' + str(turn) + ' #######') Game_AI.show_state() print('>>>>>>>>>' + moving_player[turn % 2] + ' Moving') if (moving_player[turn % 2] == moving_player[AI_role]): if (NN_flag == 1): Game_AI.make_option(net) else: Game_AI.make_option() valid = 1 else: valid = 0 while (valid == 0): print( 'Please give command: 1.Make a move, 2.Swap two pieces, 3.Quit' ) # Select operation choice = input('Your Choice: ') if (choice == '3'): print('####### Game Over #######') # Quit the game return 0 elif (choice == '1'): # Make a move piece = input('Type the name of piece you want to move: ') if (Game_AI.find_chess(piece) == 0 ): # No such piece in the current list of pieces print('Inoperable piece. ') continue elif (Game_AI.find_chess(piece).side != turnmod[turn % 2]): # The piece belongs to the opponent print('Inoperable piece. ') continue else: goal = input( 'Type the destination where you want to move this piece: ' ) if (len(goal) != 2): # Incorrect format print('Invalid destination. ') continue elif ((goal[0] not in Game_AI.AI.chessstate.cols) or (goal[1] not in Game_AI.AI.chessstate.rows) ): # No such position on chessboard print('Invalid destination. ') continue else: successful = Game_AI.AI.chessstate.one_move( piece, goal) # Try to move the chess if (successful == 0): # Move cannot be done print('Invalid operation. ') continue else: valid = 1 # One turn is accomplished elif (choice == '2'): piece1 = input( 'Type the name of the first piece you want to swap: ') if (Game_AI.find_chess(piece1) == 0): print('Inoperable piece. ') continue elif (Game_AI.find_chess(piece1).side != turnmod[turn % 2]): print('Inoperable piece. ') continue else: piece2 = input( 'Type the name of the second piece you want to swap: ') if (Game_AI.find_chess(piece2) == 0): print('Inoperable piece. ') continue elif (Game_AI.find_chess(piece2).side != turnmod[turn % 2]): print('Inoperable piece. ') continue elif (piece1 == piece2): print('Please enter two different pieces. ') continue else: Game_AI.AI.chessstate.one_swap( piece1, piece2) # Try to swap two pieces valid = 1 # One turn is accomplished else: print('Invalid operation. ') continue if (Game_AI.checkmate( turnmod[(turn + 1) % 2]) == 1): # Check if there is a checkmate print('>>>>>>>>>' + moving_player[turn % 2] + ' Wins! ') break print('####### Game Over #######') return 0
def AI_match_forReal(problem_size, AI1, AI2): #Game for any two kinds of AI if (problem_size == 1): code = 'N' else: code = 'M' + str(problem_size - 2) if (problem_size == 1): mini_select = 'False' # 8*8 game else: mini_select = 'True' # 4*4 game new_game = ms1.chess_state(mini=mini_select, minitype=problem_size) netflags = [0, 0] if ((AI1 == 3) or (AI2 == 3)): #We need a network net = chess_net(code) net.load_state_dict( tr.load( 'C:/Users/28529/Desktop/SU/Courses/AI/project/new code/model_' + code + '.pth')) # Load the network player1 = NNbased_AI(new_game, 'W') print('White: NN') netflags[0] = 1 if (AI1 == AI2): #Two NN-AIs player2 = NNbased_AI(new_game, 'B') print('Black: NN') netflags[1] = 1 else: for item in [AI1, AI2]: if (item != 3): another_select = item break if (another_select == 1): player2 = ms2.treebased_AI(new_game, 'B') print('Black: Tree') else: player2 = ms2.random_AI(new_game, 'B') print('Black: Baseline') else: if (AI1 == 1): player1 = ms2.treebased_AI(new_game, 'W') print('White: Tree') else: player1 = ms2.random_AI(new_game, 'W') print('White: Baseline') if (AI2 == 1): player2 = ms2.treebased_AI(new_game, 'B') print('Black: Tree') else: player2 = ms2.random_AI(new_game, 'B') print('Black: Baseline') turn = 0 while (turn >= 0): print('########## Turn: ', turn, ' ##########') if (turn % 2 == 0): if (netflags[0] == 1): player1.make_option(net) else: player1.make_option() new_state = player1.AI.chessstate player2.renew( new_state ) # We have to update game state for each AI once per turn else: if (netflags[1] == 1): player2.make_option(net) else: player2.make_option() new_state = player2.AI.chessstate player1.renew(new_state) key = input('Enter anything to continue: ' ) #Wait for inputs to go to the next turn new_state.show_state() turn += 1 if (player1.checkmate('B') == 1): # White wins print('White wins! ') break if (player2.checkmate('W') == 1): # Black wins print('Black wins! ') break if (turn == 50): # Time limit current_state = player1.AI.chessstate if (current_state.get_score('W') > current_state.get_score('B')): print('White wins! ') elif (current_state.get_score('W') < current_state.get_score('B')): print('Black wins! ') else: print('Draw! ') break
def AI_match_forTest(): #Network AI vs Tree_based AI for problem_size in [1, 2, 3, 4, 5]: #Five problem sizes if (problem_size == 1): code = 'N' else: code = 'M' + str(problem_size - 2) net = chess_net(code) net.load_state_dict( tr.load( 'C:/Users/28529/Desktop/SU/Courses/AI/project/new code/model_' + code + '.pth')) # Load the network winners = [] scores = [] for game_num in range(100): if (problem_size == 1): mini_select = 'False' # 8*8 game else: mini_select = 'True' # 4*4 game new_game = ms1.chess_state(mini=mini_select, minitype=problem_size) player1 = NNbased_AI(new_game, 'W') player2 = ms2.treebased_AI(new_game, 'B') turn = 0 while (turn >= 0): print(problem_size, turn, winners) print(scores) if (turn % 2 == 0): player1.make_option(net) new_state = player1.AI.chessstate player2.renew( new_state ) # We have to update game state for each AI once per turn else: player2.make_option() new_state = player2.AI.chessstate player1.renew(new_state) new_state.show_state() turn += 1 current_state = player1.AI.chessstate if (player1.checkmate('B') == 1): # White wins winners.append('W') scores.append(current_state.get_score('W')) break if (player2.checkmate('W') == 1): # Black wins winners.append('B') scores.append(current_state.get_score('W')) break if (turn == 50): # Time limit current_state = player1.AI.chessstate if (current_state.get_score('W') > current_state.get_score('B')): winners.append('W') scores.append(current_state.get_score('W')) elif (current_state.get_score('W') < current_state.get_score('B')): winners.append('B') scores.append(current_state.get_score('W')) else: winners.append('Draw') scores.append(current_state.get_score('W')) break print(winners) bar_width = 0.2 for i in range(len(scores)): c = 'blue' plt.bar(i + 1, height=scores[i], width=bar_width, color=c) plt.ylabel('Final Scores') plt.xlabel('Game played') plt.title('Problem Size ' + str(problem_size)) plt.show()