#pragma once #define _CRT_SECURE_NO_WARNINGS 1; #include<stdio.h>
#include<stdlib.h> #include<time.h> #define ROW 9 #define COL 9 #define ROWS
ROW+2 #define COLS COL+2 #define mine_count 3 void initboard(char*, int, char);
void print(char[ROWS][COLS], int, int); void lay_mines(char[ROWS][COLS], int,
int); void clear_mines(char[ROWS][COLS], char[ROWS][COLS], char[ROWS][COLS],
int, int); #include"game.h" void initboard(char* arr, int sz, char set) {
memset(arr, set, sz); } void print(char arr[ROWS][COLS], int row, int col) {
int i = 0; printf("-------扫雷-------\n"); for (i = 0; i <= row; i++) printf("%d
", i); printf("\n"); for (i = 1; i <= row; i++) { int j = 0; printf("%d ", i);
for (j = 1; j <= col; j++) { printf("%c ", arr[i][j]); } printf("\n"); }
printf("-------扫雷-------\n"); } void lay_mines(char arr[ROWS][COLS], int row,
int col) { int i = mine_count; while (i) { int x = rand() % row + 1; int y =
rand() % col + 1; if (arr[x][y] == '0') { arr[x][y] = '1'; i--; } } } void
show_not_mine(char show[ROWS][COLS], char my[ROWS][COLS], int x, int y, int* p,
int row, int col) { if (x >= 1 && x <= row && y >= 1 && y <= col && my[x - 1][y
- 1] + my[x - 1][y] + my[x - 1][y + 1] + my[x][y - 1] + my[x][y + 1] + my[x +
1][y - 1] + my[x + 1][y] + my[x + 1][y + 1] - 8 * '0' + '0' == '0' && my[x][y]
== '0' && show[x][y] == '*') { show[x][y] = ' '; (*p)--; show_not_mine(show,
my, x - 1, y - 1, p, row, col); show_not_mine(show, my, x - 1, y, p, row, col);
show_not_mine(show, my, x - 1, y + 1, p, row, col); show_not_mine(show, my, x,
y - 1, p, row, col); show_not_mine(show, my, x, y + 1, p, row, col);
show_not_mine(show, my, x + 1, y - 1, p, row, col); show_not_mine(show, my, x +
1, y, p, row, col); show_not_mine(show, my, x + 1, y + 1, p, row, col); } if (x
>= 1 && x <= row && y >= 1 && y <= col && my[x][y] == '0' && show[x][y] == '*'
&& my[x - 1][y - 1] + my[x - 1][y] + my[x - 1][y + 1] + my[x][y - 1] + my[x][y
+ 1] + my[x + 1][y - 1] + my[x + 1][y] + my[x + 1][y + 1] - 8 * '0' + '0' !=
'0') { show[x][y] = my[x - 1][y - 1] + my[x - 1][y] + my[x - 1][y + 1] +
my[x][y - 1] + my[x][y + 1] + my[x + 1][y - 1] + my[x + 1][y] + my[x + 1][y +
1] - 8 * '0' + '0'; (*p)--; } } void clear_mines(char show[ROWS][COLS], char
my[ROWS][COLS], char sign[ROWS][COLS], int row, int col) { int i = row*col -
mine_count; int* p = &i; int j = 0; int x = 0; int y = 0; int a = 0; int z =
mine_count; while (1) { if (i == 0) { printf("扫雷成功!\n"); return; }
printf("排雷请按1,标记请按2\n"); scanf("%d", &a); if (a == 1) { while (1) {
printf("请输入坐标!\n"); scanf("%d %d", &x, &y); system("cls"); if (x >= 1 && x <=
row && y >= 1 && y <= col && show[x][y] == '*') { if (my[x][y] == '1') {
printf("很遗憾,你被炸死了!\n"); print(my, row, col); return; } if (my[x][y] == '0') {
/*show[x][y] = my[x - 1][y - 1] + my[x - 1][y] + my[x - 1][y + 1] + my[x][y -
1] + my[x][y + 1] + my[x + 1][y - 1] + my[x + 1][y] + my[x + 1][y + 1] - 8 *
'0' + '0'; i--; if (show[x][y] == '0') show[x][y] = ' ';*/ show_not_mine(show,
my, x, y, p, row, col); print(show, row, col); printf("剩余%d个雷\n", z);
printf("%d\n", i); break; } } else { print(show, row, col);
printf("输入错误,请重新输入!\n"); } } } else if (a == 2) { while (1) {
printf("标记雷按1,取消标记雷按2!\n"); scanf("%d", &a); if (a == 1) { while (1) {
printf("请输入标记雷坐标!\n"); scanf("%d %d", &x, &y); system("cls"); if (x >= 1 && x
<= row && y >= 1 && y <= col && sign[x][y] == '0') { sign[x][y] = 'c'; j++;
z--; show[x][y] = '@'; print(show, row, col); printf("剩余%d个雷\n", z); if (j ==
mine_count) { int k = 0; for(x = 0 ; x<= row; x++) for (y = 0; y <= col; y++) {
if (my[x][y] == '1' && sign[x][y] == 'c') k++; } if (j == k)
printf("恭喜你,扫雷成功!\n"); else printf("扫雷失败!\n"); return; } break; } else
printf("标记雷坐标输入错误,请重新输入!\n"); } break; } else if (a == 2) { while (1) {
printf("请输入取消标记雷坐标!\n"); scanf("%d %d", &x, &y); system("cls"); if (x >= 1 && x
<= row && y >= 1 && y <= col && sign[x][y] == 'c') { sign[x][y] = '0'; j--;
z++; show[x][y] = '*'; print(show, row, col); printf("剩余%d个雷\n", z); break; }
else printf("取消标记雷坐标输入错误,请重新输入!\n"); } break; } else
printf("是否标记选择输入错误,请重新输入!\n"); } } else printf("选择输入错误,请重新输入!\n"); } }
#include"game.h" void menu() { printf("**********************\n");
printf("********1.play********\n"); printf("********0.exit********\n");
printf("**********************\n"); } void game() { char show[ROWS][COLS] = { 0
}; char my[ROWS][COLS] = { 0 }; char sign[ROWS][COLS] = { 0 }; int sz =
sizeof(show); printf("扫雷!\n"); initboard(show, sz, '*'); initboard(my, sz,
'0'); initboard(sign, sz, '0'); print(show, ROW, COL); lay_mines(my, ROW, COL);
/*print(my, ROW, COL);*/ clear_mines(show, my, sign, ROW, COL); } void test() {
int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择!\n");
scanf("%d", &input); switch (input) { case 1: game(); break; case 0:
printf("游戏结束!\n"); break; default: printf("输入错误,请重新选择!\n"); break; } } while
(input); } int main() { test(); system("pause"); return 0; }
     
  用了大概300行左右的代码,写了一个扫雷。主要的话我是定义了三个数组,第1个数组就是存扫雷的那个画面,第2个数组记录了有雷的坐标,第3个数组记录的就是玩家标记雷的坐标。

       
