目录
针对C语言中的循环语句,条件语句,数组的综合应用,在每条代码后面都配备了注释,希望大家可以看懂
前言(所需的知识点)
针对C语言中的循环语句,条件语句,数组的综合应用,写出一个扫雷游戏
1.利用while for do while语句
2.利用switch if 语句
3.利用二维数组
4.随机数的利用(关注往期我的博客)
5.函数的调用
6.函数的声明,宏的定义及使用
一、创建文件
第一步创建两个.c 文件,text 文件用于测试,game 文件用于创建函数
第二步创建一个.h头文件,将前两个文件中所需要的头文件,宏以及函数声明放到此文件中,以此来使.c文件更加整洁
二、编写
1.在测试中引入主函数
代码如下(示例):
#pragma warning(disable : 4996)//VS2019 scanf等函数需要关闭警告
#include "game.h"//引入头文件 定义的define宏 函数声明
void menu()//菜单界面
{
printf("**********************************\n");//扫雷界面
printf("* 欢迎来到扫雷游戏 *\n");
printf("* 1.进行游戏 *\n");
printf("* 0.退出游戏 *\n");
printf("**********************************\n");
}
void game()
{
char mine[ROWS][COLS] = { 0 };//存放雷的信息
char show[ROWS][COLS] = { 0 };//给用户看的游戏界面
Initboard(mine, ROWS, COLS, '0');//初始化雷(给编辑程序的人看)
Initboard(show, ROWS, COLS, '*');//初始化雷(给玩家看)
Setmine(mine, ROWS, COLS);//利用随机数去生成随机雷
Display(show, ROW, COL);//把初始化的界面展示给玩家
Display(mine, ROW, COL);//雷布置好的程序不必要写(随意)
Findmine(show, mine, ROW, COLS);//玩家排雷函数,根据玩家提供的坐标去实现排雷
}
void main()
{
int input = 0;//定义变量供---->由用户输入的选择
srand((unsigned int)time(NULL));//设置随机数生成随机雷 在9*9的棋盘生成
do
{
menu();//调用菜单函数
printf("请您选择序号---->");
scanf("%d", &input);//用户输入变量值
switch (input)//根据用户输入进行游戏 or 退出游戏
{
case 1:
game();//选1进行游戏调用game函数
break;
case 0:
printf("\nexit\n");//用户输入0退出程序
break;
default:
printf("序号选择错误请您重新选择\n");//用户输错了重新回到循环判断0/1
}
} while (input);//根据用户输入的去循环 用户输入1继续玩游戏,玩家输入0程序终止
}
2.头文件+宏+函数声明
代码如下(示例):
#pragma once
#include <stdio.h>
#include <stdlib.h> //srand的头文件
#include <time.h> //timeh函数的头文件
#define ROW 9//定义宏 方便统一修改
#define COL 9//设置雷在 9*9的格子里防止二维数组越界
#define ROWS ROW+2//防止二维数组越界访问初始化的时候多设置两行两列
#define COLS COL+2
#define EASY_COUNT 10 //设置10颗雷
void Initboard(char board[ROWS][COLS], int rows, int cols, char set);//先函数声明后使用函数
void Display(char board[ROWS][COLS], int row, int col);
void Setmine(char board[ROWS][COLS], int row, int col);
void Findmine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col);
如图所示的9*9扫雷游戏,我们设置的外框是11*11的二维数组,我们在9*9的格子里去设置雷包括呈现给玩家的也是9*9的格子,11*11多出的两行分别是为了防止二维数组越界访问,造成错误。
有的同学不理解为什么会越界访问,我们设想如果我们直接设置9*9的格子,我们要访问左下角的格子,判断他周围的八个格子是否有雷,有一部分格子明显在咱们所见的格子外面,这样就造成了越界访问,访问到二维数组之外了,会造成错误
3.游戏所需函数
#pragma warning(disable : 4996)
#include "game.h"//引入所需头文件,宏,函数声明
void Initboard(char board[ROWS][COLS], int rows, int cols, char set)//初始化界面
{
int i = 0;
int j = 0;
for (j = 0; j < rows; j++)
{
for (i = 0; i < cols; i++)
{
board[i][j] = set;//把*初始化给二维数组 典型的二维数组赋值
}
}
}
void Display(char board[ROWS][COLS], int row, int col)//打印出界面给玩家看 制作玩家界面
{
int i = 0;
int j = 0;
for (i = 0; i <= 9; i++)
{
printf("%d ", i);//打印行号
}
printf("\n");
printf("----------------------\n");
for (j = 1; j <= row; j++)
{
printf("%d|", j );//打印列号
for (i = 1; i <= col; i++)
{
printf("%c ", board[i][j]);
}
printf("|");
printf("\n");
}
printf("----------------------\n");
}
void Setmine(char board[ROWS][COLS], int row, int col)
{
int minecount = EASY_COUNT;//设置雷的个数
while (minecount)//循环去放雷
{
int x = rand() % 9 + 1;//因为是玩家玩,所以要从下标为1的开始 所以+1
int y = rand() % 9 + 1;
if (board[x][y] != '1')//判断x,y坐标的位置是不是已经放过雷
{
board[x][y] = '1';//如果没有放雷,把对应坐标设置成雷,用‘1’表示雷
minecount--;
}
}
}
int Getmine(char mine[ROWS][COLS], int x, int y)//当你扫除一个没有雷的坐标,坐标上显示周围雷的个数
{
return (mine[x-1][y]+mine[x+1][y]
+mine[x][y-1]+mine[x-1][y-1]+mine[x+1][y-1]
+mine[x][y+1]+mine[x-1][y+1]+mine[x+1][y+1]-8*'0');//这些坐标加在一起是字符,每一个减去一个字符'0'就可以得到对应的整型数据
}
void Findmine(char show[ROWS][COLS], char mine[ROWS][COLS], int row, int col)
{
int x = 0;//定义两个变量 数值由用户输入 对应扫雷的坐标
int y = 0;
int win = 0;
while (win < col * row - EASY_COUNT)//循环的终止条件是9*9的棋盘减去雷的个数,已经满了游戏终止
{
printf("请您输入需要排查的坐标------>");
scanf("%d %d", &x, &y);//用户输入扫雷的坐标
if (x >= 1 && x <= row && y >= 1 && y <= row)//判断坐标输入正误
{
if (mine[x][y] == '1')//判断如果用户输入的坐标对应的字符是'1'即用户踩到雷了,游戏结束,给玩家展示雷的布局图
{
printf("很遗憾 您被炸死了!!\n");
printf("雷区如图 下次加油!!\n");
Display(mine, ROW, COL);//展示布局图
break;//循环终止 下次游戏
}
else//输入的坐标没有踩到雷
{
int count = Getmine(mine, x, y);//调用函数获取周边雷的个数
show[x][y] = count + '0';
if (count == 0)//如果周围没有雷把坐标附近的八个坐标都清空(就周围八个格子设置成空格)(仿网页扫雷)
{
show[x-1][y] = ' ';
show[x+1][y] = ' ';
show[x][y +1] = ' ';
show[x - 1][y +1] = ' ';
show[x+1][y +1 ] = ' ';
show[x +1][y-1] = ' ';
show[x - 1][y-1] = ' ';
show[x][y-1] = ' ';
}//坐标对应的位置周围的雷赋值给show数组
Display(show, ROW, COL);//展示输入坐标对应的位置周围
}
}
else
{
printf("输入的坐标非法请您重新输入\n");
}
if (win == row * col-EASY_COUNT)//除了雷的坐标都排除完后就排雷成功了
{
printf("恭喜你排雷成功\n");
}
}
}
4.解释一个知识点
整型数据+字符‘0’=对应的字符类型
eg. 1+'0'='1'
我们看到字符0的ASCII值为30,字符1的值为31所以刚好数值字符0+1=字符1
5.成果展示
总结
C语言经典的扫雷游戏,初学C语言的同学可以尝试自己敲一下,可以对所学的知识加以巩固,加强自己的代码能力,有什么问题随时私信评论都行,欢迎大家一起讨论