今天写的是游戏过程的函数,基本的算法前面都解释过了,今天是实现基本的功能
补充一下前面需要用到的头文件
#include<conio.h> //_kbhit() #include<stdlib.h> //rand(),srand() #include<time.h> //srand((unsigned)time(NULL))
游戏的过程就是鼠标的操作过程,实现的就是鼠标的点击处理,因为不是WinAPI的按钮点击,所以得自己算坐标得到鼠标动作
void MouseGetXY(void) { m = GetMouseMsg(); MouseX = m.x; MouseY = m.y; }
m是鼠标的结构体,前面有定义过,具体结构查看前面或EasyX帮助
然后实现的就是鼠标操作游戏过程
void GamePlay(void)/*游戏过程*/ { int i, j, Num = 0;/*Num用来接收统计函数返回一个格子周围有多少地雷*/ for (i = 0; i < 10; i++) for (j = 0; j<10; j++) Mine[i][j].roundnum = MineStatistics(i, j);/*统计每个格子周围有多少地雷*/ while (!_kbhit()) { m = GetMouseMsg(); switch (m.uMsg) { case WM_LBUTTONDOWN: { MouseGetXY(); if (MouseX>90 && MouseX<110 && MouseY>5 && MouseY<25)/*重新来*/ { MessageBox(NULL, TEXT("重新开始成功"), TEXT("YES"), MB_OK); AGAIN = 1; return; } if (MouseX>0 && MouseX<200 && MouseY>30 && MouseY < 230)/*当前鼠标位置在格子范围内*/ { j = (MouseX) / 20;/*x坐标*/ i = (MouseY - 30) / 20;/*y坐标*/ if (Mine[i][j].flag == 1)/*如果格子有红旗则左键无效*/ continue; if (Mine[i][j].num != 0)/*如果格子没有处理过*/ { if (Mine[i][j].num == 1)/*鼠标按下的格子是地雷*/ { GameOver();/*游戏失败*/ break; } else/*鼠标按下的格子不是地雷*/ { Num = MineStatistics(i, j); if (Num == 0)/*周围没地雷就用递归算法来显示空白格子*/ ShowWhite(i, j); else/*按下格子周围有地雷*/ { _stprintf_s(randmineNUM, _T("%d"), Num);/*输出当前格子周围的雷数*/ DrawEmpty(i, j, 1, WHITE); setcolor(RED); outtextxy(6 + j * 20, 32 + i * 20, randmineNUM); mineNUM--; } Mine[i][j].num = 0;/*点过的格子周围雷数的数字变为0表示这个格子已经用过*/ if (mineNUM < 1)/*胜利了*/ { GameWin(); break; } } } } } case WM_RBUTTONDOWN: { MouseGetXY(); if (MouseX > 0 && MouseX<200 && MouseY>30 && MouseY < 230)/*当前鼠标位置在格子范围内*/ { j = (MouseX) / 20;/*x坐标*/ i = (MouseY - 30) / 20;/*y坐标*/ //MessageBox(NULL, TEXT("右键测试"), TEXT("YES"), MB_OK); if (Mine[i][j].flag == 0 && Mine[i][j].num != 0)/*本来没红旗现在显示红旗*/ { DrawRedFlag(i, j); Mine[i][j].flag = 1; } else if (Mine[i][j].flag == 1)/*有红旗标志再按右键就红旗消失*/ { DrawEmpty(i, j, 0, LIGHTGRAY); Mine[i][j].flag = 0; } } } } } }
switch case只有两个,鼠标的左键和右键操作
然后就是游戏胜利或者游戏失败的函数,都是比较简单的
void GameOver(void) { int i, j; for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { if (Mine[i][j].num == 1)//显示所有地雷 { DrawEmpty(i, j, 0, WHITE); setfillstyle(BS_SOLID); setfillcolor(RED); fillellipse(3 + j * 20, 33 + i * 20, 17 + j * 20, 47 + i * 20); setbkcolor(WHITE); setcolor(RED); settextstyle(16, 0, _T("宋体")); outtextxy(2, 2, _T("输了请重来")); } } } } void GameWin(void) { setbkcolor(WHITE); setcolor(RED); settextstyle(16, 0, _T("宋体")); outtextxy(2, 2, _T("你赢了")); }
至此这个游戏就算完成了,基本的功能都实现了,大家还可以添加更高级的功能,比如限定雷数,倒计时等,下次放出完整的代码