C语言扫雷游戏的实现代码

这是一个用C语言实现的控制台扫雷小游戏,实现了随机布置炸弹、扫描炸弹、标记炸弹、百分百第一次不被炸死等功能。

编译器:vs2015

功能模块图

源代码

#include<stdio.h>

#include<stdlib.h>

#include<time.h>

void show(int cbd[10][10],int u[10][10]) //界面输出函数

{

int i, j;

//for (i = 0; i < 10; i++) //输出全部炸弹信息(上帝视角,调试用)

//{

// for (j = 0; j < 10; j++)

// {

// printf("%2d ", cbd[i][j]);

// }

// printf("\n");

//}

printf(" 1 2 3 4 5 6 7 8 9 10\n"); //行标

printf(" --------------------\n");

for (i = 0; i<10; i++) //根据u数组和cbd数组的值选择输出

{ //■:未扫描,□:周围无炸弹,◇:炸弹标记

for (j = 0; j<10; j++)

{

if (j == 0)printf("%2d║ ", i+1);

if (u[i][j] == 0)printf("■");

else if (u[i][j] == 1)

{

if (cbd[i][j] == 0)printf("□");

else printf("%2d", cbd[i][j]);

}

else if (u[i][j] == -1)

{

printf("◇");

}

}

printf("\n");

}

}

int find(int cbd[10][10], int i, int j) //扫描周围炸弹数目

{

int l, c,lmin,cmin, lmax, cmax, num = 0;

l = lmin = (i - 1) >= 0 ? (i - 1) : 0; //计算行、列起点

c = cmin = (j - 1) >= 0 ? (j - 1) : 0;

lmax = ((i + 1) < 10 ? (i + 1) : 9); //计算行、列终点

cmax = ((j + 1) < 10 ? (j + 1) : 9);

for (l = lmin; l <= lmax; l++)

{

for (c = cmin; c <= cmax; c++)

{

if (l == i&&c == j)continue; //跳过自身

if (cbd[l][c] == -1)num++; //炸弹计数

}

}

return num;

}

void init(int cbd[10][10]) //cbd数组初始化(随机布置炸弹并填充各个格子的数目)

{

int n = 10, l, c, i, j;

srand(time(NULL)); //随机数种子设置

for (i = 0; i< 10; i++)

{

for (j = 0; j< 10; j++)

{

cbd[i][j] = 0; //全0填充

}

}

while (n--) //随机行列放置炸弹

{

l = rand() % 10;

c = rand() % 10;

if (cbd[l][c] != -1)cbd[l][c] = -1; //炸弹重复处理

else n++;

}

for (i = 0; i< 10; i++)

{

for (j = 0; j< 10; j++)

{

if (cbd[i][j] != -1)

{

cbd[i][j] = find(cbd, i, j); //炸弹数目填充

}

}

}

}

void open(int cbd[10][10],int u[10][10], int i, int j) //周围无炸弹时的展开函数(递归展开)

{

u[i][j] = 1;

if (cbd[i][j] == 0)

{

if(i - 1 >= 0 && u[i - 1][j] != 1)open(cbd, u, i - 1, j); //上

if(j - 1 >= 0 && u[i][j - 1] != 1)open(cbd, u, i, j - 1); //左

if (i + 1 <= 9 && u[i + 1][j] != 1)open(cbd, u, i + 1, j); //下

if (j + 1 <= 9 && u[i][j + 1] != 1)open(cbd, u, i, j + 1); //右

}

}

int judge(int u[10][10]) //判断游戏是否通关

{

int i, j, num = 0;

for (i = 0; i < 10; i++)

{

for (j = 0; j < 10; j++)

{

if (u[i][j] == 0 || u[i][j] == -1)num++;

}

}

if (num == 10)return 1;

else return 0;

}

void fail(int cbd[10][10], int u[10][10]) //游戏失败函数

{

int i, j;

for (i = 0; i < 10; i++) //输出全部炸弹信息

{

for (j = 0; j < 10; j++)

{

if (cbd[i][j] == 0)printf(" ");

else if (cbd[i][j] != -1)printf("%2d", cbd[i][j]);

else printf("●");

}

printf("\n");

}

printf("请大侠重新来过~\n");

}

void menu(int cbd[10][10],int u[10][10]) //菜单函数

{

int chs,i,j;

int boom = 10; //剩余炸弹数

int num = 0; //步数

while (1)

{

system("cls");

show(cbd,u);

printf("还有%d个炸弹\n",boom);

printf("1.扫描 2.标记 3.取消标记\n");

printf("请输入选项:>");

scanf("%d", &chs);

if (chs > 3 || chs < 1) {

printf("请输入正确选项!\n");

system("pause");

continue;

}

printf("请输入坐标:>");

scanf("%d %d", &i, &j);

if (i < 1 || i>10)

{

printf("请输入正确坐标!\n");

system("pause");

continue;

}

i--; //输入行列数处理(适用数组下标)

j--;

if (chs == 1)

{

if (cbd[i][j] == -1) {

if (num == 0) { //若第一步扫描到炸弹,就重新初始化棋盘

init(cbd);

show(cbd, u);

open(cbd, u, i, j);

num++;

continue;

}

else

{

fail(cbd, u); //否则游戏失败,循环跳出

break;

}

}

if (u[i][j] == 1) //重复扫描时的处理

{

printf("该位置已经扫描过了!\n");

system("pause");

continue;

}

open(cbd, u, i, j);

num++;

}

else if(chs == 2)

{

if (u[i][j] == 1) {

printf("该位置已经扫描过了!\n"); //只能标记未扫描到的

system("pause");

continue;

}

u[i][j] = -1;

boom --;

}

else if (chs == 3)

{

if (u[i][j] != -1) {

printf("该位置没有标记!\n"); //只能取消标记过的

system("pause");

continue;

}

u[i][j] = 0;

boom++;

}

if (judge(u)) //判断游戏是否通关

{

printf("Old Fe 666!\n"); //老铁666!,循环跳出

break;

}

}

}

int main()

{

int cbd[10][10] = { 0 }; //保存炸弹信息的二维数组

int u[10][10] = { 0 }; //保存是否翻开信息的二维数组

init(cbd); //数组初始化

menu(cbd, u); //进入菜单

return 0;

}

Tips:在扫描到周围无炸弹的格子时,要将此格子周围的部分依次打开,直到上下左右都出现炸弹数字为止,这里要用到递归的方法,我的顺序为依次递归处理上、左、下、右的格子,这里顺序可以任意。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是 C语言扫雷游戏的实现代码 的全部内容, 来源链接: utcz.com/p/244981.html

回到顶部