蹦擦擦我终于来更博客啦!
其实期间一直有写但周内事情实在太多没有办法整理好逻辑也就没有把代码贴上来。这次趁热打铁把刚写好的扫雷小游戏先贴上来吧!
扫雷游戏的逻辑分为以下几个步骤:
0.这里是程序开始函数声明与宏定义
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 11
#define COL 11
#define Mine 10
void StartMenu();//开始选择菜单
void GameStart();//游戏主体
void Map(char RealMap[ROW][COL], char ShowMap[ROW][COL]);//初始化两个地图
void SetMine(char Map[ROW][COL]);//在RealMap埋雷
int GetMine(char Map[ROW][COL], int x, int y);//获取所取点四周的雷数
void PrintRealMap(char RealMap[ROW][COL]);//打印RealMap
void PrintShowMap(char ShowMap[ROW][COL]);//打印ShowMap
void PlayGame(char ShowMap[ROW][COL], char RealMap[ROW][COL]);//交互界面
1.打印菜单,进行选择后进入游戏
//启动菜单
void StartMenu(){
printf("---------------------------\n");
printf(" 1.进入游戏\n");
printf(" 0.退出游戏\n");
printf("---------------------------\n");
}
//主函数
int main(void){
int put = 1;
StartMenu();
while (put){
printf("请输入:\n");
scanf("%d", &put);
switch (put){
case 1:
GameStart();
break;
case 0:
break;
}
system("pause");
return 0;
}
}
2.游戏运行的整体进程
//开始游戏
void GameStart(){
char ShowMap[ROW][COL];
char RealMap[ROW][COL];
Map(RealMap,ShowMap);
PrintShowMap(ShowMap);
SetMine(RealMap);
PlayGame(ShowMap, RealMap);
}
3.需要两个地图一个与用户交互用,一个用于布雷
//初始化
void Map(char RealMap[ROW][COL],char ShowMap[ROW][COL]){
int i,j;
//1.定义好两个地图
for (i = 1; i <= 9; i++){
for (j = 1; j <= 9; j++){
ShowMap[i][j] = '*';
RealMap[i][j] = '0';//0代表无雷,1代表有雷
}
}
}
4.在RealMap函数中布雷
//在RealMap中布雷
void SetMine(char Map[ROW][COL]){
int x = 0;
int y = 0;
int count = Mine;
srand(time(NULL));
while (count){ //判断雷是否布满
x = rand() % (ROW-2) + 1;
y = rand() % (COL-2) + 1;
if (Map[x][y] == '0'){
Map[x][y] = '1';
count--; //每布一个雷,count-1
}
}
}
5.定义两个打印函数,一个在没踩雷时刷新与用户交互的地图,一个在踩雷后打印埋雷的地图
//踩雷时打印RealMap
void PrintRealMap(char RealMap[ROW][COL]){
int i, j;
for (i = 1; i <= 9; i++){
for (j = 1; j <= 9; j++){
printf("%c ", RealMap[i][j]);
}
printf("\n");
}
}
//没踩雷时刷新ShowMap
void PrintShowMap(char ShowMap[ROW][COL]){
int i, j;
for (i = 1; i <= 9; i++){
printf(" %d ", i);
}
printf("\n");
for (i = 1; i <= 9; i++){
printf("%d", i);
for (j = 1; j <= 9; j++){
printf("%c ",ShowMap[i][j]);
}
printf("\n");
}
}
6.正式开始游戏后,用户输入坐标(x,y),统计(x,y)四周的雷数
//统计一个位置四周的雷数
int GetMine(char Map[ROW][COL],int x,int y){
int count = 0;
if (Map[x - 1][y - 1] == '1')
count++;
if (Map[x - 1][y] == '1')
count++;
if (Map[x - 1][y + 1] == '1')
count++;
if (Map[x][y - 1] == '1')
count++;
if (Map[x][y + 1] == '1')
count++;
if (Map[x + 1][y - 1] == '1')
count++;
if (Map[x + 1][y] == '1')
count++;
if (Map[x + 1][y + 1] == '1')
count++;
return count;
}
7.游戏的主体部分
//玩游戏
void PlayGame(char ShowMap[ROW][COL], char RealMap[ROW][COL]){
int x, y;
int count =0;
while (count != (ROW-2) * (COL-2) - Mine){
printf("请输入坐标:\n");
scanf("%d %d", &x, &y);
if (RealMap[x][y] == '1'){
printf("踩到雷了\n");
PrintRealMap(RealMap);
return;
}else{
ShowMap[x][y]=GetMine(RealMap,x,y)+'0';
PrintShowMap(ShowMap);
}
}
printf("扫雷成功\n");
}
以上只是初级版的扫雷游戏,还存在一些鸡肋的地方。比如在正版的扫雷游戏中,点击一个方块会随机将其临近的几个方块也打开,而此版并没有这种功能。以后还会更新进阶版的,会对代码以及界面风格进行优化。
【BY StAY_】