比上一期博客增加了“炸一片”和标记,取消标记的功能哦!!!
完善了上一篇博客的不足。
扫雷不是有点击一个棋子,若是显示为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);;
}
}
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
#include
#include
#include
#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);
感谢大家的阅读了,这个改进的扫雷代码我觉得比上一期的代码优化了蛮多的,大家可以自行试试游戏体验,个人觉得还是更好了一些的;后面会改善三子棋的,五子棋也会实现的,不过最近没有时间去完善代码,所有可能有点慢,要花多一点时间;