C语言实现简单的扫雷游戏
整体框架的搭建
首先我们创建一个头文件以及两个源文件
↑头文件用于预定义以及函数的声明;扫雷Finish.c文件用于游戏内部函数的编写;扫雷测试Finish.c用于游戏的实现。
void Game()
{
}
void Gamemenu()//游戏菜单
{
printf("####################\n");
printf("#######1.play#######\n");
printf("#######0.exit#######\n");
printf("####################\n");
}
void Start()//游戏执行
{
int IN;
srand((unsigned int)time(NULL));
do
{
Gamemenu();
printf("请选择:\n");
scanf("%d", &IN);
switch (IN)
{
case 1:
Game();
break;
case 2:
printf("exit game! \n");
break;
default:
printf("error choice! input again! \n");
break;
}
} while (IN);
}
int main()//主函数
{
Start();
return 0;
}
//注意以上为test.c里的代码(Start函数里面的Game函数我们先待定)
头文件
首先我们要用到两个9*9的二维数组,其中一个数组用作布置雷,另外一个用作排雷(玩家看到的是这个二维数组)。
- 全局变量的定义 ,在头文件里面定义数组的行列,这里我们定义的两组行列,防止使用数组时越界;
#define H 9
#define L 9
#define H1 H+2
#define L1 L+2
- 函数的调用及声明,在头文件里声明函数以及调用库函数(两个源文件里均需引头文件扫雷Finish.h) ;
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
void InitBoard(char arr[H1][L1], int h1, int l1, char set);//初始化棋盘
void PrintBoard(char arr1[H1][L1],int h,int l);//打印出棋盘
void LayingMines(char arr2[H1][L1], int h, int l);//布置雷
void ClearMines(char arr3[H1][L1], char arr4[H1][L1], int h, int l);//排雷
Game函数的定义
我们把游戏的所有功能细分为4个函数来操作
功能 | 函数 |
---|---|
初始化棋盘 | InitBoard |
打印棋盘 | PrintBoard |
布置雷 | LayingMines |
排雷 | ClearMines |
#define _CRT_SECURE_NO_WARNINGS 1
#include"扫雷Finish.h"//引头文件
void Game()
{
char Lei[H1][L1];//存放雷的棋盘
char PaiLei[H1][L1];//排查雷的棋盘
InitBoard(Lei,H, L,'0');//初始化放雷棋盘
InitBoard(PaiLei,H, L,'*');//初始化排雷棋盘
//PrintBoard(Lei, H, L);//打印棋盘
PrintBoard(PaiLei, H, L);//打印排查雷的棋盘
LayingMines(Lei, H, L);//布置雷
ClearMines(Lei, PaiLei, H, L );//排雷
}
各类游戏功能函数的定义(扫雷Finish.c)
#define _CRT_SECURE_NO_WARNINGS 1
#include "扫雷Finish.h"//引头文件
void InitBoard(char arr[H1][L1], int h1, int l1, char set)//棋盘初始化
{
for (int i = 1; i <= h1; i++)
{
for (int j = 1; j <= l1; j++)
{
arr[i][j] = set;//这里的set:传入符号为1则为雷,0代表这个坐标无雷。
}
}
}
void PrintBoard(char arr1[H1][L1], int h, int l)//打印棋盘
{
int i = 0;
int j = 0;
for (i = 0; i <= h; i++)//打印行号0 1 2 3 4 ...
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= h; i++)
{
printf("%d ", i);//打印列号
for (j = 1; j <= l; j++)
{
printf("%c ", arr1[i][j]);
}
printf("\n");
}
}
void LayingMines(char arr2[H1][L1], int h, int l)//布置雷
{
int count = 10;//这里我们选择布置十个雷
while (count)
{
int x = rand() % h + 1;//32767%9再+1,随机出0~9之间的数
int y = rand() % l + 1;
if (arr2[x][y] == '0')//首先得做出判断,以防重复布雷
{
arr2[x][y] = '1';
count--;
}
}
}
int WithoutMinesCount(char arr5[H1][L1], int x, int y)//计算周围八坐标雷的个数
{
return arr5[x - 1][y] +
arr5[x - 1][y - 1] +
arr5[x][y - 1] +
arr5[x + 1][y - 1] +
arr5[x + 1][y] +
arr5[x + 1][y + 1] +
arr5[x][y + 1] +
arr5[x - 1][y + 1] - 8 * '0';//‘1’-‘0’ = 1,所以八个坐标加起来减去8*‘0’
}
void ClearMines(char arr3[H1][L1], char arr4[H1][L1], int h, int l)//排雷
{
int x = 0, y = 0;
while (1)
{
printf("请输入排雷的坐标:\n");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= h && y >= 1 && y <= l)
{
if (arr3[x][y] == '1')
{
printf("你被雷炸死了\n");
PrintBoard(arr3, h, l);
break;
}
else
{
int count = WithoutMinesCount(arr3, x, y);
arr4[x][y] = count + '0';
PrintBoard(arr4, h, l);
printf("恭喜你没被炸死,请继续。\n");
}
}
else
{
printf("坐标非法,重新输入:\n");
}
}
}
源码链接:https://github.com/lov1ballad/my_game