//说明: 左键双击对应windows自带扫雷中的双键点击
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <list>
#include <cstdio>
using namespace std;
//数组索引转成坐标
#define X(v) (v) % WIDTH
#define Y(v) (v) / WIDTH
//坐标系统转换
#define BOARDX(x) ((x) - OFFSETX) / 2
#define BOARDY(y) (y) - OFFSETY
#define SCREENX(x) 2 * (x) + OFFSETX
#define SCREENY(y) (y) + OFFSETY
#define BACKGROUND_WHITE (BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED)
#define FOREGROUND_WHITE (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED)
typedef enum {
UNKNOWN,
DISPLAY,
MARKED
} State;
typedef enum {
NUMBER,
EMPTY,
MINE
} MType;
typedef struct {
State state;
MType mtype;
int val;
} Cell;
typedef bool (* CmpProc)(Cell& cell, void* pData);
int HEIGHT = 16;
int WIDTH = 16;
int MINE_CNT = 40; //地雷数
int CELL_CNT;
//第一个格子的x, y偏移
int OFFSETX = 3;
int OFFSETY = 3;
int flagCnt; //标记数
int mineLeft; //地雷剩余
int unkwLeft; //未知剩余
int liveLeft; //生命剩余
COORD tmPos; //计时坐标
COORD mnPos; //地雷(剩余)坐标
COORD lvPos; //生命坐标
bool bGameStart, bGameStop; //游戏开始.结束标记
DWORD dwStart;
HANDLE hOut, hIn;
Cell cells[16][30];
void writeChar(LPCSTR pChar, COORD wrtCrd)
{
DWORD wtn;
WriteConsoleOutputCharacter(hOut, pChar, strlen(pChar), wrtCrd, &wtn);
}
void fillChar(TCHAR cChar, DWORD len, COORD wrtCrd)
{
DWORD wtn;
FillConsoleOutputCharacter(hOut, cChar, len, wrtCrd, &wtn);
}
void fillAttr(WORD attr, DWORD len, COORD wrtCrd)
{
DWORD wtn;
FillConsoleOutputAttribute(hOut, attr, len, wrtCrd, &wtn);
}
bool isCell(int x, int y)
{
return x >= 0 && x < WIDTH && y >= 0 && y < HEIGHT;
}
bool isMine(int x, int y)
{
return isCell(x, y) && cells[y][x].mtype == MINE;
}
bool cmpState(Cell& cell, void* pData)
{
return cell.state == *(State*)pData;
}
bool cmpMtype(Cell& cell, void* pData)
{
return cell.mtype == *(MType*)pData;
}
//四周格子作比较
int aroundCmp(int x, int y, CmpProc cmp, void* pData)
{
int nRet = 0;
for (int y0=y-1; y0<=y+1; y0++)
{
for (int x0=x-1; x0<=x+1; x0++)
{
if (isCell(x0, y0)
&& !(x0 == x && y0 == y)) //not self
{
nRet += cmp(cells[y0][x0], pData);
}
}
}
return nRet;
}
int aroundMines(int x, int y)
{
int val = MINE;
return aroundCmp(x, y, cmpMtype, &val);
}
int aroundMarks(int x, int y)
{
int val = MARKED;
return aroundCmp(x, y, cmpState, &val);
}
//扰乱数组的前n个元素
void ruffle(int* arr, int len, int n)
{
for (int i=0; i<n; i++)
{
int j = rand() % len;
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
//计时
void setElapsedTime()
{
if (bGameStart && !bGameStop)
{
DWORD dwDelt = (GetTickCount() - dwStart) / 1000;
if (dwDelt < 1000)
{
char buf[5] = {0};
sprintf(buf, "%.3d\0", dwDelt);
writeChar(buf, tmPos);
}
}
}
//剩余雷数(仅显示, 非实际)
void setMinesLeft()
{
char buf[5] = {0};
sprintf(buf, "%2d\0", MINE_CNT - flagCnt);
writeChar(buf, mnPos);
}
//剩余生命
void setLivesLeft(int delt = 0)
{
char buf[5] = {0};
liveLeft += delt;
sprintf(buf, "%2d\0", liveLeft);
writeChar(buf, lvPos);
}
void drawCell(int x, int y)
{
Cell* pCell = &cells[y][x];
COORD cellCrd = {SCREENX(x), SCREENY(y)};
char buf[3] = {0};
switch (pCell->state)
{
case UNKNOWN:
sprintf(buf, "□\0");
break;
case MARKED:
sprintf(buf, " P\0");
break;
case DISPLAY:
switch (pCell->mtype)
{
case MINE:
sprintf(buf, " *\0");
break;
case EMPTY:
sprintf(buf, " \0");
break;
case NUMBER:
sprintf(buf, " %d\0", pCell->val);
fillAttr((WORD)pCell->val, 2, cellCrd); //数字着色
break;
}
break;
}
writeChar(buf, cellCrd);
}
//初始化信息栏
void initInfoBar()
{
char buf[50] = {0};
sprintf(buf, "生命: %2d 地雷: %2d 用时: 000\0", liveLeft, MINE_CNT);
COORD crd = {(80 - strlen(buf)) / 2, SCREENY(HEIGHT) + 1}; //水平居中
writeChar(buf, crd);
crd.X += 6; lvPos = crd;
crd.X += 11; mnPos = crd;
crd.X += 11; tmPos = crd;
}
void clearScreen()
{
COORD crd = {0, 0};
CONSOLE_SCREEN_BUFFER_INFO csbi;
GetConsoleScreenBufferInfo(hOut, &csbi);
fillChar(' ', csbi.dwSize.X * csbi.dwSize.Y, crd);
fillAttr(FOREGROUND_WHITE, csbi.dwSize.X * csbi.dwSize.Y, crd);
}
void initGame()
{
srand((unsigned)time(NULL));
SetConsoleTitle("扫雷控制台版 F2: 初级; F3: 中级; F4: 高级");
clearScreen();
CELL_CNT = HEIGHT * WIDTH;
OFFSETX = (80 - WIDTH * 2) / 2; //水平居中
int* idxs = new int[CELL_CNT]; //地雷索引
int i, x, y;
//init cells and indexs
for (i=0; i<CELL_CNT; i++)
{
cells[Y(i)][X(i)].mtype = EMPTY;
cells[Y(i)][X(i)].state = UNKNOWN;
idxs[i] = i;
}
ruffle(idxs, CELL_CNT, MINE_CNT);
//fill mines
for (i=0; i<MINE_CNT; i++)
{
cells[Y(idxs[i])][X(idxs[i])].mtype = MINE;
}
//fill nums && print the game
for (y=0; y<HEIGHT; y++)
{
for (x=0; x<WIDTH; x++)
{
if (!isMine(x, y))
{
cells[y][x].val = aroundMines(x, y);
cells[y][x].mtype = cells[y][x].val > 0 ? NUMBER : EMPTY;
}
drawCell(x, y);
}
}
delete[] idxs;
bGameStart = false;
bGameStop = false;
mineLeft = MINE_CNT;
unkwLeft = CELL_CNT;
liveLeft = MINE_CNT / 20 + 1; //每二十个雷加一条命
flagCnt = 0;
initInfoBar();
}
void showAll()
{
for (int i=0; i<CELL_CNT; i++)
{
cells[Y(i)][X(i)].state = DISPLAY;
drawCell(X(i), Y(i));
}
}
void showTip(const char* tipMsg, WORD attr = FOREGROUND_WHITE)
{
COORD tipCrd = {(80 - strlen(tipMsg)) / 2, 1};
writeChar(tipMsg, tipCrd);
fillAttr(attr, strlen(tipMsg), tipCrd);
}
void gameWin()
{
if (!bGameStop)
{
showTip("恭喜你, 你赢了! ", FOREGROUND_GREEN | FOREGROUND_INTENSITY);
bGameStop = true;
}
}
void gameOver(int x, int y)
{
setLivesLeft(-1);
if (liveLeft == 0)
{
showAll();
showTip("游戏结束, 请重新来过!", FOREGROUND_RED | FOREGROUND_INTENSITY);
bGameStop = true;
}
else
{
COORD crd = {SCREENX(x), SCREENY(y)};
WORD attr = FOREGROUND_WHITE;
for (int i=0; i<6; i++) //触雷闪烁
{
attr = FOREGROUND_WHITE ^ FOREGROUND_RED ^ attr;
fillAttr(attr, 2, crd);
Sleep(100);
}
}
}
void showAround(int x, int y)
{
list<COORD> lst;
COORD crd = {x, y};
lst.push_back(crd);
while (!lst.empty())
{
crd = lst.front();
lst.pop_front();
x = crd.X;
y = crd.Y;
for (int x0=x-1; x0<=x+1; x0++)
{
for (int y0=y-1; y0<=y+1; y0++)
{
if (!isCell(x0, y0) || (x0 == x && y0 == y))
{
continue;
}
Cell* pCell = &cells[y0][x0];
if (pCell->state == UNKNOWN)
{
if (pCell->mtype == MINE)
{
gameOver(x0, y0);
break;
没有合适的资源?快使用搜索试试~ 我知道了~
Dev-C++ 6.0(更名为Smart-C++ 1.2.5.174)
共1593个文件
h:706个
hpp:245个
a:194个
5星 · 超过95%的资源 需积分: 45 1.2k 下载量 7 浏览量
2014-03-05
22:55:53
上传
评论 11
收藏 23.18MB 7Z 举报
温馨提示
在Dev-C++ 5.3.0.2的基础上,针对程序设计竞赛大改。我实在不忍这么好的东西不为人用,于是斗胆违背了软件作者SXKDZ的意愿,将其公开了。
资源推荐
资源详情
资源评论
收起资源包目录
Dev-C++ 6.0(更名为Smart-C++ 1.2.5.174) (1593个子文件)
libbfd.a 4.77MB
libstdc++.a 3.33MB
libgcc.a 3.05MB
libstdc++.a 2.65MB
libstdc++.dll.a 2.63MB
libstdc++.dll.a 2.56MB
libkernel32.a 977KB
libopcodes.a 927KB
libiberty.a 821KB
libquadmath.a 763KB
libntdll.a 749KB
libmsvcr90d.a 556KB
libmsvcr100d.a 556KB
libmsvcr100.a 555KB
libmsvcr80d.a 555KB
libmsvcr80.a 554KB
libmsvcr90.a 554KB
libmsvcr71d.a 540KB
libmsvcr71.a 539KB
libmsvcr70d.a 538KB
libmsvcr70.a 537KB
libmsvcrtd.a 533KB
libmsvcrt.a 532KB
libntoskrnl.a 531KB
libgdiplus.a 482KB
libuser32.a 467KB
libadvapi32.a 402KB
libcrtdll.a 354KB
libsetupapi.a 353KB
libmingwex.a 317KB
librpcrt4.a 272KB
libopengl32.a 263KB
liboleaut32.a 256KB
libsupc++.a 253KB
libgdi32.a 252KB
libshlwapi.a 214KB
libd3dx9d.a 206KB
libdxerr9.a 190KB
libole32.a 188KB
libnetapi32.a 184KB
libwininet.a 182KB
libwldap32.a 178KB
libd3dx8d.a 159KB
libdxerr8.a 157KB
libwin32k.a 146KB
libwinmm.a 141KB
libshell32.a 140KB
libodbc32.a 134KB
libndis.a 132KB
libws2_32.a 124KB
libglaux.a 123KB
libmapi32.a 118KB
librasapi32.a 110KB
libwinspool.a 97KB
libvfw32.a 96KB
libmprapi.a 94KB
libpthreadGCE2.dll.a 91KB
libpthread.a 91KB
libpthreadGC2.dll.a 91KB
libpthread.dll.a 91KB
libvideoprt.a 87KB
libgomp.dll.a 86KB
libtapi32.a 85KB
libcomctl32.a 84KB
libimagehlp.a 84KB
libgomp.a 84KB
libmoldname100d.a 81KB
libmoldname71d.a 81KB
libmoldname70d.a 81KB
libmoldname80d.a 81KB
libmoldname100.a 81KB
libmoldname90d.a 81KB
libmoldname70.a 81KB
libmoldname90.a 81KB
libmoldname80.a 81KB
libmoldname71.a 81KB
libmoldnamed.a 81KB
libmoldname.a 81KB
libsecur32.a 79KB
libcoldname.a 79KB
libstrmiids.a 79KB
libgcc_s.a 75KB
libpenwin32.a 74KB
libcfgmgr32.a 61KB
librapi.a 60KB
libimm32.a 57KB
libavifil32.a 55KB
liblto_plugin.dll.a 54KB
libmpr.a 54KB
libwsock32.a 53KB
libquadmath.dll.a 53KB
libdxguid.a 50KB
libthunk32.a 48KB
librpcns4.a 45KB
libuuid.a 44KB
libmscms.a 42KB
libolecli32.a 41KB
libodbccp32.a 40KB
libgcc_eh.a 40KB
librtutils.a 40KB
共 1593 条
- 1
- 2
- 3
- 4
- 5
- 6
- 16
SukerZ
- 粉丝: 2
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- main.c
- Unity 创建快捷方式自动启动
- 一分钟一条原创视频,蹭热点撸收益,条条爆款,狂撸各大平台,轻松日入1000+-教程网盘链接提取码下载 .txt
- 51单片机实现万年历,包括闹钟的设置与秒表功能(汇编)
- STM32单片机FPGA毕设电路原理论文报告铁合金电炉单片机电力监控系统的研究
- STM32单片机FPGA毕设电路原理论文报告贴片元件封装机的智能控制系统设计
- STM32单片机FPGA毕设电路原理论文报告体育高考投篮自动测试系统的设计与实现
- STM32单片机FPGA毕设电路原理论文报告提高放疗精度的单片机控制方法
- C++ matplot学习及demo实操
- STM32单片机FPGA毕设电路原理论文报告提高单晶炉加热电源控制电路精度的研究
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页