初学c语言,对扫雷游戏的讲解
扫雷游戏的讲解
前言
一 :扫雷游戏的原理
二 :创建运行文件 :
1、头文件
2、源文件
三 :游戏准备——菜单
四 :核心 :
1、创建棋盘
2、初始化棋盘
3、打印棋盘
4、设置地雷
5、找出地雷
五 :运行使用的全部代码
六 :个人通过该游戏的收获及总结
前言
一、扫雷游戏的介绍
扫雷的游戏规则如下:
目标:揭开所有没有地雷的方格,踩到地雷则失败。
1
操作:
使用鼠标左键点击方格,若该方格为地雷则游戏失败;若为数字,则显示周围8个方格中地雷的数量。
2
若点击的方格为空白,周围没有地雷,则会自动打开周围的方格。
3
使用右键标记地雷,插旗表示你认为该方格有雷。
4
数字提示:数字表示该方格周围8个方格中隐藏的地雷数量,例如“1”表示周围有1颗雷。
5
胜利条件:在不踩雷的情况下尽快标记出所有地雷。
6
这些规则可以帮助你更好地理解和玩扫雷游戏,帮助你编写扫雷游戏
我这里编写的是9*9,10颗雷为例,若要改写,只需改写几个代码的数值即可
二 :创建运行文件
1 头文件————game.h,用来声明函数
2 源文件————game.c与test.c
game.c用来实现函数
test.c用来存放游戏的实现逻辑

三:游戏准备——菜单
先截图给大家大概浏览,下面将进行讲解
四 :核心 :
1、创建棋盘 ,我们这里做的是一个99的扫雷游戏,且放置10颗雷。
由前面的规则知:左键点击后若为数字,是该位置9宫格内所有的雷数。
但这里我们若创建99的棋盘,则在最外一圈的格子无法建立9宫格,不便于统计雷数,故给行与列各增加一个,创建11*11的棋盘,并看成二维数组
如图:红色区域为我们真正打印棋盘与布置雷的区域,整个黑色区域则是我们的棋盘
2、初始化棋盘
所需在test.c的代码截图(文章结尾放上全部代码)
此处直接在源文件定好mine棋盘为0 show棋盘为*,与后续的game.c中的set相呼应,可一串代码解决两个问题,使代码更简洁

在game.h所需的代码截图

在game.h所需代码的截图

3、打印棋盘
在test.c所需的代码截图
虽然初始化棋盘使用的是1111,但我们做的是99的扫雷游戏,所以只需打印9*9即可
此处对mine进行的注释,刚写到此处,可以运行一下,查看自己的关于mine与show的代码是否均正确

在game.c所需的代码截图,此处可加上扫雷游戏进行修饰,因为将棋盘看成二维数组,所以只需使用for循环不断打印即可

打印出的show的棋盘

打印的mine棋盘

在game.h所需的代码截图

可看出代码均如预想的一样运行
4、设置地雷
在test.c所需代码截图,生成的地雷应随机的,故需使用srand
例外,此处也可再次打印mine棋盘,检验代码是否正确,确认无误后再对DisplayBoard加上注释
打印出的数字代表地雷个数,所以可将地雷设置为1

在game.c所需的代码截图,如果不对数组的元素进行判断,则可能导致有雷布置在同一个地方,导致次数浪费

打印的mine棋盘

注意,由于初始化是11*11,所以此处mine的数组依旧是使用ROWS与COLS

5、找出地雷
依据游戏规则,我们可发现找出地雷有以下特点
1、若所找的位置不是地雷,则会打印出以该位置为中心的9宫格所有地雷的个数
2、会自动将所找位置不是地雷扩散出去,直到扩散区域的格子为中心的9宫格内有地雷终止(学艺不精,还未学习这相关知识点,后续再进行补充)
故在test.c所需代码的截图

在game.c所需代码的截图,通过二维数组的输入进行游戏游玩


在99的棋盘中,共有81个格子,若胜利则是每次输入都未踩雷,输完99-雷的个数(上面代码均用字母表示,是为了要更改棋盘更加方便,只需在头文件更改即可)
打印输入位置为中心9宫格所需的代码,该9宫格也可看成是一个二维数组,范围为x-1到x+1与y-1到y+1

