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;
}
/*下面是核心代码:如何判断五子是否连成线。
这里采用的是以玩家此刻放下的棋子为中心,从四种方向逐个判断是否在此方向上连成了线
这里将四个方向上的判断都放在一起,避免了四次调用不同方向上的判断,
但在for里面放一个switch有些别扭,可读性上似乎不好*/
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);  /*判断下棋位置(x,y)是否合理,思考哪些合理,哪些不合理*/

    bool isLine(int x, int y);   /*判断落子是否排成line*/

    bool isWin();    /*判断输赢*/

    void setChess();  /*下子*/
};

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

(0)

相关推荐

  • C++实现五子棋小游戏

    本文实例为大家分享了C++实现五子棋小游戏的具体代码,供大家参考,具体内容如下 思路:先用用system(“color 70”)改变控制台的背景色为灰白色,前景色为黑色,然后用“■”打印棋盘,然后用SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a)改变输出颜色分别为白色和黑色,用字符“●”打印黑棋和白棋.整个棋盘用一个char类型的二维数组保存,空的地方用‘ ’标识,玩家一下棋的地方用‘x’标识,玩家二下棋的地方用‘o’标识(电

  • 基于c++ ege图形库实现五子棋游戏

    本文分享的五子棋实例,制作基于ege图像库, 首先需要安装配置ege环境 就可以编写小游戏了. 用到的ege库函数不多 , 主要是基于c++的. 先看界面效果: 输入界面:(就是控制台) 游戏胜利界面: 文档如下: 关于五子棋的构思: 实现人人对战的五子棋游戏.使用面向对象的c++ 和 ege库实现. ege的安装过程不在说明 , 在添加编译链接时去掉 -mwindows 选项. dev c++ 的运行环境设置为 TDM-GCC 4.8.1.32-bit Debug 为保险起见,编译时选择菜单栏

  • C++语言设计实现五子棋

    本文为大家分享了C++五子棋的设计思路和设计实现,供大家参考,具体内容如下 算法思路: 在结束了对C++的学习之后,准备自己编制一些简单的练习程序.目前初步设想是编制一个人机对战的简易五子棋软件. 以下为个人设计思考的过程. 首先,进行问题分析与设计.计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始.比赛结束后初始化棋盘,询问是否继续比赛或退出.后续可加入复盘.悔棋等功能.整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象. 棋盘类的设计. 数据存

  • C++实现五子棋小程序

    这是一个用C++写的五子棋的小程序,关于A若是占据了已经下了的位置处理的不好.改动 hight,与width ,与q[][] 可以将棋盘扩大. #include<iostream> #include<vector> using namespace std; class qipan { public: qipan() {} ~qipan() {}; //向上下左右,斜的方向 char left(int x, int y) {//检查是否合适 if (x >= 1 &&a

  • 基于C++实现五子棋AI算法思想

    今天我想要分享一下我做五子棋AI的思路.因为在做这个之前,我没有接触过任何像这种类似的东西.通过这一次,我也算是有所了解,我的思路也是来自很多网络上的博客,看了很多,最终总结出了自己的这样一个. 那我的五子棋是15*15的大小(一般也就是这样的一个大小).我的AI算法要求每一次落子之后都要去计算每一个空暇的位置的"分值",简单的说,我们需要一个存放棋子的数组,表示是否存放了棋子,还要一个计算每一个空格的数组来记录"分数",这个分数是后期AI用来运算的基础,也是你AI

  • C++实现简单五子棋游戏

    五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜. 规则 (1)对局双方各执一色棋子. (2)空棋盘开局. (3)黑先.白后,交替下子,每次只能下一子. (4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处. (5)黑方的第一枚棋子可下在棋盘任意交叉点上. (6)轮流下子是双方的权利,但允许任何一方放弃下子权(即:PASS权)

  • C++实现简易的五子棋游戏

    本文实例为大家分享了C++实现简易五子棋游戏的具体代码,供大家参考,具体内容如下 //用c++实现五子棋 #include <iostream> #include <cstdlib> #include "getch.h" using namespace std; enum Role{RED=99,BLUE}; class Gobang {     char board[15][15];     int key_x,key_y;     Role role; pu

  • C++简单五子棋的AI设计实现

    本文实例为大家分享了C++五子棋的AI设计实现代码,供大家参考,具体内容如下 设计思路:通过接口获取信息来确定颜色,通过set_chess函数来确定落点. 对每个点位给出两种颜色棋子的打分,分别存在两个15*15的数组里,数组下标代表点的位置. 确定最大值所在数组之后,遍历该数组找出所有最大值对应的位置,然后对这些位置统计另一种颜色的棋子的分数,再选取一次最大值,从而确定要落点的位置. 打分函数的设计:在四个方向分别统计然后相加.对于某一个方向的分数统计,则分为正反两个方向进行,统计的时候如果有

  • 使用C++ MFC编写一个简单的五子棋游戏程序

    MFC简介: MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数. MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll.xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的

  • C++实现简易五子棋游戏

    C++实现的简易五子棋游戏,供大家参考,具体内容如下 三个函数: void menu():                    //菜单 int fun1(char a[21][43]):   //白旗 int fun2(char a[21][43]):   //黑棋 通过二维数组来实现棋盘与棋子. 构建棋盘: 直接通过一个二维字符数组来实现棋盘,只需cout即可.比较直观,但判断条件时过于繁杂.也可以使用二维整型数组,通过不同的整数来表示不同的字符,简化判断.cout时只需根据数组元素的类型

随机推荐