打算用minimax演算法來做一個井字棋人機對戰,程式可以正常運行,但是都達不到電腦不輸的效果,麻煩大神們看看有什么地方可以debug的?謝謝
#include <iostream>
using namespace std;
#define BOARDNUM 10
char square[BOARDNUM] = {'0','1','2','3','4','5','6','7','8','9'};
char player = 'X', cpu ='O';
bool isMovesLeft(char square[BOARDNUM])
{
for (int i=1; i<BOARDNUM; ++i){
if (square[i]==i+'0')
return true;
}
return false;
}
int evaluate (char square[BOARDNUM])
{
if (square[1] == square[2] && square[2] == square[3]){
if (square[1]==cpu)
return 10;
else if (square[1]==player) return -10;
}
if (square[4] == square[5] && square[5] == square[6]){
if (square[4]==cpu)
return 10;
else if (square[4]==player) return -10;
}
if (square[7] == square[8] && square[8] == square[9]){
if (square[7]==cpu)
return 10;
else if (square[7]==player) return -10;
}
if (square[1] == square[4] && square[4] == square[7]){
if (square[1]==cpu)
return 10;
else if (square[1]==player) return -10;
}
if (square[2] == square[5] && square[5] == square[8]){
if (square[2]==cpu)
return 10;
else if (square[2]==player)return -10;
}
if (square[3] == square[6] && square[6] == square[9]){
if (square[3]==cpu)
return 10;
else if (square[3]==player)return -10;
}
if (square[1] == square[5] && square[5] == square[9]){
if (square[1]==cpu)
return 10;
else if (square[1]==player) return -10;
}
if (square[3] == square[5] && square[5] == square[7]){
if (square[3]==cpu)
return 10;
else if (square[3]==player) return -10;
}
return 0;
}
int minimax(char square[BOARDNUM], bool isCpu)
{
int score=evaluate (square);
if (score==10){
return 10;
}
if (score==-10)
return -10;
if (isMovesLeft(square)==false)
return 0;
if (isCpu)
{
int best=-1000;
for (int i=1; i<BOARDNUM; ++i){
if (square[i]==i+'0'){
square[i]=cpu;
if (best<minimax(square, false)){
best=minimax(square, false);
}
square[i]=i+'0';
}
}
return best;
}
else
{
int best=1000;
for (int i=1; i<BOARDNUM; ++i){
if (square [i]==i+'0'){
square [i]=player;
if (best>minimax(square, true)){
best=minimax(square, true);
}
square [i]=i+'0';
}
}
return best;
}
}
int bestMove(char square[BOARDNUM])
{
int bestScore=-1000;
int move;
int score;
for (int i=1; i<BOARDNUM; ++i){
if (square[i]==i+'0'){
square[i]=cpu;
score=minimax(square, false);
square[i]=i+'0';
}
if (score>bestScore){
bestScore=score;
move=i;
}
}
return move;
}
void printboard()
{
system("cls");
cout << "\n\n\tTic Tac Toe\n\n";
cout << "Player (X) - Computer (O)" << endl << endl;
cout << endl;
cout << " | | " << endl;
cout << " " << square[1] << " | " << square[2] << " | " << square[3] << endl;
cout << "_____|_____|_____" << endl;
cout << " | | " << endl;
cout << " " << square[4] << " | " << square[5] << " | " << square[6] << endl;
cout << "_____|_____|_____" << endl;
cout << " | | " << endl;
cout << " " << square[7] << " | " << square[8] << " | " << square[9] << endl;
cout << " | | " << endl << endl;
}
int main()
{
do {
printboard();
int choice;
cout << "Player enter a number: ";
cin>>choice;
if (choice == 1 && square[1] == '1')
square[1] = player;
else if (choice == 2 && square[2] == '2')
square[2] = player;
else if (choice == 3 && square[3] == '3')
square[3] = player;
else if (choice == 4 && square[4] == '4')
square[4] = player;
else if (choice == 5 && square[5] == '5')
square[5] = player;
else if (choice == 6 && square[6] == '6')
square[6] = player;
else if (choice == 7 && square[7] == '7')
square[7] = player;
else if (choice == 8 && square[8] == '8')
square[8] = player;
else if (choice == 9 && square[9] == '9')
square[9] = player;
else {
char blank;
cout<<"Invalid move and input anything"<<endl;
cin>>blank;
continue;
}
printboard();
if (evaluate (square)==-10){
cout<<"Congrats, you win!"<<endl;
goto EXIT;
} else if (isMovesLeft (square)==false){
cout<<"Draw"<<endl;
goto EXIT;
}
square[bestMove(square)]=cpu;
printboard();
}while(evaluate(square)!=10 && evaluate(square)!=-10 && isMovesLeft (square)==true);
if (evaluate (square)==10){
cout<<"Oh, you lose!"<<endl;
}else if (isMovesLeft (square)==false){
cout<<"Draw"<<endl;
}
EXIT:
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/80139.html
標籤:C++ 語言
上一篇:卑微小白在線求指教
下一篇:打鼴鼠(DFS)
