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

Sabah ·
更新时间:2024-11-01
· 331 次阅读

本文实例为大家分享了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++ 控制台

需要 登录 后方可回复, 如果你还没有账号请 注册新账号