当前位置:网站首页>【扫雷】多方法超详细 7.28
【扫雷】多方法超详细 7.28
2022-08-03 05:11:00 【tt142】
扫雷游戏的实现还是有一定复杂程度的,但是只要自己头脑清醒,多难的代码都轻而易举
本文主要从逻辑出发,详细解释如何建立缜密思维
目录
1.test.c
2. game.c
3.game.h
其中3.的讲解穿插在1 2之中,因为代码主体决定要用什么函数以及头文件
1. test.c
首先游戏一定有 “开始游戏” 或者 “退出”——设置菜单
*注:菜单形式多样,主要就是用printf实现,无需其他函数辅助,较灵活,可以发挥想象设计自己喜欢的菜单,这里采用最简单的形式
选择游戏(1)或者退出(0)——输入对应的值(0/1)用switch接受并作出判断
判断:1——”游戏开始“,并且附带game();这个函数(具体功能在后文),break
0——“退出游戏”
其他——跳回选择(1/0)重新输入
game()函数:
首先初始化棋盘——棋盘是网格形状,要在里面进行一系列调整,最佳选择是二维数组,用空格初始化(因为空格可以占一个位置,也可以不对后续在数组里放元素造成干扰
打印棋盘——9*9,为了方便玩家后续输入坐标,最好在行和列最开始都标号
以上并不是test.c文件里的全部内容,具体用到的函数也有在game.c中
只用到了#include<stdio.h>和四个宏
宏放在#include "game.h"里面
先上代码,里面没讲到的会在后续补充
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"
void menu()
{
printf("——————————————————————\n");
printf("—————————1.play———————————\n");
printf("—————————0.exit———————————\n");
printf("——————————————————————\n");
}
void game()
{
char arr1[ROWS][COLS] = { 0 };
char arr2[ROWS][COLS] = { 0 };
Init(arr1, ROWS, COLS,'0');
Init(arr2, ROWS, COLS,'*');
Printf(arr2, ROW, COL);
Set(arr1, ROW, COL);
Printf(arr1, ROW, COL); //实际没有这步骤,只是为了在测试的时候更方便观察
Play(arr1, arr2, ROW, COL);
}
int main()
{
menu();
srand((unsigned int)time(NULL));
int n = 0;
flag : printf("请输入数字\n");
scanf_s("%d", &n);
switch (n)
{
case 1:
{
printf("游戏开始喽!!!\n");
game();
break;
}
case 0:
{
printf("退出游戏\n");
break;
}
default:
{
printf("真无语能不能好好看看再输入\n");
goto flag;
}
}
return 0;
}2. game.c
棋盘初始化和打印的函数在这个源文件里
棋盘工作就绪之后就是设置雷
为了方便后续调整雷的个数,将他设置为宏,并且定义在.h里
设置雷要产生随机数——srand,rand #include<stdlib.h>,时间戳time(NULL)——#include<time.h>
随机数的设置放在菜单后面
将原来用‘0’初始化的地方用‘1’代替表示雷
然后进行扫雷——输入坐标,将坐标对应的数组元素改成数字(数字代表这个位置周围的八个格子有几个雷)
坐标判断合法性
坐标是否被占用(可能被后面的标记占用
如果直接踩雷跳出循环
增加两个附加功能:
1.‘ !’标记雷的位置
2.如果坐标该坐标不是雷,周围八个格子没有雷,且周围没有被排查,打开一大片
代码如下
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"
void Init(char arr[ROWS][COLS], int rows, int cols,char set)
{
int i = 0;
int j = 0;
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
arr[i][j] = set;
}
}
}
void Printf(char arr[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= row; j++)
{
printf("%c ", arr[i][j]);
}printf("\n");
}
}
void Set(char arr[ROWS][COLS], int row, int col)
{
int count = COUNT;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (arr[x][y] == '0')
arr[x][y] = '1';
count--;
}
}
void Play(char arr1[ROWS][COLS], char arr2[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (1)
{
printf("请输入坐标\n");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (arr2[x][y] != '*')
printf("该坐标已经被排查\n");
else
{
if (arr1[x][y] == '1')
{
printf("恭喜你被炸死了\n");
break;
}
else
{
If(arr1,arr2, ROW, COL, x, y);
int win = Iswin(arr2, row, col);
if (win == 1)
{
printf("恭喜扫雷成功撒花花!!!\n");
Printf(arr2, ROW, COL);
break;
}
Printf(arr2, ROW, COL);
Sign(arr2, row, col);
Printf(arr2, ROW, COL);
}
}
}
else
printf("能不能看好了再输入\n");
}
}
static int Num(char arr1[ROWS][COLS], int x,int y)
{
return arr1[x - 1][y -1] +
arr1[x - 1][y] +
arr1[x - 1][y + 1] +
arr1[x][y - 1] +
arr1[x][y + 1] +
arr1[x + 1][y - 1] +
arr1[x + 1][y] +
arr1[x + 1][y + 1] - 8 * '0';
}
static void If(char arr1[ROWS][COLS], char arr2[ROWS][COLS], int row, int col, int x, int y)
{
int c = Num(arr1, x, y);
if (c == 0)
{
arr2[x][y] = ' ';
if (arr2[x - 1][y - 1] == '*' && x - 1 > 0 && y - 1 >0)
If(arr1, arr2, row, col, x - 1, y - 1);
if (arr2[x - 1][y] == '*' && x - 1 >0)
If(arr1, arr2, row, col, x - 1, y);
if (arr2[x - 1][y + 1] == '*' && x - 1 > 0 && y + 1 <= col)
If(arr1, arr2, row, col, x - 1, y + 1);
if (arr2[x][y - 1] == '*' && y - 1 > 0)
If(arr1, arr2, row, col, x, y - 1);
if (arr2[x][y + 1] == '*' && y + 1 <= col)
If(arr1, arr2, row, col, x, y + 1);
if (arr2[x + 1][y + 1] == '*' && x + 1 <= col && y + 1 <= col)
If(arr1, arr2, row, col, x + 1, y + 1);
if (arr2[x + 1][y] == '*' && x + 1 <= col)
If(arr1, arr2, row, col, x + 1, y);
if (arr2[x + 1][y + 1] == '*' && x + 1 <= col && y + 1 <= col)
If(arr1, arr2, row, col, x + 1, y + 1);
}
else
arr2[x][y] = c+'0';
}
void Sign(char arr2[ROWS][COLS], int row, int col)
{
int input = 0;
do
{
flag: printf("请选择是否要进行标记\n");
scanf_s("%d", &input);
switch (input)
{
case 1:
{
int x = 0;
int y = 0;
printf("请输入要标记的坐标\n");
scanf_s("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (arr2[x][y] == '*')
{
arr2[x][y] = '!';
Printf(arr2, ROW, COL);
}
else if (arr2[x][y] == '!')
{
arr2[x][y] = '*';
Printf(arr2, ROW, COL);
}
else
{
printf("该坐标已经被标记\n");
goto flag;
}
}
else
{
printf("能不能看清楚再输入真无语\n");
goto flag;
}
}
break;
case 0:
break;
default:
break;
}
} while (input);
}
static int Iswin(char arr2[ROWS][COLS], int row, int col)
{
int count = 0;
int i= 0;
int j = 0;
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
if (arr2[i][j] != '*' && arr2[i][j] != '!')
count++;
}
}
if (count == row * col - COUNT)
return 1;
else
return 0;
}3. 解释在前两
代码如下
#pragma once
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define COUNT 10
#include<time.h>
#include<stdlib.h>
void Init(char arr[ROWS][COLS], int rows, int cols,char set);
void Printf(char arr[ROWS][COLS], int row, int col);
void Set(char arr[ROWS][COLS], int row, int col);
void Play(char arr1[ROWS][COLS], char arr2[ROWS][COLS], int row,int col);
static int Num(char arr1[ROWS][COLS], int x, int y);
static void If(char arr1[ROWS][COLS], char arr2[ROWS][COLS], int row, int col, int x, int y);
static void Sign(char arr2[ROWS][COLS], int row, int col);
static int Iswin(char arr2[ROWS][COLS], int row, int col);
创作不易,感谢观看
边栏推荐
猜你喜欢
随机推荐
1094 谷歌的招聘 (20 分)
User password verification
【HMS core】【Ads Kit】Huawei Advertising——Overseas applications are tested in China. Official advertisements cannot be displayed
4.如何避免缓存穿透、缓存击穿、缓存雪崩
Presto installation and deployment tutorial
-最低分-
接口和抽象
1. 两数之和
Lambda表达式案例
typescript44-对象之间的类兼容器
Exception(异常) 和 Error(错误)区别解析
-完全数-
1054 求平均值 (20 分)
三角形个数
JS学习笔记(三)
1060 爱丁顿数 (25 分)
1089 狼人杀-简单版 (20 分)
junit总结
2. 两数相加
用scikit-learn学习谱聚类









