之前写了一个C++ 的控制台扫雷小游戏,但由于过度使用system("cls")刷屏,导致闪屏,因此重写了一个改善的不闪屏版本,并把逻辑重新捋了一遍。
map.h
#ifndef MAP_H_
#define MAP_H_
#define MAX_WID 18
#define MAX_LEN 32
#define UP_EDGE 1 //上边界
#define LEFT_EDGE 1 //左边界
#define RIGHT_EDGE _len //右边界
#define DOWN_EDGE _wid //下边界
struct Position { //用于表示位置
short x;
short y;
};
struct MapInfo { //表示扫雷图的信息
int n; //-1表示地雷,0表示空格,1~8表示雷数
bool flag; //是否已经被打开
};
void gotoxy(short, short); //光标移动函数
class Map {
private:
int _len, _wid; //图的长宽
int _mines, _blanks; //雷数和空格数
Position pos; //光标位置
MapInfo data[MAX_WID][MAX_LEN]; //地图
public:
void ChooseMode(); //选择游戏模式,初级,中级,高级
void Draw(); //画出地图
void InitMap(); //初始化地图信息
void SetMine(); //设置地雷
void SetNum(); //根据周围地雷数计算数字
void Move(); //负责移动
void OpenBlock(); //打开方块
void OpenAll(); //如果触雷则全部打开
void Play(); //提供游戏操作接口
bool IfWin(); //判断输赢
bool IfLose();
// void show();
};
#endif
map类的实现
map.cpp
#include "map.h"
#include
#include
#include //提供随机函数,rand(), srand()
#include //提供time()函数
#include //提供不回显的输入函数getch()
#include //提供system()内命令
#define GOTOXY( pos ) gotoxy( 2 * (pos).x - 1, (pos).y - 1 )
#define POSITION_POS _wid+1 //游戏信息的位置,这里是位置信息
#define POSITION_BLANKS _wid+2 //空格数位置
#define POSITION_TIMES _wid+3 //时间显示位置
#define POSITION_SITUATION _wid+4 //输赢状态位置
using std::cin;
using std::cout;
void gotoxy(short x, short y) { //自行百度
COORD pos = { x, y };
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut, pos);
}
void Map::ChooseMode() {