人机下井字棋
重要部分为提高电脑智能性,控制权重
#include<iostream>
#include<ctime>
#include<windows.h>
using namespace std;
class ChessGame
{
private:
char board[100][100]; //棋盘
int score[100][100]; //得分
int record[100][100]; //记录 1为空 2为玩家下棋 5为电脑下棋
int row; //行
int lst; //列
char ChessPlayer; //玩家棋子
char ChessComputer; //电脑棋子
public:
ChessGame() {}
void setrecord();
void SetBoard(); //设置棋盘大小
void SetPiece(); //设置棋子
void Print(); //打印棋盘
bool IsFinish(); //判断游戏是否结束
char getGameResult(); //判断每次下棋结果
void PlayerMove(); //玩家下棋
void ComputerMove(); //电脑下棋
void getWinner(); //得出胜利者
};
/* 3个为空,重要性最低,权值设置为1
2个空1个对方,重要性次低,权值为10
1个空格1个对方1个己方,重要行较低,权值50
2个空格1个己方,重要性较高,权值为100,对角线上的点
2个空格1个己方,重要性较高,权值为200,行列上的点
1个空格2个对方,重要性次高,权值500,不堵住会输
1个空格2个己方,重要性最高,权值1000,可以直接赢
每个位置上的权值 = 行权值+列权值+对角线权值+反对角线权值
*/
void ChessGame::setrecord()
{
int i,j;
for( i=0; i<row; i++ )
{
for( j=0; j<lst; j++ )
{
record[i][j] = 1;
}
}
}
/* 打印棋盘 */
void ChessGame::Print()
{
int i,j,k;
for( i=0; i<row; i++ )
{
for( k=0; k<lst; k++ )
{
cout<<"———";
}
cout<<endl;
cout<<"|";
for( j=0; j<lst; j++ )
{
cout<<" "<<board[i][j];
}
cout<<" "<<"|"<<endl;
}
for( k=0; k<lst; k++ )
{
cout<<"———";
}
cout<<endl;
}
/* 判断每次下棋结果 */
char ChessGame::getGameResult()
{
int i,j;
int flag;
for( i=0; i<row; i++ ) //判断行是否相同
{
flag = 1;
for( j=0; j<lst; j++ )
{
if( board[i][0] != board[i][j] )
{
flag = 0;
}
}
if( flag == 1 && board[i][0]!='*' )
{
return board[i][0];
}
}
for( i=0; i<lst; i++ ) //判断列是否相同
{
flag = 0;
for( j=0; j<row; j++ )
{
if( board[0][i] != board[j][i] )
{
flag = 1;
}
}
if( flag == 0 && board[0][i]!='*')
{
return board[0][i];
}
}
//判断\是否相同
flag = 1;
for( i=0; i<row; i++ )
{
if( board[0][0] != board[i][i])
{
flag = 0;
}
}
if( flag == 1 && board[0][0]!='*' )
{
return board[0][0];
}
//判断/是否相同
int k = lst-1;
flag = 0;
for( i=0; i<lst; i++,k-- )
{
if( board[lst-1][0] != board[k][i])
{
flag = 1;
}
}
if( flag == 0 && board[lst-1][0]!='*' )
{
return board[lst-1][0];
}
if( IsFinish() ) //判断是否平局,平局时返回f
{
return 'f';
}
else
{
return '*'; //游戏未完成,胜负未确定,返回*
}
}
/* 判断游戏是否结束 */
bool ChessGame::IsFinish()
{
int i,j;
//判断棋局中是否还有*,有则游戏未结束,返回0,无则游戏结束,返回1
for( i=0; i<row; i++ )
{
for( j=0; j<lst; j++ )
{
if( board[i][j]=='*' )
{
return 0;
}
}
}
return 1;
}
/* 玩家下棋 */
void ChessGame::PlayerMove()
{
int x,y; //定义(x,y)为棋盘坐标
do
{
cout<<"请输入您落棋的位置(x,y): ";
cin>>x>>y;
if( x>=1 && x<=lst && y>=1 && y<=row ) //判断玩家输入的坐标是否正确
{
if( board[x-1][y-1]=='*' ) //判断玩家输入位置是否被占
{
board[x-1][y-1] = ChessPlayer; //玩家落棋为ChessPlayer
record[x-1][y-1] = 2;
break;
}
else
{
cout<<endl;
cout<<"此位置已存在棋子,请重新输入"<<endl<<endl;
}
}
else
{
cout<<endl;
cout<<"坐标错误,请重新输入"<<endl<<endl;
}
}
while(1);
}
/* 电脑下棋 */
void ChessGame::ComputerMove()
{
int sum = 0;
int i,j,k;
for( i=0; i<row; i++ )
{
for( j=0; j<lst; j++)
{
score[i][j] = 0;
}
}
//对每行进行分数统计
for( i=0; i<row; i++ )
{
for( j=0; j<lst; j++ )
{
sum += record[i][j];
}
switch(sum)
{
case 3: //1+1+1 权值:1
for( k=0; k<lst; k++ )
{
if( record[i][k]==1 )
{
score[i][k] += 1;
}
}
break;
case 4: //1+1+2 权值:10
for( k=0; k<lst; k++ )
{
if( record[i][k]==1 )
{
score[i][k] += 10;
}
}
break;
case 8: //1+2+5 权值:50
for( k=0; k<lst; k++ )
{
if( record[i][k]==1 )
{
score[i][k] += 50;
}
}
break;
case 7: //1+1+5 权值:200
for( k=0; k<lst; k++ )
{
if( record[i][k]==1 )
{
score[i][k] += 200;
}
}
break;
case 5: //2+2+1 权值:500
for( k=0; k<lst; k++ )
{
if( record[i][k]==1 )
{
score[i][k] += 500;
}
}
break;
case 11: //5+5+1 权值:1000
for( k=0; k<lst; k++ )
{
if( record[i][k]==1 )
{
score[i][k] += 1000;
}
}
break;
}
sum = 0;
}
//对每一列进行分数统计
for( i=0; i<lst; i++ )
{
for( j=0; j<row; j++ )
{
sum += record[j][i];
}
switch(sum)
{
case 3:
for( k=0; k<row; k++ )
{
if( record[k][i]==1 )
{
score[k][i] += 1;
}
}
break;
case 4:
for( k=0; k<row; k++ )
{
if( record[k][i]==1 )
{
score[k][i] += 10;
}
}
break;
case 8:
for( k=0; k<row; k++ )
{
if( record[k][i]==1 )
{
score[k][i] += 50;
}
}
break;
case 7:
for( k=0; k<row; k++ )
{
if( record[k][i]==1 )
{
score[k][i] += 200;
}
}
break;
case 5:
for( k=0; k<row; k++ )
{
if( record[k][i]==1 )
{
score[k][i] += 500;
}
}
break;
case 11:
for( k=0; k<row; k++ )
{
if( record[k][i]==1 )
{
score[k][i] += 1000;
}
}
break;
}
sum = 0;
}
//对对角线进行分数统计
for( i=0; i<row; i++ )
{
sum += record[i][i];
}
switch(sum)
{
case 3:
for( k=0; k<row; k++ )
{
if( record[k][k]==1 )
{
score[k][k] += 1;
}
}
break;
case 4:
for( k=0; k<row; k++ )
{
if( record[k][k]==1 )
{
score[k][k] += 10;
}
}
break;
case 8:
for( k=0; k<row; k++ )
{
if( record[k][k]==1 )
{
score[k][k] += 50;
}
}
break;
case 7:
for( k=0; k<row; k++ )
{
if( record[k][k]==1 )
{
score[k][k] += 100;
}
}
break;
case 5:
for( k=0; k<row; k++ )
{
if( record[k][k]==1 )
{
score[k][k] += 500;
}
}
break;
case 11:
for( k=0; k<row; k++ )
{
if( record[k][k]==1 )
{
score[k][k] += 1000;
}
}
break;
}
sum = 0;
//对反对角线进行分数统计
for( i=row-1, j=0; j<lst; i--,j++ )
{
sum += record[i][j];
}
switch(sum)
{
case 3:
for( i=row-1, j=0; j<lst; i--,j++ )
{
if( record[i][j]==1 )
{
score[i][j] += 1;
}
}
break;
case 4:
for( i=row-1, j=0; j<lst; i--,j++ )
{
if( record[i][j]==1 )
{
score[i][j] += 10;
}
}
break;
case 8:
for( i=row-1, j=0; j<lst; i--,j++ )
{
if( record[i][j]==1 )
{
score[i][j] += 50;
}
}
break;
case 7:
for( i=row-1, j=0; j<lst; i--,j++ )
{
if( record[i][j]==1 )
{
score[i][j] += 100;
}
}
break;
case 5:
for( i=row-1, j=0; j<lst; i--,j++ )
{
if( record[i][j]==1 )
{
score[i][j] += 500;
}
}
break;
case 11:
for( i=row-1, j=0; j<lst; i--,j++ )
{
if( record[i][j]==1 )
{
score[i][j] += 1000;
}
}
break;
}
int maxrow=0, maxlst=0;
for( i=0; i<row; i++ )
{
for( j=0; j<lst; j++ )
{
if( score[i][j] > score[maxrow][maxlst] )
{
maxrow = i;
maxlst = j;
}
}
}
board[maxrow][maxlst] = ChessComputer;
record[maxrow][maxlst] = 5;
}
/* 设置棋盘大小 */
void ChessGame::SetBoard()
{
cout<<endl<<"请设置棋盘大小( 如 3 x 3 ): ";
int ia,ib;
char c3;
cin>>ia>>c3>>ib;
row = ia;
lst = ib;
int i,j;
for( i=0; i<row; i++ )
{
for( j=0; j<lst; j++ )
{
board[i][j] = '*';
}
}
}
/* 设置棋子 */
void ChessGame::SetPiece()
{
cout<<endl<<"请选择棋子( X 或 O ): ";
char c;
cin>>c;
if( c=='X' )
{
ChessPlayer = 'X';
ChessComputer = 'O';
}
else
{
ChessPlayer = 'O';
ChessComputer = 'X';
}
}
/* 得出胜利者 */
void ChessGame::getWinner()
{
int isbegin = 1;
char reply;
char ch;
do
{
cout<<" 人机下棋游戏 "<<endl<<endl;
cout<<"请选择先下或后下(先下输入1,后下输入2): ";
int n;
cin>>n;
SetPiece();
SetBoard();
setrecord();
do
{
Print(); //打印棋盘
if( n==1 )
{
PlayerMove(); //玩家先下棋
/*int i,j;
for( i=0; i<row; i++ )
{
for( j=0; j<lst; j++ )
{
cout<<record[i][j]<<" ";
}
}*/ //测
system("cls"); //测
cout<<" 人机下棋游戏 "<<endl<<endl;
Print(); //打印棋盘
}
else
{
ComputerMove(); //电脑先下棋
system("cls"); //测
cout<<" 人机下棋游戏 "<<endl<<endl;
Print(); //打印棋盘
}
ch = getGameResult(); //判断结果
if( ch!='*' )
{
break;
}
//Sleep(500);
if( n==1 )
{
ComputerMove(); //电脑后下棋
}
else
{
PlayerMove(); //玩家后下棋
}
ch = getGameResult();
system("cls"); //测
cout<<" 人机下棋游戏 "<<endl<<endl;
}
while( ch=='*');
if( ch == ChessPlayer )
{
cout<<endl;
cout<<" 玩家胜利 "<<endl;
}
else
{
if( ch==ChessComputer )
{
cout<<endl;
cout<<" 电脑胜利 "<<endl;
}
else
{
cout<<endl;
cout<<" 平局 "<<endl;
}
}
cout<<endl<<"是否继续游戏( Y / y 或 N / n ) ";
cin>>reply;
if( reply=='Y' || reply=='y' )
{
isbegin = 1;
}
else
{
isbegin = 0;
}
system("cls");
}
while( isbegin );
}
int main()
{
ChessGame chessgame;
chessgame.getWinner();
return 0;
}