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语言 冒泡排序算法详解及实例

    这篇文章主要介绍了C语言 冒泡排序算法详解及实例的相关资料,需要的朋友可以参考下
    2016-11-11
  • 深度理解C语言中的关键字static

    深度理解C语言中的关键字static

    在C语言中static主要定义全局静态变量、定义局部静态变量、定义静态函数,下面这篇文章主要给大家介绍了关于C语言中关键字static的相关资料,需要的朋友可以参考下
    2021-08-08
  • C++ 将一个文件读入数组再读出数组的方法

    C++ 将一个文件读入数组再读出数组的方法

    今天小编就为大家分享一篇C++ 将一个文件读入数组再读出数组的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • 一文详解Qt中线程的实际应用

    一文详解Qt中线程的实际应用

    为了让程序尽快响应用户操作,在开发应用程序时经常会使用到线程。这篇文章就来和大家介绍一下Qt中线程的实际应用,感兴趣的小伙伴可以了解一下
    2023-03-03
  • C语言实现用户态线程库案例

    C语言实现用户态线程库案例

    下面小编就为大家带来一篇C语言实现用户态线程库案例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • OpenCV实现相机标定板

    OpenCV实现相机标定板

    这篇文章主要为大家详细介绍了OpenCV实现相机标定板,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Visual Studio Code 2020安装教程及CPP环境配置(教程图解)

    Visual Studio Code 2020安装教程及CPP环境配置(教程图解)

    这篇文章主要介绍了Visual Studio Code 2020安装教程、CPP环境配置,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • 将正小数转化为2-9进制小数的实现方法

    将正小数转化为2-9进制小数的实现方法

    本篇文章对正小数转化为2-9进制小数的实现方法进行了介绍,需要的朋友参考下
    2013-05-05
  • C语言轮转数组的三种实现

    C语言轮转数组的三种实现

    轮转数组是一种将数组元素循环移动的处理方式,它通常用于解决一些需要对固定长度的数组进行循环滚动处理的问题,本文就介绍了C语言轮转数组的三种实现,感兴趣的可以了解一下
    2023-08-08
  • 基于稀疏图上的Johnson算法的详解

    基于稀疏图上的Johnson算法的详解

    本篇文章介绍了,稀疏图上的Johnson算法的详解。需要的朋友参考下
    2013-05-05

最新评论