C++实现五子棋游戏(注释版)
短信预约 -IT技能 免费直播动态提醒
本文实例为大家分享了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