比上一期博客增加了“炸一片”和标记,取消标记的功能哦!!!

文章目录

<>前言

完善了上一篇博客的不足。

<>一、周围雷数量为0,连续自动翻棋子

扫雷不是有点击一个棋子,若是显示为0,表示周围都不是雷,这样周围几个棋子都会自动翻开来,若是周围的又有显示为0的,有把周围的自动翻开,依次如此;这样的功能我称为“炸屏”,有时候真的一炸一大片的,到时候就更好排雷;雷我放了10个,上期博客我有写的,都是很详细的;

代码如下:
void Findmines(char mine[Rows][Cols], char show[Rows][Cols], int x, int y) {
if (x == 0 || y == 0 || x == Rows - 1 || y == Cols - 1) { return ; } if
(show[x][y] != '*') return; if (show[x][y] == '*') { int ret = minenum(mine, x,
y); show[x][y] = ret + '0'; } if (show[x][y] == '0') { Findmines(mine, show, x
- 1, y - 1); Findmines(mine, show, x - 1, y); Findmines(mine, show, x - 1, y +
1); Findmines(mine, show, x, y - 1); Findmines(mine, show, x, y + 1);
Findmines(mine, show, x + 1, y - 1); Findmines(mine, show, x + 1, y);
Findmines(mine, show, x + 1, y + 1); }
<>二、标记雷和取消标记

标记和取消功能差不多,当我们能够确定雷的位置的时候我们就可以标记雷的位置了,当我们标记错误位置了就可以取消标记;代码实现如下:
void concel(char show[Rows][Cols], int x, int y) { if (x == 0 || y == 0 || x
== Rows - 1 || y == Cols - 1) { printf("坐标非法,请重新输入:\n"); return; } if
(show[x][y] != '!') return; if (show[x][y] == '!') { show[x][y] = '*';
Initshow(show, Row, Col); } } void add(char show[Rows][Cols], int x, int y) {
if (x == 0 || y == 0 || x == Rows - 1 || y == Cols - 1) {
printf("坐标非法,请重新输入:\n"); return; } if (show[x][y] != '*') return; if
(show[x][y] == '*') { show[x][y] = '!'; Initshow(show, Row, Col);; } }
3.总代码如下

game.c
#include "game.h" void Mine(char board[Rows][Cols], int rows, int cols, char
set) { int i = 0, j = 0; for (i = 0; i < rows; i++) { for (j = 0; j < cols;
j++) { board[i][j] = set; } } } void Initshow(char show[Rows][Cols], int row,
int col) { int i = 0, j = 0; printf("--------欢迎来到扫雷游戏--------\n"); for (i = 0;
i <= col; i++) { printf("%d ", i); } printf("\n"); for (i = 1; i <= row; i++) {
printf("%d ", i); for (j = 1; j <= col; j++) { printf("%c ", show[i][j]); }
printf("\n"); } printf("--------欢迎来到扫雷游戏--------\n"); } void Mineset(char
mine[Rows][Cols], int row, int col) { int n = mines; while (n) { int x = rand()
% row + 1; int y = rand() % col + 1; if (x <= row && x >= 1 && y <= col && y >=
1) { mine[x][y] = '1'; n--; } } } void concel(char show[Rows][Cols], int x, int
y) { if (x == 0 || y == 0 || x == Rows - 1 || y == Cols - 1) {
printf("坐标非法,请重新输入:\n"); return; } if (show[x][y] != '!') return; if
(show[x][y] == '!') { show[x][y] = '*'; Initshow(show, Row, Col); } } void
add(char show[Rows][Cols], int x, int y) { if (x == 0 || y == 0 || x == Rows -
1 || y == Cols - 1) { printf("坐标非法,请重新输入:\n"); return; } if (show[x][y] != '*')
return; if (show[x][y] == '*') { show[x][y] = '!'; Initshow(show, Row, Col);; }
} int minenum(char mine[Rows][Cols], int x, int y) { return mine[x - 1][y - 1]
+ mine[x - 1][y] + mine[x - 1][y + 1] + mine[x][y - 1] + mine[x][y + 1] +
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] - 8 * '0'; } void
Checkmines(char show[Rows][Cols],int* x, int* y) { int i = 0, j = 0; for (i =
0; i < Row; i++) { for (j = 0; j < Col; j++) { if (show[i][j] != '*') x++; if
(show[i][j] == '!') y++; } } } void Findmines(char mine[Rows][Cols], char
show[Rows][Cols], int x, int y) { if (x == 0 || y == 0 || x == Rows - 1 || y ==
Cols - 1) { return ; } if (show[x][y] != '*') return; if (show[x][y] == '*') {
int ret = minenum(mine, x, y); show[x][y] = ret + '0'; } if (show[x][y] == '0')
{ Findmines(mine, show, x - 1, y - 1); Findmines(mine, show, x - 1, y);
Findmines(mine, show, x - 1, y + 1); Findmines(mine, show, x, y - 1);
Findmines(mine, show, x, y + 1); Findmines(mine, show, x + 1, y - 1);
Findmines(mine, show, x + 1, y); Findmines(mine, show, x + 1, y + 1); } } void
menu1() { printf("***************************\n"); printf("**** 0.退出游戏
****\n"); printf("**** 3.标记雷 ****\n"); printf("**** 4.取消标记 ****\n");
printf("**** 5.继续游戏 ****\n"); printf("***************************\n"); } void
Findmine(char mine[Rows][Cols], char show[Rows][Cols], int row, int col) { int
rets = 0,qi=0; while (1) { int x = 0, y = 0; printf("请输入坐标>\n"); scanf("%d%d",
&x, &y); if (x <= row && x >= 1 && y <= col && y >= 1) { Findmines(mine, show,
x, y); Initshow(show, Row, Col); if (mine[x][y] == '1') {
printf("肯定是失误了,你怎么可能会输?只能再来一局了\n"); show[x][y] = '1'; Initshow(mine, Row, Col);
return; } } else { printf("输入坐标非法,请重新输入:\n"); } Checkmines(show,&rets, &qi); if
(rets == Row * Col - mines || qi == mines) { printf("恭喜你,简简单单赢了,小意思哦\n");
return; } while (1) { menu1(); int g = 0; printf("请输入>\n"); scanf("%d", &g); if
(g == 3) { int x = 0, y = 0; printf("请输入坐标:\n"); scanf("%d%d", &x, &y);
add(show, x, y); } else if (g == 4) { int x = 0, y = 0; printf("请输入坐标:\n");
scanf("%d%d", &x, &y); concel(show, x, y); } else if (g == 5) break; else goto
again; } } again:return; }
<>text.c
#include "game.h" void menu() { printf("***************************\n");
printf("**** 1.玩游戏 ****\n"); printf("**** 0.退出游戏 ****\n");
printf("***************************\n"); } void game() { char mine[Rows][Cols]
= { 0 }; char show[Rows][Cols] = { 0 }; Mine(mine, Rows, Cols, '0'); Mine(show,
Rows, Cols, '*'); Initshow(show, Row, Col); Mineset(mine, Row, Col);
//Initshow(mine, Row, Col); //Mineset(mine, Row, Col); Findmine(mine, show,
Row, Col); } int main() { 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: break; } } while (input);
return 0; }

game.h
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h>
#define mines 10 #define Row 9 #define Col 9 #define Rows Row+2 #define Cols
Col+2 void Mine(char board[Rows][Cols], int rows , int cols, char set); void
Initshow(char show[Rows][Cols], int row, int col); void Mineset(char
mine[Rows][Cols], int row, int col); void Findmine(char mine[Rows][Cols], char
show[Rows][Cols], int row, int col); void Findmines(char mine[Rows][Cols], char
show[Rows][Cols], int y, int x); void Check(char show[Rows][Cols],int* x, int*
y); void add(char show[Rows][Cols], int x, int y); void concel(char
show[Rows][Cols], int x, int y);
总结

感谢大家的阅读了,这个改进的扫雷代码我觉得比上一期的代码优化了蛮多的,大家可以自行试试游戏体验,个人觉得还是更好了一些的;后面会改善三子棋的,五子棋也会实现的,不过最近没有时间去完善代码,所有可能有点慢,要花多一点时间;

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