相信大家都有玩过一个游戏,那就是扫雷,今天我就给大家分享一个扫雷的c程序。
#pragma once
#define ROW 9
#define COL 9
#define ROWS 11
#define COLS 11
#define EASY 10
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void menu();
void game();
void init(char a[ROWS][COLS], int row, int col);
void show(char a[ROWS][COLS], int row, int col);
void set(char a[ROWS][COLS], int row, int col);
void win(char a[ROWS][COLS], char b[ROWS][COLS], int rows, int cols);
void add(char a[ROWS][COLS], char b[ROWS][COLS], int i, int j);
这个是程序的头文件test.h,主要是包含源程序所需要使用的头文件和函数声明。
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
printf("请输入你的选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("选择错误,请重新选择:\n");
}
} while (input);
return 0;
}
源程序play.c,menu函数打印一个菜单,让玩家选择玩不玩游戏,通过switch语句来执行。
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
void menu()
{
printf("************************\n");
printf("**** 1.play ****\n");
printf("**** 0.exit ****\n");
printf("************************\n");
}
void init(char a[ROWS][COLS],int row,int col)
{
int i, j;
for (i = 1; i <= row; i++)
{
for (j = 1; j <= col; j++)
{
a[i][j] = '*';
}
}
}
void show(char a[ROWS][COLS], int row, int col)
{
int i, j;
for (i = 0; i <= row; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= row; i++)
{
printf("%d ", i);
for (j = 1; j <= col; j++)
{
printf("%c ", a[i][j]);
}
printf("\n");
}
}
void set(char a[ROWS][COLS], int row, int col)
{
int i, j, n = EASY;
while(n)
{
i = rand() % 9 + 1;
j = rand() % 9 + 1;
if (a[i][j] == '0' && a[i][j] != '1')
{
a[i][j] = '1';
n--;
}
}
}
void add(char a[ROWS][COLS], char b[ROWS][COLS], int i, int j)
{
int m, n;
char x = 0;
if (a[i][j] != ' ')
{
a[i][j] = ' ';
for (m = i - 1; m <= i + 1; m++)
{
for (n = j - 1; n <= j + 1; n++)
{
{
if (a[m][n] != ' ')
{
x = x + (a[m][n] - '0');
}
}
}
}
x = x + 48;
if (x != '0')
{
b[i][j] = x;
}
if (x == '0')
{
for (m = i - 1; m <= i + 1; m++)
{
for (n = j - 1; n <= j + 1; n++)
{
if (b[m][n] == '*')
{
b[m][n] = '0';
add(a, b, m, n);
}
}
}
}
}
}
void win(char a[ROWS][COLS], char b[ROWS][COLS], int rows, int cols)
{
int i = 0;
int j = 0;
int count = 0;
while (1)
{
printf("请输入你要走的位置:\n");
scanf("%d%d", &i, &j);
if (i >= 0 && i <= 9 && j >= 0 && j <= 9 && b[i][j] == '*')
{
if (a[i][j] == '0')
{
add(a, b, i, j);
show(b, ROW, COL);
for (i = 1; i <= ROW; i++)
{
for (j = 1; j <= COL; j++)
{
if (b[i][j] != '*')
{
count++;
}
}
}
if (count == (81 - EASY))
{
printf("恭喜你,排雷成功。\n"); break;
}
}
else
{
printf("很遗憾你被炸死了。\n");
show(a, ROW, COL);
break;
}
}
else
{
printf("输入错误,请重新输入:\n");
}
}
}
void game()
{
int i, j;
char a[ROWS][COLS] = { 0 };
char b[ROWS][COLS] = { 0 };
for (i = 0; i < ROWS; i++)
{
for (j = 0; j < COLS; j++)
{
a[i][j] = '0';
}
}
init(b, ROW, COL);
show(b, ROW, COL);
set(a, ROW, COL);
win(a, b, ROWS, COLS);
}
源程序game.c,实现游戏的主要程序。
首先对a和b两个数组进行初始化,a数组里全放‘0’,b全放‘*’,a数组就是我们用来放置雷的数组,b数组用于玩家的展示。
set函数实现对a数组进行随机放置雷。
win函数用于判断玩家是否踩到雷,如果没有踩到雷,就将b数组那一步显示,并且返回周围有几个雷,用show函数展示出来。
win函数中的add函数用于b数组的展开,如果玩家选的那一步周围没有雷就会显示周围的数据,递归调用add是为了大部分的展开b数组。