学完了C语言基础,做一个简易扫雷游戏,对数组等知识进行巩固。
引用要用到的头文件
#include<stdio.h>
#include<stdlib.h>//执行系统命令的函数 例如:system("cls") cls:清空屏幕 变量=rand()生成随机数
将常用变量定义为常数
#define lei 10 //雷的个数
#define lon1 9 //棋盘显示棋子的长
#define lon2 9 //棋盘显示棋子的宽
#define lons1 lon1+2 //棋盘的长
#define lons2 lon2+2 //棋盘的宽
对自定义的函数进行声明
//开始菜单
void kai();
//初始化表格
void chu(char w1[lons1][lons2], char w2[lons1][lons2], int Lon1, int Lon2);
//打印有雷表
void dayin1(char w1[lons1][lons2], int Lon1, int Lon2);
//打印无雷表
void dayin2(char w2[lons1][lons2], int Lon1, int Lon2);
//布雷
void bulei(char w1[lons1][lons2], int Lon1, int Lon2);
//排雷
int pailei(char w1[lons1][lons2], char w2[lons1][lons2], int Lon1, int Lon2,int x,int y,int m);
//结构组成
void zucheng();
主函数
int main()
{
int a = 0;
do {
kai();
scanf_s("%d", &a);
switch(a)
{
case 1:
printf("开始游戏\n");
zucheng();//结构组成
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("出错了,请重新输入\n");
break;
}
}while (a);
return 0;
}
结构组成
void zucheng() {
//数组储存
char w1[lons1][lons2] = { 0 };
char w2[lons1][lons2] = { 0 };
//初始化
chu(w1,w2,lon1,lon2);
//打印
//dayin1(w1, lon1, lon2);
dayin2(w2, lon1, lon2);
//布雷
bulei(w1, lon1, lon2);
//排雷
int m = 0;
while (1){
int x = 0;
int y = 0;
printf("请输入你要扫点的坐标:");
scanf_s("%d %d", &x, &y);
int q=pailei(w1, w2, lon1, lon2,x,y,m);
if (q == 1){
printf("革命尚未成功,同志还需努力!\n");
dayin2(w2, lon1, lon2);
}
else if (q == 2) {
printf("恭喜你,扫雷成功!\n");
dayin1(w1, lon1, lon2);
break;
}
else {
printf("****北鼻撞彩喽,让炸飞喽****\n");
dayin1(w1, lon1, lon2);
break;
}
}
}
开始界面(这个看个人喜好喽)
//开始菜单
void kai() {
printf("**************************************\n");
printf("****************1.play****************\n");
printf("****************0.exit****************\n");
printf("**************************************\n");
printf("请输入:");
}
数组初始化
//初始化
void chu(char w1[lons1][lons2], char w2[lons1][lons2], int Lon1, int Lon2) {
int i = 0;
int j = 0;
for (i = 1; i <= Lon1; i++) {
for (j = 1; j <= Lon2; j++) {
w1[i][j] = '-';//这个数组是用于放雷的
w2[i][j] = '*';//这个是用于显示的
}
}
}
打印两个数组
//有雷表
void dayin1(char w1[lons1][lons2], int Lon1, int Lon2) {
for (int i = 0; i <= Lon2; i++) {
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= Lon1; i++) {
printf("%d ", i);
for (int j = 1; j <= Lon2; j++) {
printf("%c ", w1[i][j]);
}
printf("\n");
}
}
//无雷表
void dayin2(char w2[lons1][lons2], int Lon1, int Lon2) {
for (int i = 0; i <= Lon2; i++) {
printf("%d ", i);
}
printf("\n");
for (int i = 1; i <= Lon1; i++) {
printf("%d ", i);
for (int j = 1; j <= Lon2; j++) {
printf("%c ", w2[i][j]);
}
printf("\n");
}
}
给第二个数组布雷
//布雷
void bulei(char w1[lons1][lons2], int Lon1, int Lon2) {
//雷的个数
int l = lei;
while (l) {
int x = rand() % lon1 + 1;//随机取一个棋盘宽以内x坐标
int y = rand() % lon2 + 1;//随机取一个棋盘长以内y坐标
if (w1[x][y] == '-') {
w1[x][y] = '+';
l--;
}
}
}
算法实现排雷
//扫雷
int pailei(char w1[lons1][lons2], char w2[lons1][lons2], int Lon1, int Lon2,int x,int y,int m) {
m++;
for (int i = 1; i <= Lon1; i++) {
for (int j = 1; j <= Lon2; j++) {
if (w1[i][j] == '-') {
int w = 0;
if (w1[i - 1][j - 1] == '+')
w++;
if (w1[i - 1][j] == '+')
w++;
if (w1[i - 1][j + 1] == '+')
w++;
if (w1[i][j - 1] == '+')
w++;
if (w1[i][j + 1] == '+')
w++;
if (w1[i + 1][j - 1] == '+')
w++;
if (w1[i + 1][j] == '+')
w++;
if (w1[i + 1][j + 1] == '+')
w++;
w1[i][j] =w+'0'; /离谱---将整形变量赋值给字符型数组
}
}
}
if (w1[x][y] == '+') {
return 0;//踩到雷了,被炸死了,游戏失败。
}
if (m == lon1 * lon2 - lei)
return 2;//排到只剩下雷了,游戏胜利。
if (w1[x][y] != '+') {
w2[x][y] = w1[x][y];
return 1;//游戏继续。
}
}
OK,到此为止一个简易扫雷已经完成了!