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

本文实例为大家分享了C++实现五子棋游戏的具体代码,供大家参考,具体内容如下
本程序是在vs2015环境下编译运行
vs左上角:文件–新建–项目–Win32控制台应用程序–(注意勾选“附加选项:空项目“)
C++实现五子棋游戏(注释版)
文章图片

C++实现五子棋游戏(注释版)
文章图片

右键头文件”添加–新建项“,类型为 .h 文件,名称分别为”Player.h“以及”ChessBoard.h",即定义“玩家”和“棋盘”两个class
C++实现五子棋游戏(注释版)
文章图片

C++实现五子棋游戏(注释版)
文章图片

然后相同的方式在源文件中右键添加三个.cpp文件
C++实现五子棋游戏(注释版)
文章图片

然后把code copy过去就可以了
另外,代码不是完美的,存在bug,大家可以尝试找一下
相关文档已上传,可自行下载查看

//main.cpp#include#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
//ChessBoard.h#pragma once#includeusing namespace std; #define ROW 15// 棋盘行和列定义常数#define COL 15class ChessBoard//棋盘类{public:char m_cSquare[ROW][COL]; public:ChessBoard(); //构造函数void show(); //棋盘画图显示};

//player.cpp#include"Player.h"bool Player::isInChessBoard(int x, int y){if (x0 && y0)return true; elsereturn 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++; elsecnt = 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 HORIZON0#define VERTICAL1#define LEFTBOTTOMTORIGHTTOP 2#define LEFTTOPTORIGHTBOTTOM 3#include"ChessBoard.h"#includeusing namespace std; #includeclass 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(); /*下子*/};

C++实现五子棋游戏(注释版)
文章图片

【C++实现五子棋游戏(注释版)】以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读