注意,此处不可再使用void,此处需返回值进行打印
到此,扫雷游戏的简易制作便已完成,若想制作其他规格的棋盘及改变雷的个数,则只需在头文件修改即可
在test.c所需的代码
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include “game.h”
void game()
{
//存放雷的信息
char mine[ROWS][COLS];
//存放排查雷的信息
char show[ROWS][COLS];
//初始化棋盘
Initboard(mine, ROWS, COLS, ‘0’);
Initboard(show, ROWS, COLS, ‘*’);
//打印棋盘
//Displayboard(mine, ROW, COL);
Displayboard(show, ROW, COL);
//布置雷
srand((unsigned int)time(NULL));
SetMine(mine, ROWS, COLS);
//Displayboard(mine, ROW, COL);
//发现雷
FindMine(show, ROWS, COLS);
//Displayboard(show, ROW, COL);
}
void menu()
{
printf(“\n");
printf(" 1.play *\n");
printf(" 0.exit *******\n");
printf("\n");
printf("********************\n”);
printf(“请输入数字:”);
int a = 1;
while (a)
{
scanf("%d", &a);
if (a == 1)
{
game();
break;
}
else if (a == 0)
{
printf("退出游戏\n");
break;
}
else
{
printf("请重新输入数字\n");
}
}
}
int main()
{
menu();
return 0;
}
在game.h所需的代码
#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"
#include "game.h"
void Initboard(char board[ROWS][COLS], int rows, int cols, int set)
{
for (int i = 1; i < rows; i++)
{
for (int j = 1; j < cols; j++)
{
board[i][j] = set;
}
}
}
void Displayboard(char board[ROWS][COLS], int row, int col)
{
printf("------扫雷游戏------\n");
for (int i = 0; i <= col; i++)
{
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= row; i++)
{
printf("%d ", i);
for (int j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void SetMine(char mine[ROWS][COLS], int row, int col)
{
int count = SUM_COUNT;
int x = 0;
int y = 0;
while (count)
{
x = 1 + rand() % row + 1 - 1;
y = 1 + rand() % col + 1 - 1;
if (mine[x][y] != '1')
{
mine[x][y] = '1';//布置一个雷
}
count--;
}
}
int GetMine(char mine[ROWS][COLS], int x, int y)
{
int count = 0;
for (int a = x - 1; a <= x + 1; a++)
{
for (int b = y - 1; b <= y + 1; b++)
{
if (mine[x+a][y+b] == '1')
{
count += mine[x + a][y + b];
}
}
}
return count;
}
void FindMine(char mine[ROWS][COLS],char show [ROWS][COLS], int row, int col)
{
printf("请输入你要排查的数字:");
int win = 0;
while (win = row * col - SUM_COUNT)
{
int x = 0;
int y = 0;
scanf(" %d %d", &x, &y);
printf("%d %d", &x, &y);
if (1 <= x && x <= 9 && 1 <= y && y <= 9)
{
if (mine[x][y] == '1')
{
printf("输入错误,游戏结束\n");
break;
}
else if (show[x][y] == '0')
{
printf("该位置已重复输入,请重新输入数字:");
}
else
{
int count = GetMine(mine,x,y);
printf("输入正确,请继续输入游戏:");
win++;
}
}
else
{
printf("!!!(1 <=x <= 9,1 <= y <=9)");
}
}
if (win = row * col - SUM_COUNT)
{
Displayboard(mine, ROW, COL);
}
}
在game.h所需的代码
#pragma once
#include<stdlib.h>
#include <stdio.h>
#define ROW 9
#define COL 9
#define COLS 9
#define ROWS 11
void Initboard(char board[ROWS][COLS], int row, int col, int set);
#define _CRT_SECURE_NO_WARNINGS 1
void Initboard(char board[ROWS][COLS], int row, int col, int set);
void Displayboard(char board[ROW][COL], int row, int col);
void SetMine(char board[ROWS][COLS], int row, int col);
#define SUM_COUNT 10
#include <time.h>
void FindMine(char board[ROW][COL], int row, int col);
六、个人通过该游戏的收获及总结
1、收获:通过一个扫雷游戏,将之前所学的知识串联在一起,有了更深的体会,也很好地进行了复习
2、总结:代码要多写,刚开始写时或许会错误重重,但写得多了,错得多了,也就对代码会更加熟悉了。
另外 可以早点去学习一下实用的调试技巧,在你代码错误的时候进行使用,可以很好地帮你纠正错误
更多推荐







所有评论(0)