C++控制台实现简单人机对弈井字棋

 更新时间:2022年05月16日 08:27:25   作者:小雪菜本菜  
这篇文章主要为大家详细介绍了C++控制台实现简单人机对弈井字棋,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了C++实现简单人机对弈井字棋的具体代码,供大家参考,具体内容如下

main.cpp

#include"TicTacToe.h"
int main() 
{
    Game game;
    game.getWinner();
    return 0;
    
}

TicTacToe.h

#pragma once
#include<iostream>
using namespace std;
#include<array>
#include<ctime>
class Game
{
public:
    Game();
    void print();
    char getCurrentPlayer();
    void getWinner();
    bool isDone(int row,int col);
    void makeMove();
    void computer_move(int row, int col);
protected:
 
    array <array< char, 3 >, 3 > board;
    int row;
    int col;
};
TicTacToe.cpp

#include"TicTacToe.h"
Game::Game()
{
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            board[i][j] = '-';
        }
    } 
    this->col = 3;
    this->row = 3;
}
 
void Game::print()
{
    cout << "\t1\t2\t3\n";
    for (int i = 0; i < 3; i++)
    {
 
        cout << i + 1;
        for (int j = 0; j < 3; j++)
        {
            cout << "\t";
            cout << board[i][j];
        }
        cout << endl;
    }
}
 
 
char Game::getCurrentPlayer()
{
 
    int i = 0;
    for (; i < 3; i++)//判断第i行是否全都相同
    {
        if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != '-')
            return board[i][0];//将第i行的内容返回
    }
    for (i = 0; i < 3; i++)//判断第i列是否全都相同
    {
        if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != '-')
            return board[0][i];//将第i列的内容返回
    }
    if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != '-')//判断捺对角线(\)的内容是否全都相同
        return board[0][0];
    else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != '-')//判断撇对角线(/)的内容是否全都相同
        return board[0][2];
    else if (isDone(row,col))//判断是否是平局,如果是平局返回‘q'
        return 'q';
    else //判断是否还未产生游戏结果,如果还未产生游戏结果返回‘-'
        return '-';
}
 
void Game::getWinner()
{
    char a;
        do
        {
            print();    //屏幕上打印一个棋盘
            makeMove();    //打印出棋盘之后,玩家开始下棋
            a = getCurrentPlayer();     //玩家下完棋后,开始判断游戏结果
            if (a != '-')      //  ‘-':没人赢
            {
                break;    //如果已经分出胜负,跳出循环
            }
            computer_move(row,col);    //如果没有分出胜负,电脑下棋
            a = getCurrentPlayer();    //下完之后判断游戏结果
        } while (a == '-');
        if (a == 'X')    //判断玩家是否获胜:‘x'代表玩家获胜
            printf("Congratulations,you win!\n");
        else if (a == 'O')    //判断玩家是否获胜:‘o'代表电脑获胜
            printf("It's too bad,you lose!\n");
        else        //判断是否是平局
            printf("Draw!\n");
}
 
bool Game::isDone(int row,int col)
{
 
    //判断数组当中每一个元素是否有'-',如果有'-',说明没有满,返回0;否则返回1
    int i, j;
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
            if (board[i][j] == '-')    //判断是否有'-'
                return 0;    //有'-'返回0
    }
    return 1;    //没有'-'返回1
}
 
void Game::makeMove()
{
 
        int x, y;//先定义两个变量,以便接收玩家下棋的坐标
        do
        {
            printf("Please input your coordinate:(x,y)!");//提示玩家下棋
            scanf("%d%d", &x, &y);     //接收玩家所下的位置
            if (x >= 1 && x <= 3 && y >= 1 && y <= 3)  //判断玩家输入坐标是否有误
                if (board[x - 1][y - 1] == '-')       //判断玩家输入的位置是否已经被占
                {
                    board[x - 1][y - 1] = 'X';  //将玩家输入的位置用‘x'占用
                    break;
                }
                else//玩家输入位置被占,提示玩家重新输入位置
                    printf("Error!This place was be used!\n");
            else//玩家输入坐标有误,直接提示玩家error
                printf("Error!");
        } while (1);
    
}
void Game::computer_move(int row,int col)
{
    srand((unsigned long)time(NULL));//利用函数生成随机数
    do
    {
        int x = rand() % row;//控制随机数小于3并把结果赋给横坐标
        int y = rand() % col;//控制随机数小于3并把结果赋给纵坐标
        if (board[x][y] == '-')//判断电脑选择的位置是否被占
        {
            board[x][y] = 'O';//将电脑下棋的位置用‘O'占用
            break;
        }
    } while (1);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C/C++ Qt 自定义Dialog对话框组件应用案例详解

    C/C++ Qt 自定义Dialog对话框组件应用案例详解

    有时候我们需要一次性修改多个数据,使用默认的模态对话框似乎不太够用,此时我们需要自己创建一个自定义对话框。这篇文章主要介绍了Qt自定义Dialog对话框组件的应用,感兴趣的同学可以学习一下
    2021-11-11
  • 嵌入式C语言查表法在项目中的应用

    嵌入式C语言查表法在项目中的应用

    今天小编就为大家分享一篇关于嵌入式C语言查表法在项目中的应用,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • QT利用QProcess获取计算机硬件信息

    QT利用QProcess获取计算机硬件信息

    本文介绍利用QProcess获取计算机的CPU、主板、硬盘等电脑相关硬件信息。文中的示例代码讲解详细,对我们学习QT有一定的帮助,感兴趣的可以了解一下
    2022-06-06
  • c++传输文件到不同计算机上的示例代码

    c++传输文件到不同计算机上的示例代码

    这篇文章主要为大家详细介绍了c++传输文件到不同计算机上的相关知识,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • C字符串与C++中string的区别详解

    C字符串与C++中string的区别详解

    以下是对C字符串与C++中string的区别进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-09-09
  • C++ 实现求最大公约数和最小公倍数

    C++ 实现求最大公约数和最小公倍数

    这篇文章主要介绍了c++ 实现求最大公约数和最小公倍数的相关资料,需要的朋友可以参考下
    2017-05-05
  • 基于C语言实现三子棋游戏

    基于C语言实现三子棋游戏

    这篇文章主要为大家详细介绍了基于C语言实现三子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++中头文件与源文件的作用详解

    C++中头文件与源文件的作用详解

    这篇文章主要给大家介绍了关于C++中头文件与源文件的作用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • C语言数据结构之顺序表和单链表

    C语言数据结构之顺序表和单链表

    在数据结构中,线性表是入门级数据结构,线性表又分为顺序表和链表,这篇文章主要给大家介绍了关于C语言数据结构之顺序表和单链表的相关资料,需要的朋友可以参考下
    2021-06-06
  • C语言 文件操作解析详解及实例代码

    C语言 文件操作解析详解及实例代码

    这篇文章主要介绍了C语言 文件操作解析详解及实例代码的相关资料,需要的朋友可以参考下
    2016-11-11

最新评论