这个程序实际上还是比较冗长的,体现了我编程上的一些缺点;另外自动展开功能也没有实现,这个以后使用递归可以解决。
#1 源文件
//头文件 supportingGame.h
#include <stdio.h>
#include <malloc.h>
#include <time.h>
#include <stdlib.h>
//一场游戏。需要:1.雷区(int[][]);2.地雷数目(int);3.死亡与否(int)
struct oneGame {//一个问题就是这个二维数组其实是不定的,在创建结构体时又不能进行动态内存分配。
char* mineField = NULL;//退而求其次,不能创建动态分配的二维数组,就创建一个指针。用这个指针指向并且操作二维数组。
int mines = 0;
int deadOrNot = 1;//1表示没死,0表示挂了
char* workDone = NULL;//用于表示已经完成的工作,大小和mineField一致。0代表没有完成,1代表完成。
};
int menu();//欢迎界面和模式选择。返回选择的模式。
//1:初级模式(9*9,10);2.中级模式(16*16,40);3.高级模式(16*30,99)4.自定义模式
//自定义不在menu中进行,而在game()中实现
int game(int);//读入游戏模式,返回是否愿意进行下一个游戏
void generateMineField(int row, int col, int mines, oneGame* thisGame);//读入行列和雷的数目,用于初始化oneGame对象和生成雷区。
//由下列几项功能组成:1.生成雷区的二维数组,提供给oneGame对象;给oneGame.mines赋值(初始化oneGame对象)
//2.随机分配地雷埋藏的位置(x,y)。并且在雷区这个二维数组的相应位置赋值为'#'。generateMine();
//3.根据地雷埋藏的位置,生成数字,用于提示。generateNumber();基本原理是数字检测旁边8个方块的地雷数目。
void generateMine(int row0, int col0, int mines, oneGame* thisGame);//在指定数组生成雷
void generateNumber(int row0, int col0, int mines, oneGame* thisGame);
//int displayMineField();
//展示一个简单的扫雷界面。行列标注(不然数起来麻烦),剩余雷的数目,死亡与否,花费时间,雷区组成。
void displayMineField(oneGame*, int row, int col);//每一次扫雷打印一份界面
//扫一次雷。(对workDone数组中的一个元素加以改变)。并且判断有无死亡或是游戏胜利(游戏结束)。
void sweepFieldOnce(oneGame* thisGame, int row, int col);
//源文件supportingGame.cpp
#include "supportingGame.h"
int menu() {
char mode = 0;
printf("*******************************\n");
printf("****Welcome to MineSweeper!****\n");
printf("*******************************\n");
printf("**Please choose the game mode**\n");
printf("#1.primary######\n");
printf("#2.middle#######\n");
printf("#3.advanced#####\n");
printf("#4.user-defined#\n");
printf("Your choice>: ");
//这个容错机制(%d)只能对数字容错,改为%c之后能对字符容错
while (1) {
scanf("%c", &mode);//这时往往还有字符在缓冲区中,比如\n,会引发一些意想不到的问题。
/*scanf("%*[^\n]%*c");*///这段代码的意思有待探究,但是使用getchar就可以解决缓冲取的问题
while (getchar()!='\n') {
}
switch (mode) {
case '1': printf("primary mode starts!\n"); return 1;
case '2': printf("middle mode starts!\n"); return 2;
case '3': printf("advanced mode starts!\n"); return 3;
case '4': printf("define yourself!\n"); return 4;
default:
printf("Wrong input! Again>: ");
break;
}
}
return -1;
}
int game(int mode) {
oneGame thisGame;
int row = 0;
int col = 0;
int mines = 0;
//游戏生成阶段,