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);
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++控制台版扫雷游戏

    本文实例为大家分享了C++控制台版扫雷游戏的具体代码,供大家参考,具体内容如下 先说思路,其实挺简单的. (1) 随机生成10个雷,标记到二维数组里,然后计算八个方向的雷的总数记录下来,这是预处理阶段. (2)输入要翻开的位置的坐标,如果是数字直接显示,是空白的话,这里采用bfs即宽度优先搜索解决,搜到最外层是数字(仅一层)时结束,具体详见代码. // 扫雷程序  #include <iostream> #include <string> #include <queue>

  • C++实现扫雷小游戏(控制台)

    本文实例为大家分享了C++实现扫雷小游戏的具体代码,供大家参考,具体内容如下 1.问题描述 用c++写一个扫雷小游戏,扫雷大家都玩过吧,先任意点一个方格,没有爆炸时,会出现一个数字,这个数字是以它为中心的9个格子内所有雷的个数.一般围在一堆数字中间的有可能是雷,你在你认为是雷的那里右击,就可以把它设定为雷,然后在数字区用鼠标左右键双击,可以打开非雷区,所有雷被标记后,就赢了.今天我们写的程序需要能实现以下几个功能 (1).输入坐标打开一个格子,此格子若是雷则游戏结束,若不是则显示周围雷的个数.(

  • C++实现控制台版扫雷程序

    本文实例为大家分享了C++实现控制台版扫雷程序的具体代码,供大家参考,具体内容如下 测试平台: WIN7 工具: VC6.0 , VS2008都能编译得过. 花了两天时间写的,里面涉及的算法大都是自己想的,所以可能有些BUG. #include <iostream> #include <time.h> #include <windows.h> using namespace std;   #pragma comment (linker,"/subsystem:

  • C++控制台实现扫雷游戏

    本文实例为大家分享了C++控制台实现扫雷游戏的具体代码,供大家参考,具体内容如下 花了一下午写出来的控制台扫雷,主要通过修改和打印数组来实现. 主要的问题点: 1.在显示地图的过程中,既要显示数字,又要显示雷和符号,所以的用string类型的二维向量,vector<vector<string.>>;中间要利用ASCII码将int型的数字转化为字符串.2.生成地图的时候,雷是随机的,我这里采用的做法是取余生成雷,举个例子,如果雷数是格子数的十分之一,那我遍历整个二维数组,在rand(

  • C/C++ 中实现让控制台暂停的方法

    目录 让控制台暂停的方法 运行结果中让控制台停住 下面针对这个问题给出以下几种解决方案 让控制台暂停的方法 在程序调试的时候,有时控制台会出现闪烁之后又消失的情况,对于控制台中出现的结果可能看不到,此时就需要有一种方法使控制台在输出之后保持暂停.目前主要有一下几种方法: #include <stdlib.h> system("pause"); 这种方法可以直接使控制台暂停,并在控制台最后一行显示(请按任意键继续. . .)的标志.此时,在键盘上敲击任意键后,程序继续执行.

  • C/C++ 控制台等待指令解析

    目录 控制台等待指令 Ctrl + F5 C version C++ version 让控制台程序停下来--实现暂停功能 针对Microsoft 针对Linux 控制台等待指令 C/C++ 程序执行完后, 控制台一闪而过, 看不到输出的信息. 可以通过不同的方式是控制台暂停. Ctrl + F5 只是debug用, 最终程序不需要执行完后暂停. Ctrl + F5 执行完后会自动暂停. C version #include <stdio.h> int main() {     ....   

  • 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> #inclu

  • C语言实现井字棋游戏(人机对弈)

    井字棋游戏:即三子棋,英文名叫Tic-Tac-Tic,是一种在3*3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边线框,格线排成井字故得名. 题目分析 : 要完成该游戏的编写,我们需要先分析出完成整个游戏过程都需要干什么? 1.首先,需要定义出一个3*3的棋盘,根据相关知识,我们可以以二维数组的方式将棋盘表示出来: 2.棋盘定义出来后,需要将棋盘初始化,将3*3二维数组的每一个位置初始化为‘ ’(空格): 3.有了棋盘,我们就可以开始进行下棋了,首先要确定是玩家先下还是电脑先下.在这

  • C语言实现简单井字棋游戏

    本文实例为大家分享了C语言实现简单井字棋游戏的具体代码,供大家参考,具体内容如下 游戏截图 源代码 person.h //玩家对战 void person() { int i,j; initMap(map); //打印棋局 displayMap(map); //未分出胜负且棋局未落满子前无限循环 while(1) { //获取玩家下子位置 getXY(&i,&j); //玩家落子 setPiece(map,i,j); //清屏 system("cls"); //打印棋局

  • python实现人机对战的井字棋游戏

    本文实例为大家分享了python实现人机对战井字棋的具体代码,供大家参考,具体内容如下 游戏简介:在九宫格内进行,如果一方抢先于另一方向(横.竖.斜)连成3子,则获得胜利.游戏中输入方格位置代号的形式如下: 设计前的思路: 游戏中,board棋盘存储玩家.计算机的落子信息,未落子处未EMPTY.由于人机对战,需要实现计算机智能性,下面是为这个计算机机器人设计的简单策略:如果有一步棋可以让计算机机器人在本轮获胜,那就选那一步走.否则,如果有一步棋可以让玩家在本轮获胜,那就选那一步走.否则,计算机机

  • python实现简单的井字棋游戏(gui界面)

    项目输出 项目先决条件 要使用python构建井字游戏,我们需要tkinter模块和python的基本概念 Tkinter模块是用于渲染图形的标准图形用户界面. Tkinter.messagebox用于显示消息框 要安装tkinter模块,我们在命令提示符下使用了pip install命令: pip install tkinter 项目文件结构 这些是使用python构建井字游戏的步骤: 导入模块 初始化窗口 检查结果的功能 检查获胜者的功能 定义标签和按钮 1.导入模块 from tkinte

  • C语言实现简单的井字棋游戏

    本文实例为大家分享了C语言实现简单井字棋游戏的具体代码,供大家参考,具体内容如下 1.什么是井字棋 井字棋相信大部分人都玩过 规则:双方轮流放子,当某一方的三个子连成一线(行,列,对角)时,该方获胜. 2.游戏前的准备 1. 菜单 游戏正式开始前我们可以为用户提供一个选择菜单,笔者做了一个最简单的游戏开始菜单: 代码: /*菜单*/ int menu() { printf("###########################\n"); printf("## 1.Play

  • python实现简单的井字棋

    本文实例为大家分享了python实现简单的井字棋的具体代码,供大家参考,具体内容如下 使用python实现井字棋游戏,没有具体算法,只是用随机下棋简单实现: import random board = [['+','+','+'],['+','+','+'],['+','+','+']] def ma(board): if isempty(board): a = random.randint(0, 2) b = random.randint(0, 2) if board[a][b] != 'X'

  • python实现简单井字棋游戏

    井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名.游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜. 游戏的难点在于,如何判断连接成了一条线:横.竖.斜三个方向: 游戏的代码: #!/usr/bin/env python3 # -*- coding:utf-8 -*- u''' Created on 2019年4月13日 @au

  • python实现简单井字棋小游戏

    用python实现的一个井字棋游戏,供大家参考,具体内容如下 #Tic-Tac-Toe 井字棋游戏 #全局常量 X="X" O="O" EMPTY=" " #询问是否继续 def ask_yes_no(question): response=None; while response not in("y","n"): response=input(question).lower() return respon

  • Java实现简单井字棋小游戏代码实例

    Java第一次实验,老师让做一个井字棋,电脑随机下棋. 然后就想能不能聪明一点,可以判断出走哪一步棋:然后只能做到不会输,还是不够聪明,只能呆板地堵住用户,smartRobot的第三个判断逻辑找不到最佳位置,赢得概率比较小:而且我没事干时,想玩玩这个小游戏找找成就感,但每次都会赢了机器人,所以删删改改了四五次,最后才成. 可以选择谁先开始,但startGame里的代码更加冗余了.看着就很乱,但没想到好的办法. smartRobot里的代码全部重写了,比原来更聪明一点了:下在四个角的位置时,能优先

随机推荐