我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++实现五子棋游戏(注释版)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++实现五子棋游戏(注释版)

本文实例为大家分享了C++实现五子棋游戏的具体代码,供大家参考,具体内容如下

本程序是在vs2015环境下编译运行
vs左上角:文件–新建–项目–Win32控制台应用程序–(注意勾选“附加选项:空项目“)

右键头文件”添加–新建项“,类型为 .h 文件,名称分别为”Player.h“以及”ChessBoard.h",即定义“玩家”和“棋盘”两个class

然后相同的方式在源文件中右键添加三个.cpp文件

然后把code copy过去就可以了

另外,代码不是完美的,存在bug,大家可以尝试找一下

相关文档已上传,可自行下载查看

//main.cpp
#include<cstdio>
#include"ChessBoard.h" //包含入需要的各类头文件,除了需要的标准库头文件,还需要我们自定义的两个类头文件,使得两个类对全段程序可见
#include"Player.h"


int main()
{
    ChessBoard board;            //定义了棋盘对象board,思考该对象的构造过程
    Player playA("aaa", '*');    //玩家aaa的棋子形状是'*'
    playA.attachToBoard(&board); // 这里将棋盘对象board的地址赋给了playA玩家对象的成员变量指针m_ptBoard!!
    Player playB("bbb", '#');    //玩家bbb的棋子形状是'#'
    playB.attachToBoard(&board); // 这里将棋盘对象board的地址赋给了playB玩家对象的成员变量指针m_ptBoard!!
                                 // 这里查看玩家对象的棋盘成员对象指针值是否一致,与board对象地址是否一致!

    board.show();

    while (1)
    {
        playA.setChess(); //玩家A放下一个棋子
        if (playA.isWin())  //玩家A落棋后自己当裁判判断是否可以结束战斗
        {
            cout << "Winer!"; break;
        }

        board.show();   //注意该过程board对象,和AB棋盘对象的内容同时变化

        playB.setChess();  //玩家B放下一个棋子
        if (playB.isWin())   //玩家B落棋后自己当裁判判断是否可以结束战斗
        {
            cout << "Winer!"; break;
        }

        board.show(); //注意该过程board对象,和AB棋盘对象的内容同时变化
    }
    //getchar();
    return 1;
}
//ChessBoard.cpp
#include"ChessBoard.h"

ChessBoard::ChessBoard()
{
    for (int i = 1; i<ROW - 1; i++)
    for (int j = 1; j<COL - 1; j++)
        m_cSquare[i][j] = ' ';
    for (int j = 0; j<COL; j++)
        m_cSquare[0][j] = m_cSquare[ROW - 1][j] = '-';
    for (int i = 1; i<ROW; i++)
        m_cSquare[i][0] = m_cSquare[i][COL - 1] = '|';
}

void ChessBoard::show()
{
    system("cls");
    for (int i = 0; i<ROW; i++)
    {
        for (int j = 0; j<COL; j++)
            cout << m_cSquare[i][j] << ' ';   //这里的“ <<' ' ”很重要,这样才能使屏幕上ROW*COL输出为方形
        cout << endl;
    }
}
//ChessBoard.h
#pragma once

#include<iostream>
using namespace std;

#define ROW 15  // 棋盘行和列定义常数
#define COL 15

class ChessBoard//棋盘类
{
public:
    char m_cSquare[ROW][COL];
public:
    ChessBoard(); //构造函数
    void show();  //棋盘画图显示
};
//player.cpp
#include"Player.h"

bool Player::isInChessBoard(int x, int y)
{
    if (x<ROW - 1 && x>0 && y<COL - 1 && y>0)
        return true;
    else
        return false;
}

bool Player::isLine(int x, int y)
{
    for (int direc = HORIZON; direc <= LEFTTOPTORIGHTBOTTOM; direc++)//四个方向,权宜之计
    {
        int tempX, tempY, cnt = 1;//cnt:连续排列的同种类的棋子的个数,达到五个则该方赢
        for (int i = -4; i <= 4; i++)
        {
            if (i == 0)continue;//此时循环一遍相当于什么都没做
            switch (direc)
            {
            case HORIZON:
                tempX = x;  tempY = y + i;   break;
            case VERTICAL:
                tempX = x + i; tempY = y;    break;
            case LEFTBOTTOMTORIGHTTOP:
                tempX = x - i; tempY = y + i;   break;
            case LEFTTOPTORIGHTBOTTOM:
                tempX = x + i; tempY = y + i;   break;
            }
            if (isInChessBoard(tempX, tempY) && m_ptBoard->m_cSquare[tempX][tempY] == m_chessType) 
                cnt++;
            else
                cnt = 0;
            if (cnt == 5)//五子成线
                return true;
        }
    }return false;
}

void Player::setChess()
{
    cout << "请输入玩家" << m_name << "的x坐标和y坐标:" << endl;
    cin >> m_x >> m_y;
    while (cin.fail() || m_ptBoard->m_cSquare[m_x][m_y] != ' ')//输入不是int型变量或者此位置上已有棋子
    {
        cout << "输入有误,请再次输入玩家" << m_name << "的x坐标和y坐标:" << endl;
        cin.clear();  //清除fail状态 
        cin.sync() ;  //清除缓冲区
        cin >> m_x >> m_y;
    }
    if (isInChessBoard(m_x, m_y))
        m_ptBoard->m_cSquare[m_x][m_y] = m_chessType;
}

bool Player::isWin()
{
    return isLine(m_x, m_y) ? true : false;
}
//player.h
#pragma once
//宏定义四种检测五子是否连成线的方向,常量定义,也可以考虑使用const或者枚举类型定义!
#define HORIZON  0
#define VERTICAL  1
#define LEFTBOTTOMTORIGHTTOP 2
#define LEFTTOPTORIGHTBOTTOM 3

#include"ChessBoard.h"
#include<iostream>
using namespace std;
#include<string>

class Player
{
private:    

    string m_name;    

    char m_chessType;     

    int m_x;                        
    int m_y;     

    ChessBoard* m_ptBoard;    

public:
    Player(string name, char chessType) :m_name(name), m_chessType(chessType), m_ptBoard(NULL){} 

    void attachToBoard(ChessBoard* ptBoard){ m_ptBoard = ptBoard; } 

    bool isInChessBoard(int x, int y);  

    bool isLine(int x, int y);   

    bool isWin();    

    void setChess();  
};

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++实现五子棋游戏(注释版)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录