首頁 > 軟體

C++控制檯實現簡單人機對弈井字棋

2022-05-16 13:00:08

本文範例為大家分享了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 << "t1t2t3n";
    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);
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com