当前位置:首页 > 开发教程 > C语言 >

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

时间:2022-05-16 11:29 来源:未知 作者:Believe yourself 收藏

这篇文章主要为大家详细介绍了C++控制台实现简单人机对弈井字棋,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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语言阅读排行

最新文章