当前位置:网站首页>【扫雷】多方法超详细 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);
创作不易,感谢观看
边栏推荐
猜你喜欢
随机推荐
信息编码、存储压缩与密码学
ss-3.工程重构
设计模式——组合模式、享元模式(Integer缓存)(结构型模式)
Djiango第四次培训笔记
Object类与常用API
Install PostgreSQL on Windows
Presto installation and deployment tutorial
Pr第三次培训笔记
web安全-PHP反序列化漏洞
Lambda表达式案例
Junit
[Harmony OS] [ArkUI] ets development graphics and animation drawing
VSO Downloader Ultimate 5.0.1.45 中文多语免费版 在线视频下载工具
详解Nurbs曲线
Shell conditional statement judgment
Djiango第二次培训
Benchmark 第一篇 了解Benchmark
《录取通知》 观后感
ss-4.2 多个eureka集群案例
Talking about GIS Data (6) - Projected Coordinate System