C++新手的代码,请各位多包涵。

用C++写的一个简单的控制台版扫雷游戏。玩家通过输入方块的坐标来翻开方块。

只是一个雏形,能够让玩家执行翻开方块的操作并且判断输赢,还未添加标记方块、游戏菜单、记录游戏时间、重新开一局等等的功能。

玩家输入坐标的方式来翻开方块只适用于小型的“雷区”,若“雷区”大了,用坐标会变得很不方便。

代码片段扫雷V1.1

#include

#include

#define YELLOW FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY

#define CYAN FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY

#define ORANGE FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY

#define PURPLE FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY

using namespace std;

const int STARTX = 30;

const int STARTY = 6;

const int MAXX = 9;//雷区的宽

const int MAXY = 9;//雷区的高

const int BOMBNUMBER = 10;//地雷数量

class Cube{

private:

bool ifHaveBomb;//该方块是否含有炸弹

bool ifOpen;//该方块有无被玩家翻开

int nearBombNumber;//该区块周围8格的含有炸弹的方块的数量

public:

void setOpen() {

//将Open的值改为true

ifOpen = true;

}

bool getOpen() {

//获取ifOpen的值

return ifOpen;

}

void setNearBombNumber(int number) {

//给nearBombNumber赋值

nearBombNumber = number;

}

void haveBomb() {

//给方块放置地雷

ifHaveBomb = true;

}

bool getIfHaveBomb() {

//获取ifHaveBomb的值

return ifHaveBomb;

}

int getNearBombNumber() {

//获取nearBombNumber的值

return nearBombNumber;

}

void resetCube(bool ifhavebomb = false,bool ifopen = false,int nearbombnumber = 0){

//初始化成员数据

ifHaveBomb = ifhavebomb;

ifOpen = ifopen;

nearBombNumber = nearbombnumber;

}

};

Cube cube[MAXX][MAXY];

void GoTo(int x,int y);//定位光标

void setBomb(int bombNumber);//生成bombNumber个炸弹并且放进随机的方块中

void show();//显示地雷阵

int checkAndSetNearBombNumber(int x,int y);//检查当前方块周围的雷数量

void gameStart();//初始化游戏

void showXY();//显示雷区坐标

bool player(bool &life);//玩家输入坐标翻开方块

void message(bool life);//玩家游戏结束后输出的信息

void autoOpen(int x,int y);//玩家翻开的方块为不含雷且周围无雷的方块时,自动翻开周围无雷的方块

bool ifWin();//判断玩家是否扫雷成功

void showBomb();//游戏结束后显示地雷位置

int main() {

gameStart();

show();

bool life = true,win = true;

while (player(life) && !ifWin()) {

}

message(life && ifWin());

return 0;

}

void GoTo(int x,int y) {

//定位光标

COORD coord = { x,y };

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);

}

void setBomb(int bombNumber = BOMBNUMBER) {

//生成bombNumber个炸弹并且放进随机的方块中

srand((unsigned)GetCurrentTime());

while (bombNumber--) {

int x = MAXX + 1,y = MAXY + 1;

while ((x >= MAXX || y >= MAXY) || cube[x][y].getIfHaveBomb() == true) {

x = rand() % MAXX;

y = rand() % MAXY;

}

cube[x][y].haveBomb();

}

}

void show() {

//显示地雷阵

system("cls");

showXY();

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),CYAN);

for (int i = 0;i < MAXY;i++) {

GoTo(STARTX,STARTY + i);

for (int j = 0;j < MAXX;j++) {

if (cube[j][i].getOpen() == true) {

if (cube[j][i].getIfHaveBomb() == false) {

if (cube[j][i].getNearBombNumber() == 0) { //挖开无雷的方块显示该方块周围多少个方块含雷,若为0则显示空格

printf(" ");

} else {

printf(" %d",cube[j][i].getNearBombNumber());

}

} else {

printf("×");//有雷的方块被挖开后显示×

}

} else {

printf("■");//未翻开的方块用■显示

}

}

}

}

void showXY() {

//显示坐标轴

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),CYAN);

GoTo(STARTX - 3,STARTY + MAXY / 2);

printf("Y");

GoTo(STARTX + MAXX,STARTY - 2);

printf("X");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),YELLOW);

for (int i = 0;i < MAXY;i++) {

GoTo(STARTX - 1,STARTY + i);

printf("%d ",i);

}

for (int i = 0;i < 2 * MAXX;i += 2) {

GoTo(STARTX + i + 1,STARTY - 1);

printf("%d ",i / 2);

}

}

