C++控制臺實現(xiàn)簡單人機對弈井字棋
更新時間:2022年05月16日 08:27:25 作者:小雪菜本菜
這篇文章主要為大家詳細介紹了C++控制臺實現(xiàn)簡單人機對弈井字棋,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了C++實現(xiàn)簡單人機對弈井字棋的具體代碼,供大家參考,具體內(nèi)容如下
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行的內(nè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列的內(nèi)容返回 ?? ?} ?? ?if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != '-')//判斷捺對角線(\)的內(nèi)容是否全都相同 ?? ??? ?return board[0][0]; ?? ?else if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != '-')//判斷撇對角線(/)的內(nèi)容是否全都相同 ?? ??? ?return board[0][2]; ?? ?else if (isDone(row,col))//判斷是否是平局,如果是平局返回‘q' ?? ??? ?return 'q'; ?? ?else //判斷是否還未產(chǎn)生游戲結(jié)果,如果還未產(chǎn)生游戲結(jié)果返回‘-' ?? ??? ?return '-'; } ? void Game::getWinner() { ?? ?char a; ?? ??? ?do ?? ??? ?{ ?? ??? ??? ?print();?? ?//屏幕上打印一個棋盤 ?? ??? ??? ?makeMove();?? ?//打印出棋盤之后,玩家開始下棋 ?? ??? ??? ?a = getCurrentPlayer();?? ? //玩家下完棋后,開始判斷游戲結(jié)果 ?? ??? ??? ?if (a != '-')?? ? ?// ?‘-':沒人贏 ?? ??? ??? ?{ ?? ??? ??? ??? ?break;?? ?//如果已經(jīng)分出勝負,跳出循環(huán) ?? ??? ??? ?} ?? ??? ??? ?computer_move(row,col);?? ?//如果沒有分出勝負,電腦下棋 ?? ??? ??? ?a = getCurrentPlayer();?? ?//下完之后判斷游戲結(jié)果 ?? ??? ?} 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) { ? ?? ?//判斷數(shù)組當中每一個元素是否有'-',如果有'-',說明沒有滿,返回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] == '-')?? ? ? //判斷玩家輸入的位置是否已經(jīng)被占 ?? ??? ??? ??? ?{ ?? ??? ??? ??? ??? ?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));//利用函數(shù)生成隨機數(shù) ?? ?do ?? ?{ ?? ??? ?int x = rand() % row;//控制隨機數(shù)小于3并把結(jié)果賦給橫坐標 ?? ??? ?int y = rand() % col;//控制隨機數(shù)小于3并把結(jié)果賦給縱坐標 ?? ??? ?if (board[x][y] == '-')//判斷電腦選擇的位置是否被占 ?? ??? ?{ ?? ??? ??? ?board[x][y] = 'O';//將電腦下棋的位置用‘O'占用 ?? ??? ??? ?break; ?? ??? ?} ?? ?} while (1); }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C++ 將一個文件讀入數(shù)組再讀出數(shù)組的方法
今天小編就為大家分享一篇C++ 將一個文件讀入數(shù)組再讀出數(shù)組的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07Visual Studio Code 2020安裝教程及CPP環(huán)境配置(教程圖解)
這篇文章主要介紹了Visual Studio Code 2020安裝教程、CPP環(huán)境配置,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-03-03將正小數(shù)轉(zhuǎn)化為2-9進制小數(shù)的實現(xiàn)方法
本篇文章對正小數(shù)轉(zhuǎn)化為2-9進制小數(shù)的實現(xiàn)方法進行了介紹,需要的朋友參考下2013-05-05C語言輪轉(zhuǎn)數(shù)組的三種實現(xiàn)
輪轉(zhuǎn)數(shù)組是一種將數(shù)組元素循環(huán)移動的處理方式,它通常用于解決一些需要對固定長度的數(shù)組進行循環(huán)滾動處理的問題,本文就介紹了C語言輪轉(zhuǎn)數(shù)組的三種實現(xiàn),感興趣的可以了解一下2023-08-08