首先就是用随机数生成坐标放雷,然后就是扫雷的这么一个过程,玩法和电脑上自带的扫雷游戏大同小异,我就不介绍了。然后稍微有点不一样的是,当扫完所有的空白坐标的时候,我就判断为扫雷成功,当标记所有雷的坐标,并且都标记正确的话,我也判断为扫雷成功,反之则扫雷失败,这里我详细说一下,如果我一共设置了10个雷,标记了9个雷,这时候我是不会去判断它是否标记正确的,只有当标记了10个雷,我才会去判断是否完全标记正确,然后判断是否扫雷成功,当然我也设置了标记过的雷取消标记的这么一个操作。

        标记雷的那一块代码,我写的有点凌乱。嵌套了很多判断语句,还有循环语句,写完之后我想了一想,可以用分支语句。

       
然后就是有一个想起来比较麻烦,但是实现起来比较简单的事展开,就是如果一个雷的周围没有雷,就会往周围展开。这里就是用递归来实现,根据三个数组的一些限制条件,进行筛选。需要注意的是,判断过的坐标不能再进行判断,不然会进入死递归。还有一个要注意的地方,就是一定要注意数组不能越界,一定要将坐标限制在雷盘的范围之内。

       
我个人认为,这代码的质量不高,很多时候我是出现了问题,把问题给堵住了,并不是一开始就想到了问题,所以越到后面改的越凌乱。而且很多地方我只会用死循环,算法很差。

        希望各位大牛指点。我会继续努力的。

 

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信