c语言实现扫雷(非图形化界面)
程序员文章站
2022-04-07 15:45:00
...
游戏介绍:
扫雷是一款非常有规律而又简单智力的小游戏,不了解的一定不知道它里面出现的数字都是什么含义吧?这里小编给大家解释一下,其实那上面花花绿绿的数字不是空穴来风的,而是表示当前你所点击的位置上下左右的位置的周围中隐藏的雷的个数,好吧,这样一讲你一定不太明白,那就整图吧!
每次输入一个坐标,必然要判断当前坐标是不是雷,如果不是就要显示当前坐标和其周围8个非雷坐标点的周围8个点的雷的数量。
设计思路:
棋盘设计:
这里我们采用两个二位数组,一个是显示出来的二维数组(棋盘),另一个是隐藏的棋盘(真实的棋盘);
(那么你一定很好奇为什么这样,因为要处理边界点的周围8个点的雷的个数,所以这样设计,不然边界点的周围点就不满8个数了,这样设计是为了方便代码编写和程序员理解。)
然后我们通过外部输入坐标来替代当前用户点击的是哪个坐标点,然后就是现实当前点周围出现雷的个数了。
雷的设计:
这里我们设定当前坐标是雷为1,当前坐标不是雷为0;
游戏规则:
1.输入某个坐标,显示该坐标及其周围8个点的雷的分布状况;
2.如果炸死了就要显示棋盘的雷的分布情况;
3.如果排雷成功就要显示胜利信息和棋盘的信息;
好了,现在开始撸代码吧:
game.h头文件
#ifndef Head_File
#define Head_File
#define ROW 10
#define LINE 10
#define MINE 20
void display_arr(char arr[ROW][LINE],int row,int line);
void display_mine(char arr[ROW+2][LINE+2],int row,int line);
void set_mine(char arr[ROW+2][LINE+2],int lei);
void player(char arr[ROW+2][LINE+2],char copy[ROW][LINE],int *count,int row,int line);
#endif
game.c文件
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"game.h"
void display_mine(char arr[ROW+2][LINE+2],int row,int line)
{
int i=0,j=0;
for(i=0;i<=row;i++)
{
printf(" %d ",i);
}
printf("\n--------------------------------------------\n");
for(i=1;i<=row;i++)
{
printf("%2d |",i);
for(j=1;j<=line;j++)
{
printf(" %c |",arr[i][j]);
}
printf("\n--------------------------------------------\n");
}
}
void display_arr(char arr[ROW][LINE],int row,int line)
{
int i=0,j=0;
for(i=0;i<=row;i++)
{
printf(" %d ",i);
}
printf("\n--------------------------------------------\n");
for(i=0;i<row;i++)
{
printf("%2d |",i+1);
for(j=0;j<line;j++)
{
printf(" %c |",arr[i][j]);
}
printf("\n--------------------------------------------\n");
}
}
void set_mine(char arr[ROW+2][LINE+2],int lei)
{
int x=0,y=0;
while(lei)
{
x=rand()%ROW+1;
y=rand()%LINE+1;
if(arr[x][y]=='0')
{
arr[x][y]='1';
lei--;
}
}
}
void player(char arr[ROW+2][LINE+2],char copy[ROW][LINE],int *count,int row,int line)
{
int x=0,y=0;
while(1)
{
int i=0,j=0;
printf("请玩家输入坐标:\n");
scanf("%d%d",&x,&y);
if(x>=0&&x<=row&&y<=line&&y>=0)
{
if(arr[x][y]=='0')
{
for(i=x-1;i<=x+1;i++)
{
for(j=y-1;j<=y+1;j++)
{
if(arr[i][j]=='0'&&(i-1>=0)&&(i-1<=row-1)&&(j-1>=0)&&(j-1<=line-1)&©[i-1][j-1]=='*')
{
copy[i-1][j-1]=(arr[i-1][j-1]-'0'+arr[i][j-1]-'0'+arr[i+1][j-1]-'0'+arr[i-1][j]-'0'+arr[i+1][j]-'0'+arr[i-1][j+1]-'0'+arr[i][j+1]-'0'+arr[i+1][j+1]-'0')+'0';
(*count)++;
}
else
continue;
}
}
break;
}
else
{
*count=row*line;
break;
}
}
else
{
printf("输入坐标不合法!");
}
}
}
main头文件:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include"game.h"
void menu()
{
printf("*************************************\n");
printf("************* 扫雷 *************\n");
printf("************* PLAY--1 *************\n");
printf("************* EXIT--0 *************\n");
printf("*************************************\n");
}
enum menu
{
EXIT,PLAY
};
void Game()
{
int count=0;
char mine[ROW+2][LINE+2]={0};
char arr[ROW][LINE]={0};
memset(mine,'0',sizeof(char)*(ROW+2)*(LINE+2));//初始化数组mine为0
memset(arr,'*',sizeof(char)*(ROW)*(LINE));
set_mine(mine,MINE);//埋雷操作
while(count<(ROW*LINE-MINE))
{
display_arr(arr,ROW,LINE);//打印雷盘
player(mine,arr,&count,ROW,LINE);//玩家操作
}
if(count<=ROW*LINE-MINE)
{
display_arr(arr,ROW,LINE);//打印雷盘
printf("排雷成功!\n");
}
else
{
printf("排雷失败,您被炸死了!\n");
display_mine(mine,ROW,LINE);//失败显示雷区
}
}
int main()
{
int input;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择->");
scanf("%d",&input);
switch(input)
{
case PLAY:
Game();
break;
case EXIT:
break;
default:
printf("输入非法,请重新输入:\n");
break;
}
}while(input);
system("pause");
return 0;
}
运行结果: