用c语言实现一个扫雷程序,有挑战性的主要有两部分内容:游戏的逻辑,空白区域的炸开算法
1.游戏核心逻辑
观察Windwos的扫雷游戏,可以知道,一个格子有两种类型的状态需要描述,一种类型是这个格子是否有雷,另外一种状态是格子的绘制状态,这个类型就多了,格子上可能显示未知,数字,空白,旗帜,疑问,雷,一共是6种类型。
2.空白区域炸开算法
关于空白区域的炸开,至于炸到什么程度为止,通过观察Windows的扫雷游戏,我们也可以知道,要炸到这个格子显示数字为止,对此可以使用递归算法求解问题。
1.游戏核心逻辑
观察Windwos的扫雷游戏,可以知道,一个格子有两种类型的状态需要描述,一种类型是这个格子是否有雷,另外一种状态是格子的绘制状态,这个类型就多了,格子上可能显示未知,数字,空白,旗帜,疑问,雷,一共是6种类型。
2.空白区域炸开算法
关于空白区域的炸开,至于炸到什么程度为止,通过观察Windows的扫雷游戏,我们也可以知道,要炸到这个格子显示数字为止,对此可以使用递归算法求解问题。
3.代码实现
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include <memory.h>
enum gridState {UNKNOWN,NUMBER,BLANK,FLAG,DOUBT,MINE};
enum mineState {NOMINE, HASMINE };
typedef struct Table_{
int rows;
int columns;
int digNum;
int mineNum;
double timePassed;
int** mines;
int** state;
}GameTable;
char scanf_char();
int choisirNombreAleatoire(int Max);
int** AllouerMatrice(int n, int p);
int LibererMatrice(int **tab, int n);
int InitialiserMatrice(int **tab, int n, int p, int valeur);
void initGame(GameTable* tab);
int runGame(GameTable* tab);
void printGame(GameTable* tab);
void deleteGame(GameTable* tab);
void initMines(int** tab, int n, int p, int mineNum);
int getMines(GameTable* tab , int r, int c);
void blank(GameTable* tab, int r, int c);
int changeState(GameTable* tab, int r, int c, int flag);
void printMine(GameTable* tab);
int main() {
//init the rows, columns, mines
srand(time(NULL));
GameTable tabs;
initGame(&tabs);
//run game
int flag = 1;
while (flag) {
flag = runGame(&tabs);
}
if (tabs.digNum == tabs.mineNum)
printf("you win the game\n");
else
printf("you lost the game\n");
//free memory
deleteGame(&tabs);
return 0;
}
//==========================================================================================
void initGame(GameTable* tab)
{
printf("pl