int checkAndSetNearBombNumber(int x,int y) {

//检查当前方块周围的雷数量

int num = 0;

if (cube[x][y].getIfHaveBomb() == true) {

//若该方块有地雷,则不用判断它周围有几个雷

return 0;

} else {

//用两个循环当前方块周围8格扫一遍

for (int i = -1; i <= 1; i++) {

for (int j = -1; j <= 1; j++) {

int nx = x + i;

int ny = y + j;

if (!(ny == y && nx == x) && (nx >= 0 && nx <= MAXX - 1) &&

(ny >= 0 && ny <= MAXY - 1)) {

if (cube[nx][ny].getIfHaveBomb()) {

num++;

}

}

}

}

cube[x][y].setNearBombNumber(num);//设置该方块附近的地雷的数量

return 0;

}

}

void gameStart() {

//初始化游戏

for (int i = 0;i < MAXY;i++) {

for (int j = 0;j < MAXX;j++) {

cube[j][i].resetCube();

}

}

setBomb();

for (int i = 0;i < MAXY;i++) {

for (int j = 0;j < MAXX;j++) {

checkAndSetNearBombNumber(j,i);

}

}

}

bool player(bool &life) {

//玩家输入坐标翻开方块

int x,y;

GoTo(STARTX - 3,STARTY + MAXY + 1);

printf("请输入坐标(x,y),x和y用空格隔开");

GoTo(STARTX + MAXX / 2,STARTY + MAXY + 2);

scanf("%d%d",&x,&y);

if ((x < 0) || (x > MAXX - 1) || (y < 0) || (y > MAXY - 1)) {

//当玩家输入的坐标超出范围时

show();

GoTo(STARTX - 3,STARTY + MAXY + 3);

printf("该坐标不存在,请重新输入坐标");

GoTo(STARTX + MAXX / 2,STARTY + MAXY + 2);

} else if (cube[x][y].getIfHaveBomb() == true) {

//当玩家翻开的方块有地雷时

cube[x][y].setOpen();

show();

life = false;

return false;

} else if (cube[x][y].getOpen() == false) {

//当玩家翻开的方块无雷时

if (cube[x][y].getNearBombNumber() == 0) {

autoOpen(x,y);

cube[x][y].setOpen();

show();

} else {

cube[x][y].setOpen();

show();

}

} else if (cube[x][y].getOpen() == true) {

//当玩家输入已翻开方块的坐标时

show();

GoTo(STARTX,STARTY + MAXY + 3);

printf("该方块已被挖开,请再次输入坐标");

GoTo(STARTX + MAXX / 2,STARTY + MAXY + 2);

}

ifWin();

return true;

}

void message(bool result) {

if (result == true) {

//玩家胜利时输出的信息

showBomb();

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),YELLOW);

GoTo(STARTX - 1,STARTY + MAXY + 1);

printf("祝贺你,你胜利了!");

GoTo(STARTX,STARTY + MAXY + 2);

} else {

//玩家失败时输出的信息

showBomb();

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),PURPLE);

GoTo(STARTX - 1,STARTY + MAXY + 1);

printf("××你踩中地雷了××");

GoTo(STARTX,STARTY + MAXY + 2);

}

}

void autoOpen(int x,int y) {

//玩家翻开的方块为不含雷且周围无雷的方块时,自动翻开周围无雷的方块

for (int i = -1; i <= 1; i++) {

for (int j = -1; j <= 1; j++) {

int nx = x + i;

int ny = y + j;

if (!(ny == y && nx == x) && (nx >= 0 && nx <= MAXX - 1) &&

(ny >= 0 && ny <= MAXY - 1) && cube[nx][ny].getOpen() == false) {

if (cube[nx][ny].getNearBombNumber() == 0) {

cube[nx][ny].setOpen();

autoOpen(nx,ny);

} else {

cube[nx][ny].setOpen();

}

}

}

}

}

bool ifWin() {

//判断玩家是否扫雷成功达到游戏结束条件

int num = 0;

for (int i = 0;i < MAXX;i++) {

for (int j = 0;j < MAXY;j++) {

if (cube[j][i].getOpen() == false) {

num++;

}

}

}

if (num == BOMBNUMBER) {

return true;

} else {

return false;

}

}

void showBomb() {

//游戏结束后显示地雷位置

for (int i = 0;i < MAXY;i++) {

for (int j = 0;j < MAXX;j++) {

if (cube[j][i].getIfHaveBomb() == true) {

cube[j][i].setOpen();

}

}

}

show();

}

效果图:

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

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

