1.游戏规则
通过鼠标单击即可挖开方块。如果第一个挖开的是地雷,那你就输掉游戏了,如果不是雷,恭喜,再进行第二次冒险,出现的数字表示在其周围的八个方块中共有多少颗地雷。
2.设计思路
游戏的声明放入game.h文件中,游戏的定义放在game.c文件中
选用do while循环使得游戏进入再提供给玩家选择(menu)
void Test() { //玩游戏 int input = 0; srand((unsigned int)time(NULL));//设置随机数的起点(用于雷的放置) do { menu(); printf("请选择:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新输入!\n"); break; } } while (input); }
游戏菜单供玩家选择(之后用switch case语句处理请求并作出相应的响应)
void menu() { printf("****************\n"); printf("**** 1.play ****\n"); printf("**** 0.exit ****\n"); printf("****************\n"); }
进入游戏game
雷盘的设置:一个用来存放雷的信息mine,一个用来显示排查出的雷的个数show(后期会合并),首先要挖开方块,并且排查周围八个方块中雷的个数,所以9×9雷盘应在外围加辅助雷盘为11×11。
game.h
#define ROW 9//真正打印 #define COL 9 #define ROWS ROW+2//外围做辅助 #define COLS COL+2
test.c
char mine[ROWS][COLS] = { 0 };//雷的信息(不打印) char show[ROWS][COLS] = { 0 };//显示排查出的雷的个数(打印)
雷盘的初始化:
test.c
一个函数初始化两个内容不同的数组,可将不同的内容也作为参数传入。
InitBoard(mine, ROWS, COLS,'0');//初始化为不同内容时可多传一个参数 InitBoard(show, ROWS, COLS,'*');
game.h
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set);
game.c
void InitBoard(char board[ROWS][COLS], int rows, int cols, char set) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { board[i][j] = set; } } }
雷盘的打印
test.c
实则打印9×9,传参为ROW,COL,但是接收show数组依旧是ROWS COLS
Display(show, ROW, COL);
game.h
void Display(char board[ROWS][COLS], int row, int col);
game.c
void Display(char board[ROWS][COLS], int row, int col) { for (int i = 0; i <= col; i++)//行标 { printf("%d ", i); } printf("\n"); for (int i = 1; i <= row; i++) { printf("%d ", i);//列标 for (int j = 1; j <= col; j++) { printf("%c ", board[i][j]); } printf("\n"); } printf("\n"); }
雷的布置
test.c
SetMine(mine, ROW, COL);
game.h
#define EASY_COUNT 80//雷的个数 void SetMine(char board[ROWS][COLS], int row, int col);
game.c
有雷放字符‘1’
一个数取余9,余数范围0到8
void SetMine(char board[ROWS][COLS], int row, int col) { int count = EASY_COUNT; //布置成功一个count-1(有可能布置失败) while (count) { int x = rand() % row + 1; int y = rand() % col + 1; if (board[x][y] == '0') { board[x][y] = '1'; count--; } } }
雷的排查
test.c
FindMine(mine, show, ROW, COL);
game.h
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c
字符之间做减法(利用ASCII值计算),返回整数。
int GetMineCount(char board[ROWS][COLS], int x, int y) { //访问周围一圈的八个坐标 return board[x - 1][y] + board[x - 1][y - 1] + board[x][y - 1] + board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1] + board[x][y + 1] + board[x - 1][y + 1] - 8 * '0'; } void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) { int x = 0; int y = 0; int win = 0;//检查是否排完 while (win<row*col-EASY_COUNT) { printf("请输入排查的坐标:"); scanf("%d%d", &x, &y); if (x >= 1 && x <= row&&y >= 1 && y <= col) { if (mine[x][y] == '1') { printf("很遗憾,你被炸死了!\n"); Display(mine, row, col); break; } else//看周围的雷数 { int count = GetMineCount(mine, x, y); show[x][y] = count + '0'; Display(show, row, col); win++; } } else { printf("坐标非法,请重新输入!\n"); } } if (win == row*col - EASY_COUNT) { printf("排雷成功!\n"); Display(mine, row, col); } }
发表评论 取消回复