您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页TicTacToeWithCpt

TicTacToeWithCpt

来源:化拓教育网
/***************************************************************************** This program plays TicTacToe with you, I will try my best to make it a better player.

*****************************************************************************/ #include #include #include #include #include using namespace std;

enum cell{N=0,X=1,O=10};

class Board { private: cell board[3][3];//the board bool pl,cp; bool end; int count; public: Board(); //constructor,initialize the board to be blank void SetBoard(int a,int b,cell chess); //input a step to refresh, //print the board void GetCptStep(); //get computer's step,then set the board and print it void PrintBoard(); //just print the board bool IsEnd() {return end;} bool IsFull(int a,int b) {return board[a][b];} void Refresh(); //print it if sb won, //change the bool end if the game ended };

Board::Board() { for(int i=0;i<3;i++) {

for(int j=0;j<3;j++) { board[i][j] = N; } } count = 0; pl = cp = end = false; }

//to initialize it with a blank board

void Board::SetBoard(int a,int b,cell chess) { board[a][b] = chess; count++; PrintBoard(); }

//to put the player's chesses in the board

void Board::PrintBoard() { system(\"Cls\"); char print[3][3]; cout<if(i!=2) cout<<\" ——————\"<//to print the board

void Board::Refresh() { int sum1=0,sum2=0,sum3=0,sum4=0; for(int i=0;i<3;i++) { sum1 = sum2 = 0; for(int j=0;j<3;j++) { sum1 = sum1 + int(board[i][j]); sum2 = sum2 + int(board[j][i]); } sum3 = sum3 + int(board[i][i]); sum4 = sum4 + int(board[i][2-i]); if(sum1%10==3||sum2%10==3||sum3%10==3||sum4%10==3) { pl = true; end = true; cout<<\"You won!Congratulations:)\\n\"; break; } else if(sum1/10==3||sum2/10==3||sum3/10==3||sum4/10==3) { cp = true; end = true; cout<<\"The computer did a better job!Sorry~\\n\"; break; } }

if(!pl&&!cp&&count==9) { cout<<\"Draw!Play again~\\n\";

end = true; } }

void Board::GetCptStep() { int a,b; bool win,defend; win = defend = false; int sum1,sum2,sum3=0,sum4=0; for(int i=0;i<3;i++) { sum1 = sum2 = 0; for(int j=0;j<3;j++) { sum1 = sum1 + int(board[i][j]); sum2 = sum2 + int(board[j][i]); } sum3 = sum3 + int(board[i][i]); sum4 = sum4 + int(board[i][2-i]); //calculate sum if(sum1/10==2) { for(int k=0;k<3;k++) { if(board[i][k]==N) { a = i; b =k; win = true; break; } else if(board[i][k]==X) break; else continue; } } //to win - row if(!win&&sum2/10==2) { for(int k=0;k<3;k++) {

if(board[k][i]==N) { a = k; b =i; win = true; break; } else if(board[k][i]==X) break; else continue; } }

//to win - column if(!win&&sum1%10==2) { for(int k=0;k<3;k++) { if(board[i][k]==N) { a = i; b =k; defend = true; break; } else if(board[i][k]==O) break; else continue; } }

//to defend - row

if(!win&&sum2%10==2) { for(int k=0;k<3;k++) { if(board[k][i]==N) { a = k; b =i; defend = true; break; } else if(board[k][i]==O) break; else

continue; } } //to defend - column } if(!win&&sum3/10==2) { for(int k=0;k<3;k++) { if(board[k][k]==N) { a = b = k; win = true; break; } else if(board[k][k]==X) break; else continue; } } //to win - diag1 if(!win&&sum4/10==2) { for(int k=0;k<3;k++) { if(board[k][2-k]==N) { a = k; b = 2-k; win = true; break; } else if(board[k][2-k]==X) break; else continue; } } //to win - diag2 if(!win&&sum3%10==2) { for(int k=0;k<3;k++) {

if(board[k][k]==N) { a = b = k; defend = true; break; } else if(board[k][k]==O) break; else continue; } }

//to defend - diag1

if(!win&&sum4%10==2) { for(int k=0;k<3;k++) { if(board[k][2-k]==N) { a = k; b = 2-k; defend = true; break; } else if(board[k][2-k]==O) break; else continue; } }

//to defend - diag2 if(!win&&!defend) { if(board[1][1]==N) a = b = 1; else { do { a = rand()%3; b = rand()%3; }while( board[a][b] ); }

} //get a random SetBoard(a,b,O); }

int main() { Board brd; int a,b; int control; string ans;//for the prompt cout<<\"Would you like to start first? Type in 'Y' or 'N'.\"<>ans; if(ans==\"Y\") { control = 1; break; } else if(ans==\"N\") { control = -1; break; } else { cout<<'\\a'<<\"Invalid input.Please type in 'Y' or 'N'.\"<//to decide whether to start with cpt or player, control

cout<<\"Please enter 2 integers from{1,2,3} with a blank between them to mark its positi-on.\\n\" <<\"Ex. \\\"1 2\\\" refers to row 1 column 2.\\n\\n\"; while(1) { if(control>0) { cout<<\"Make your move: \"; do

{ cin>>a>>b; if(!cin) { fflush(stdin);//to clear the invalid input in the RAM cin.clear(); brd.PrintBoard(); cout<<'\\a'<<\"Invalid input.Please enter another.\\n\" <<\"Make your move: \"; }

else if(a<1||b<1||a>3||b>3) { brd.PrintBoard(); cout<<'\\a'<<\"Invalid input.Please enter 2 integers from{1,2,3}.\\n\" <<\"Make your move: \"; }

else if(brd.IsFull(a-1,b-1)) { brd.PrintBoard(); cout<<'\\a'<<\"Already a chess here.Please enter another.\\n\" <<\"Make your move: \"; } else { brd.SetBoard(a-1,b-1,X); break;

}

}while(1);

//check a,b if invalid or already filled } else { brd.GetCptStep(); } control = control * (-1); brd.Refresh(); if(brd.IsEnd()) break; }

}

system(\"pause\"); return 0;

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo9.cn 版权所有 赣ICP备2023008801号-1

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务