简易扫雷游戏c语言程序,C++实现简单的扫雷游戏(控制台版)相关推荐

  1. C语言如何做手机游戏,C语言怎样实现一个简单的手机游戏小项目

    手机游戏名称:猜数字 使用的开发语言:C语言 基本规则:电脑随机生成一个1-30之间的数字,人和电脑分别猜一个数字,看谁的数字较为接近生成的数字. 要求:每个人和计算机10,000点,玩家进入多少分, ...

  2. 在c语言中pwm的作用,PWM调速的C语言程序编写(非常简单);

    <PWM调速的C语言程序编写(非常简单);>由会员分享,可在线阅读,更多相关<PWM调速的C语言程序编写(非常简单);(4页珍藏版)>请在人人文库网上搜索. 1.PWM调速的C ...

  3. 算24游戏c语言程序报告,c程序课程设计报告(24点游戏).doc

    c程序课程设计报告(24点游戏) 课程设计报告 课程名称: C语言程序设计 课题名称: 二十四点速算王游戏 专 业: 通信工程专业 班 级: 12级通信工程1班 学 号: 2012167144 姓 名 ...

  4. c语言迷宫游戏课程设计,迷宫游戏c语言程序课程设计.docx

    迷宫游戏 /*乌云老师的话:学习检测键盘信息之后,余文彪同学当堂就作岀了通过键盘在屏幕上下左右移动一 个星星的程序. 老师给几位同学大略说了一下迷宫游戏的实现思路,彭搏同学下次课就把做好的迷宫游戏 拿 ...

  5. 学C的第一天(初识C语言、VS创建C语言程序、数据类型简单了解、简单了解变量)

    =========================================================================  相关代码gitee自取:C语言学习日记: 加油努力 ...

  6. 200个c语言程序(由简单到复杂),200个c语言程序(由简单到复杂)

    200个C语言程序(由简单到复杂)从简单到难的200来个经典C程序csdn上的不过那里要资源分,自己下了下来,放到论坛里.有需要的童鞋可以下载学习学习.第一部分 基础篇 001 第一个C程序 002 ...

  7. c 语言掷骰子游戏,C 语言编程学习: 制作掷骰子小游戏

    C 语言编程学习: 制作掷骰子小游戏 问题描述 骰子是一个有六个面的正方体, 每个面分别印有 16 之间的小圆点代表点数. 假设这个游戏的规则是: 两个人轮流掷骰子 6 次, 并将每次投掷的点数累加起 ...

  8. 做游戏,学编程(C语言) 2 最简单的飞机游戏

    这一次,在前面弹跳小球的基础上,实现一个简单的飞机游戏的雏形,主要包括:飞机显示.控制移动.发射子弹.击中敌机等功能.需要的语法基础知识和弹跳小球一样:printf.scanf.if-else.for ...

  9. 完整简单c语言程序代码,一些简单的C语言程序代码.docx

    一些简单的C语言程序代码 由键盘任意输入1个4位数整数,分别输出其中的个位.十位.百位.千位./* expe 3-10 */#include #include void main(void){ int ...

最新文章

  1. ThreadPoolExecutor的七个参数详解
  2. 阿里开源:思考,演进和发展
  3. springMVC接收前端参数的方式
  4. 阿里前CEO卫哲的万字长文:被马云骂醒,看透B2B 10大核心问题!
  5. Spring中Bean的作用域都有哪些?
  6. [信息收集] HCOMP 2010概况及收录论文
  7. HTML5和CSS3系列(四):常见样式、背景、Web字体、2D转换、过渡
  8. 通信原理-数字基带传输
  9. 不同坐标系下角速度_惯性技术常用坐标系
  10. Java实现第九届蓝桥杯第几个幸运数字
  11. 技嘉的UEFI修复windows与Ubuntu双系统引导+老毛桃修复引导失败+No EFI system partition was found.
  12. Android API与系统版本的关系
  13. 用vba创建图表分析上市公司财报
  14. 一拍是多少秒 计算机制音乐,E哥谈如何计算音乐的拍数及每拍时值是多少数学好学音乐有帮助吗...
  15. 笔记:echarts 标题(title)设置
  16. 【附源码】计算机毕业设计java志愿者招募系统设计与实现
  17. 小偷php杰奇小说源码_杰奇小说系统 v1.8
  18. phpstorm 2021 最新版 官方中文教程
  19. MOSFET选型注意事项及应用实例
  20. 求一个矩阵的鞍点(即在行上最小而在列上最大的值)(C++编写)(循环与递归)

热门文章

  1. win10下CH340模块下载stc89c52程序
  2. 第9章 开发实例-文件保险箱
  3. DSPACE的道路报错问题
  4. 平民程序 - linghuye's blog
  5. 计算机导论胡致杰,计算机导论 胡致杰 主编
  6. 阿里云地域与可用区的核心概念(二)
  7. vue全局使用自定义字体
  8. Android富文本编辑器(二)
  9. 木马病毒 勒索病毒解决办法链接
  10. 跑分cpu_【新机】A14芯片最新跑分成绩曝光:3GHz主频,CPU/GPU提升20%丨特斯拉又双叒降价了...