一.扫雷游戏分析
首先扫雷这个游戏肯定是跟电脑自带的扫雷功能大差不差(在棋盘上随机布置10个雷,不是雷的话显示周围有几个雷,选到雷游戏结束,剩下位置全部是雷,游戏成功。),但是用c语言写出来现阶段还是用c语言控制台去完成游戏。
我们肯定需要一个选择游戏开始的菜单界面比如:
之后需要设置数组来存储布置的雷和排查出的雷的信息,如果这个位置布置雷,我们就存放1,没有布置雷就存放0.
布置雷的棋盘:
让他可以通过坐标来输入并且排查雷。比如(2,2)的位置为1,则是雷,如果输入坐标2,2则选中雷游戏机结束,通过两个二维数组分别来完成这个操作。
二.代码逐步实现。
我们先创建一个.c和.h文件。你也可以创建多个.c分别存储(自己随机命名就好,我是创建了一个GAME.h文件和扫雷游戏.c文件(主函数文件)以及一个function.c文件)。
GAME.h文件里面放库函数头文件以及自定义函数声明。(图里面只是小部分,通过后面的代码还会进行补充。)
扫雷游戏.c则选择存放我们的主函数以及程序。(引用自定义头文件用“”)
function.c文件我用来存放自定义函数。
之后我们来创建游戏开始菜单。自定义一个函数命名为menu,里面存放刚开始的我们需要选择1或者0来进入游戏退出游戏的选项。
在游戏开始菜单创建好之后我们开始写进入扫雷游戏的游戏界面,因为我们需要排查雷,所以要注意不要越界,多创建一圈。我们在创建的时候创建两个数组,一个用来存放雷的信息,一个来存放排查出来雷的信息。
创建棋盘代码:
扫雷游戏.c
function.c
GAME.h
控制台
在扫雷棋盘初始化输出好之后,我们就需要往里面埋雷并且我们要让他显示出附件有几个雷,因为我们现在这一步仅仅是一个初始化的空棋盘,里面并没有雷和东西。
我们先来布置雷,用生成随机数的方法,控制电脑在棋盘上随机生成雷
GAME.h
function.c
扫雷游戏.c
现在这一步我们就在mine棋盘上埋好了雷,而接下里我们需要的就是当时我们输入坐标的时候,在他不为雷,就要显示附件有几个雷。
function.c
GAME.h
做到这里差不多的功能以及完成了,因为是9*9的棋盘,所以这个时候我们能需在排查雷的执行过程中循环次数为9(行)*9(列)=81-10(雷的个数)让他在在排完所有雷的时候结束循环。制作出通过提示。并且检测代码是否正常运行。
接下来让我们看一下全部完成之后的代码和效果:
GAME.h的内容:
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#define EASY_COUNT 10//设置雷的个数方便之后更改
#include<stdio.h>
#include <stdlib.h>
#include <time.h>
#include<windows.h>
#define ROW 9//宏定义行为9
#define COL 9//宏定义列为9.这样定义方便之后更改。
//让他的加一圈,防止越界
#define ROWS ROW+2
#define COLS COL+2
void Initialize_chessboard(char arr[ROWS][COLS], int rows, int cols,char set);//初始化函数声明
void Print_chessboard(char arr[ROWS][COLS], int row,int col);//打印棋盘函数声明
void SetMine(char arr[ROWS][COLS], int row, int col);//布置雷声明
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排查雷声明
int GetMineCount(char mine[ROWS][COLS], int x, int y);//嵌套进去的让查看附近8个坐标雷的个数
扫雷游戏.c的内容:
#include"GAME.h"
void menu() {//游戏开始菜单
printf("###############################\n");
printf("######### 1.paly ###########\n");
printf("######### 0.exit ###########\n");
printf("###############################\n");
}
void game(){
char mine[ROWS][COLS];//创建数组棋盘
char show[ROWS][COLS];
Initialize_chessboard(mine, ROWS, COLS,'0');//初始化棋盘都为“0”
Initialize_chessboard(show, ROWS, COLS,'*');//初始化棋盘都为“*”
Print_chessboard(show, ROW, COL);//打印棋盘
SetMine(mine, ROW, COL);//把雷放进棋牌
//Print_chessboard(mine, ROW, COL);//打印棋盘
FindMine(mine, show, ROW, COL);//排查附近的雷
}
int main() {
int input = 0;//创建开始菜单选择变量
srand((unsigned int)time(NULL));
do {//do while循环开始菜单
menu();
printf("请选择开始游戏或者退出:");
scanf("%d", &input);
switch (input)//switch根据输入的数字分支选择输出
{
case 1:
game();//创建游戏界面
break;
case 0:
printf("游戏退出\n");
break;
default:
printf("输出错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
最后就是函数的实现function.c的内容
#include"GAME.h"
void Initialize_chessboard(char arr[ROWS][COLS], int rows, int cols,char set) {
int i = 0;//创建变量i控制行
for (i = 0; i < rows; i++) {
int j = 0;//创建变量j控制列
for (j = 0; j < cols; j++) {
arr[i][j] = set;//初始化棋盘
}
}
}
void Print_chessboard(char arr[ROWS][COLS], int row, int col){//打印棋盘函数
int i = 1;
printf("*******扫雷游戏开始啦*******\n");
for (i = 0; i <= row; i++) {//输出列号
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++) {
int j = 0;
printf("%d ", i);//输出行号
for (j = 1; j <= col; j++) {
printf("%c ", arr[i][j]);
}
printf("\n");
}
printf("*******扫雷游戏开始啦*******\n");
}
void SetMine(char arr[ROWS][COLS], int row, int col) {
int lei = EASY_COUNT;//创建10个雷
while (lei) {
int x = rand() % row + 1;//生产1-9坐标来布置雷
int y = rand() % col + 1;
if (arr[x][y] == '0') {
arr[x][y] = '1';
lei--;//一共十个雷,布置一个少一个
}
}
}
int GetMineCount(char mine[ROWS][COLS], int x, int y)
{
int z = 0;
z = (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
return z;
//统计周围八个坐标里面有几个炸弹(几个1)
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col) {
int x = 0;
int y = 0;
int win = 0;
while (win < row * col - EASY_COUNT){//循环到所有雷全部排完,循环结束。
printf("请输入排查的坐标:");
scanf("%d %d", &x, &y);//输入坐标
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1' )
{//找到雷的情况
printf("恭喜你,你被炸死了!\n");
Print_chessboard(mine, ROW, COL);//显示出雷在哪里
Sleep(1000);//睡眠一秒
system("cls");//完成之后清理屏幕
break;
}
else
{//没找到雷,就统计坐标附近有几个雷
int n = GetMineCount(mine, x, y);
show[x][y] = n + '0';
Print_chessboard(show, ROW, COL);
win++;//没踩雷,就加一直到超出循环
}
}
else
{
printf("坐标输入错误,请重新输入\n");
}
}
if (win == row * col - EASY_COUNT){
printf("你已经排出全部的雷!恭喜你通过游戏\n");
Print_chessboard(mine, ROW, COL);//显示出雷在哪里
Sleep(1000);
system("cls");//完成之后清理屏幕
}
}
来看看最终效果呈现吧:
写出来还挺有成就感的,来回刷了好几遍,模仿并用学过的知识加了一点点小功能(睡眠清屏啥的)。一起努力吧大家!!!
写出来的代码放在了(CUI BODONG (cui-bodong) - Gitee.com)码云,可以自提