做这样一个的小游戏我们要搞清楚他的原理,分析要写成几个步骤来进行实现,就像是我们玩的扫雷一样,我们选择一个区域就会显示附近区域有几个地雷,当然我们平常玩的是如果周围为零就会扩大范围,我今天写的仅仅是点一下出这个周围有几个炸弹,比较简单。
先放代码
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
char arr[11][11] = { 0 };
char ar[11][11] = { 0 };
void oo(char arr[11][11],int x,int y)
{
int i, j;
for (i = 0; i < x; i++)
{
arr[0][i] = i+48;
}
for (i = 0; i < y; i++)
{
arr[i][0] = i+48;
}
for (i = 1; i < x; i++)
{
for (j = 1; j < y; j++)
{
arr[i][j] = '*';
}
}
}
void op(char ar[9][9], int x, int y)
{
int count = 10;
while (count)
{
srand(time(NULL));//生成随机数
int a = rand() % 9+1;
int b = rand() % 9+1;
if (ar[a][b] == '0')
{
count--;
ar[a][b] = '1';
}
}
}
void print(char arr[11][11],int x,int y)
{
int i, j;
for (i = 0; i < x; i++)
{
for (j = 0;j < y; j++)
{
printf("%c", arr[i][j]);
}
printf("\n");
}
}
void oop(char ar[11][11], int x, int y)
{
int i, j;
for (i = 0; i < x+2; i++)
{
for (j = 0; j < y+2; j++)
{
ar[i][j] = '0';
}
}
}
void bianhuan(char arr[11][11], char ar[11][11], int a, int b)
{
arr[a][b] =48+ ar[a][b - 1] + ar[a + 1][b - 1] + ar[a - 1][b] + ar[a + 1][b] + ar[a + 1][b + 1] + ar[a][b + 1] + ar[a - 1][b - 1] + ar[a - 1][b + 1]-8*48;
}
void game(char arr[11][11], char ar[11][11], int x, int y)
{
int a, b,count=71;
while(count)
{
printf("\n请输入你猜的坐标:\n");
scanf("%d %d", &a, &b);
if (a <= 9 && b <= 9 && a > 0 && b > 0)
{
if (ar[a][b] == '1')
{
printf("你被炸死了\n");
break;
}
else
{
bianhuan(arr, ar, a, b);
count--;
}
print(arr, 10, 10);
}
else
{
printf("坐标非法请重新输入");
}
}
}
int main()
{
int n;
do
{
printf("******************\n");
printf("****1>开始游戏****\n");
printf("****0<退出游戏****\n");
printf("******************\n");
scanf("%d", &n);
switch (n)
{
case 1:
printf("游戏开始\n");
oo(arr,10,10);//初始化
oop(ar, 9, 9);
op(ar, 9, 9);//生成炸弹
print(arr,10,10);
print(ar, 11, 11);
game(arr,ar, 10, 10);
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (n);
return 0;
}
游戏界面
根据自己喜好做一个开始的界面
do
{
printf("******************\n");
printf("****1>开始游戏****\n");
printf("****0<退出游戏****\n");
printf("******************\n");
scanf("%d", &n);
switch (n)
{
case 1:
printf("游戏开始\n");
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (n);
游戏本体
在开始做之前我么要想一下一个这样的扫雷,是如何保存的,例如一个9*9的对应我们c语言中我们很容易联想到的是数组,我们就做一个二维数组来进行保存,就是一个我们要在上面放炸弹,还要进行计数,再进行打印,这样一想发现这个棋盘怎么也不够用,我们需要再搞一个棋盘,进行功能分配,一个作为暗中的棋盘进行放炸弹,判断炸弹,一个进行打印,好了可以了。(在判断的时候我们是判断这个棋子周围的炸弹如果在边界我们可能出现判断错误所以我们需要把数组高的大一点)
初始化棋盘
一个我们采用1 0来进行判断是否为炸弹所以一个全是0,一个用*和0到9进行布盘
oo(arr,10,10);//初始化
oop(ar, 9, 9);
void oo(char arr[11][11],int x,int y)
{
int i, j;
for (i = 0; i < x; i++)
{
arr[0][i] = i+48;
}
for (i = 0; i < y; i++)
{
arr[i][0] = i+48;
}
for (i = 1; i < x; i++)
{
for (j = 1; j < y; j++)
{
arr[i][j] = '*';
}
}
}
void oop(char ar[11][11], int x, int y)
{
int i, j;
for (i = 0; i < x+2; i++)
{
for (j = 0; j < y+2; j++)
{
ar[i][j] = '0';
}
}
}
(这个是我放玩炸弹的样子)
放炸弹
我们防炸单讲究就是一个随机,我们想到随机数取余来实现
op(ar, 9, 9);//生成炸弹
void op(char ar[9][9], int x, int y)
{
int count = 10;
while (count)
{
srand(time(NULL));//生成随机数
int a = rand() % 9+1;
int b = rand() % 9+1;
if (ar[a][b] == '0')
{
count--;
ar[a][b] = '1';
}
}
}
这样我们的前置工作就搞完了,我们到了我们开始选坐标的阶段了
开始扫雷
其中我们要判断坐标是否非法,以及你是否炸死
void game(char arr[11][11], char ar[11][11], int x, int y)
{
int a, b,count=71;
while(count)
{
printf("\n请输入你猜的坐标:\n");
scanf("%d %d", &a, &b);
if (a <= 9 && b <= 9 && a > 0 && b > 0)
{
if (ar[a][b] == '1')
{
printf("你被炸死了\n");
break;
}
else
{
bianhuan(arr, ar, a, b);
count--;
}
print(arr, 10, 10);
}
else
{
printf("坐标非法请重新输入");
}
}
}
判断几个炸弹
我们可以选用很多方法这里,我选用的是将周围八个加起来减去8个字符零在加上0与字符零这种的差值48实现将*转换为1 2 3等
void bianhuan(char arr[11][11], char ar[11][11], int a, int b)
{
arr[a][b] =48+ ar[a][b - 1] + ar[a + 1][b - 1] + ar[a - 1][b] + ar[a + 1][b] + ar[a + 1][b + 1] + ar[a][b + 1] + ar[a - 1][b - 1] + ar[a - 1][b + 1]-8*48;
}
这样大致结束了。