大家好,我是寒窗烟雨,今天我带来的扫雷的设计,用C语言一一呈现。
希望大家喜欢,对大家有所帮助,如有疑问或意见可以在评论区提出来,谢谢。
一、游戏思路1.1变量存放。图1-0;
扫雷大家应该都不陌生,如图1-0图展示。
1.2计算越界我们需要一个二维数组,考虑到要用数字表示周围地雷的数量。
如果地雷用数字表示,不太好和周围数量分清,如此,我打算用字母‘E’表示地雷,与周围数字区分开来。既然地雷用字符表示,那数组类型就是char;
考虑到展示和地雷存放不能放在同一个数组中;那么就需要两个数组
char show[][];//第一个展示数组 char mine[][];//第二个地雷数组
最开始简单点,先初始化一个9*9的游戏雷区;那么定义
char show[9][9]; char mine[9][9];
1.3计算周围地雷数量现在还有一个问题需要考虑:
图1-1;
如图1-1图显示,假设我们在3*3中扫雷;
如果我们下O的地方,首先我们需要看它是不是雷,不是就统计它周围8格的地雷数量,数量为‘2’个。
如果我们下X的地方,首先它是不是雷,然后开始统计周围8格,这时发生一个问题,X的周围只有3格,其他5格在数组中是越界了,会使程序出错崩溃;
图1-3;
解决方法:我选在数组的外围再加一圈,变成5*5;如图1-3;
这样X的一圈都可以不会发生数组越界问题,棋盘展示还是3*3,而最外面一圈什么都不存;
这样我们的两个数组,应该这样初始化:
char show[9+2][9+2]; char mine[9+2][9+2];
2、程序框架图1-4;
当我们需要算O周围的地雷数量时,我们需要用到周围格子的坐标;
他们的坐标变化相比O坐标如图1-4,如此就可以通过例:mine[x-1][y]找到O坐标上面的格子内容;通过判断,
if(mine[x-1][y] == ‘E’) { count++; //地雷数量 }
最后通过
show[x][y] = count+48; //+48是吧count数量变成字符数量 //ASCII码中‘0’十进制值为48;
最后用display函数展示show函数;
3、完善程序创建项目和.h和.c文件,然后对其把程序框架搭建好22
//-----main.c----- #define _CRT_SECURE_NO_WARNINGS #include "game.h" int main() { int ch; do { menu(); while (scanf("%d", &ch) != 1) //防止输入字母导致死循环 { int c = getchar(); //个人习惯,防止getchar报警 continue; } switch (ch) { case 0: //退出 break; case 1: //进入游戏环节 game(); break; default://输入错误 printf("输入错误,请重新输入!\n"); break; } }while(ch); return 0; }
//进入游戏环节 #pragma once #include
#include #include #include "game.c" #define COW 9 //展示长度 #define COL 9 #define COWS COW+2 //存储长度 #define COLS COL+2 #define CWCL COW*COL //地雷最大数量 #define line 10 //设置地雷数量 void menu(); // 菜单; void game();//游戏环节 void input_gamer(); //玩家输入,判断棋局并做处理 void display_char(); //展示棋局 void ending(); //判断结束 //-----game.c----- #define _CRT_SECURE_NO_WARNINGS #include "game.h" void menu() { printf("******************************\n"); printf("********** 1.PLAY **********\n"); printf("******************************\n"); printf("********** 0.EIXT **********\n"); printf("******************************\n"); } void game() { char show[COWS][COLS]; //展示数组 char mine[COWS][COLS]; //地雷数组 int e_char[CWCL][2]; //地雷坐标 init_char(); while (1) { input_gamer(); //玩家输入,判断棋局并做处理 display_char(); //展示棋局 ending(); //判断结束 } } void init_char() { } void input_gamer() { } void display_char() { } void ending() { }
//---main.c---
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
int main()
{
srand((unsigned int)time(NULL)); //设置随机函数
int ch = 2;
do
{
menu();
printf(">>");
while (scanf("%d", &ch) != 1)
{
getchar();
continue;
}
switch (ch)
{
case 0: //退出
break;
case 1: //进入游戏环节
game();
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
} while (ch);
return 0;
}
//---game.c---
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("******************************\n");
printf("********** 1.PLAY **********\n");
printf("******************************\n");
printf("********** 0.EIXT **********\n");
printf("******************************\n");
}
void game()
{
char show[COWS][COLS]; //展示数组
char mine[COWS][COLS]; //地雷数组
int e_char[CWCL][2] = {0}; //地雷坐标
printf("开始扫雷游戏!\n");
init_char(show, mine, e_char);
int ch = 1;
int sh = 0;
while (ch)
{
display_char(show); //展示棋局
//display_char(mine); //展示棋局
sh = input_gamer(show,mine); //玩家输入,判断棋局并做处理
ch = ending(sh,show,e_char); //判断结束
//ch--;
}
}
void init_char(char show[COWS][COLS], char mine[COWS][COLS], int e_char[CWCL][2])
{
int i = 0;
int j = 0;
for (i = 0; i < COWS; i++)
{
for (j = 0; j < COLS; j++)
{
show[i][j] = '*';
mine[i][j] = ' ';
}
}
int len = 0;
while (len < line)
{
int x = rand() % COW + 1; //范围1~9;
int y = rand() % COL + 1; //范围1~9;
if (mine[x][y] == ' ')
{
mine[x][y] = '!';
e_char[len][0] = x;
e_char[len][1] = y;
len++;
}
}
}
int input_gamer(char show[COWS][COLS], char mine[COWS][COLS])
{
int x = 0;
int y = 0;
printf("请输入坐标:\n>>");
int xy = 1;
while (xy)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
{
xy = 0;
}
else
{
printf("坐标超出范围,请重新输入0~9范围的坐标:\n>>");
}
}
int coun = 0;
static int st = CWCL-line;
if (mine[x][y] != '!')
{
st--;
coun = rever(mine, x, y);
if (0 == coun)
{
show[x][y] = ' ';
}
else
{
show[x][y] = coun+48;
}
if (0 == st)
{
return 2;
}
return 0;
}
else
{
show[x][y] = '!';
return 1;
}
}
void display_char(char show[COWS][COLS])
{
int i = 0;
int j = 0;
for (i = 0; i <= COW; i++)
{
for (j = 0; j <= COW; j++)
{
if (0 == i)
{
printf("%d ", j);
}
else if (0 == j)
{
printf("%d ", i);
}
else
{
printf("%c ", show[i][j]);
}
}
printf("\n");
}
}
int ending(int sh, char show[COWS][COLS], int e_char[CWCL][2])
{
if (0 == sh)
{
return 1;
}
else
{
int i = 0;
for (i = 0; i < line; i++)
{
show[e_char[i][0]][e_char[i][1]] = '!';
}
display_char(show);
if(1 == sh)
printf("你排到雷了,游戏失败!\n");
else
printf("你已经把雷排完了,恭喜你游戏获胜了!\n\n");
return 0;
}
}
int rever(char mine[COWS][COLS],int x,int y)
{
return (int)(mine[x-1][y-1] - ' ' +
mine[x - 1][y] - ' ' +
mine[x - 1][y+1] - ' ' +
mine[x][y - 1] - ' ' +
mine[x][y] - ' ' +
mine[x][y + 1] - ' ' +
mine[x + 1][y - 1] - ' ' +
mine[x + 1][y] - ' ' +
mine[x + 1][y + 1] - ' '); //'!' - ' ' = int 1; ' ' - ' ' = int 0;
}
//---game.h---
#pragma once
#include
#include
#include
//#include "game.c"
#define COW 9 //展示长度
#define COL 9
#define COWS (COW+2) //存储长度
#define COLS (COL+2)
#define CWCL (COW*COL) //地雷最大数量
#define line 10 //设置地雷数量
void menu(); // 菜单;
void game();//游戏环节
void init_char(char show[COWS][COLS], char mine[COWS][COLS], int e_char[CWCL][2]);
int input_gamer(char show[COWS][COLS], char mine[COWS][COLS]); //玩家输入
void display_char(char show[COWS][COLS]); //展示棋局
int ending(int sh, char show[COWS][COLS], int e_char[CWCL][2]); //判断结束
4、结语
对我来说,这篇博客是失败的,这个扫雷项目也是写的很糟糕。后面我会找个时间把扫雷重新理顺,然后重新弄一遍。
最后感谢大家看到这里。
有疑问和建议都可以和我说。
把地雷数量设置为80,棋盘为9*9:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)