人机下棋游戏

人机下井字棋

重要部分为提高电脑智能性,控制权重 

#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;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值