扫雷游戏
分析:首先,我们应该创建一的二位数字组mine[ROWS][COLS],ROWS 设为10,COLS设为10,用来装我们的雷,在装雷之前,我们应该初始化这个二维数组,全部元素初始化为字符‘0’,初始化之后,我们紧接着布雷,确定雷的个数DEFAULT_COUNT为20,然后在二维数组的随机位置布下雷,使布雷的元素位置赋值为字符‘1’,这个二位数组装的是我们的雷,但玩家在玩时,若此位置不为雷,则在此位置显示周围一定区域(8个元素)总共雷的个数,但是边边的元素周围不够八个,所以我们在这里设置一个技巧,数组的行和列都为ROWS+2,但雷阵只显示行和列都从1到ROWS +1的部分,只在显示的部分布雷。
若在数组mine[ROWS+2][COLS+2]中显示元素的个数,则在进行判断该位置是否是雷时(mine[x][y]!=‘0’)产生了干扰,所以我们应该再次设置一个二维数组show[ROWS+2][COLS+2],初始化为字符‘*’,当计算出该位置的雷的个数时,显示在该二位数组中,并且在玩家没有输或赢之前,屏幕上都只是打印该二维数组show[ROWS+2][COLS+2]行和列都从1到ROWS +1的部分,当玩家赢或则输的时候,打印雷阵的棋盘。
<span style="font-size:18px;">头文件.h文件
#ifndef __GAME_H__
#define __GAME_H__
#define ROWS 10
#define COLS 10
#define DEFAULT_COUNT 20
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
void menu();
void set_mine(char mine[ROWS+2][COLS+2],int row,int col);
void display(char mine[ROWS+2][COLS+2],int row,int col);
int get_mine_count(char mine[ROWS+2][COLS+2],int x,int y);
playgame(char mine[ROWS+2][COLS+2],char show[ROWS+2][COLS+2],int row,int col);
#endif //___GAME_H__
游戏实现.c文件
#include"game2.h"
void menu() //游戏菜单
{
printf(" 欢迎进入扫雷游戏\n");
printf("*****1.play******\n");
printf("*****0.exit******\n");
}
void set_mine(char mine[ROWS+2][COLS+2],int row,int col) //设置雷阵
{
int count=DEFAULT_COUNT;
while(count)
{
int x=rand()%10+1;
int y=rand()%10+1;
if(mine[x][y]=='0')
{
mine[x][y]='1';
count--;
}
}
}
void display(char mine[ROWS+2][COLS+2],int row,int col) // 打印雷阵
{
int i=0;
int j=0;
printf(" ");
for(i=0; i<=ROWS; i++)
{
printf("%d ",i);
}
printf("\n");
printf(" ---------------------");
printf("\n");
for(i=1; i<=ROWS; i++)
{
printf("%2d| ",i);
for(j=1; j<=COLS; j++)
{
printf("%c ",mine[i][j]);
}
printf("\n");
}
}
int get_mine_count(char mine[ROWS+2][COLS+2],int x,int y) //周围区域雷的个数
{
return ((mine[x-1][y-1]-'0')+
(mine[x][y-1]-'0')+
(mine[x+1][y-1]-'0')+
(mine[x-1][y]-'0')+
(mine[x+1][y]-'0')+
(mine[x-1][y+1]-'0')+
(mine[x][y+1]-'0')+
(mine[x+1][y+1]-'0'));
}
playgame(char mine[ROWS+2][COLS+2],char show[ROWS+2][COLS+2],int row,int col) //扫雷游戏
{
int x=0;
int y=0;
int win=0;
while(1)
{
printf("请输入坐标:\n");
scanf("%d%d",&x,&y);
if((x>=1)&&(x<=10)&&(y>=1)&&(y<=10))
{
if(mine[x][y]=='1')
{
printf("被炸\n");
display(mine,row,col);
printf("\n");
break;
}
else
{
int ret=0;
win++;
ret= get_mine_count(mine,x,y);
show[x][y]=ret+'0';
display(show,row,col);
if(win==ROWS*COLS-DEFAULT_COUNT )
{
printf("赢了\n");
display(mine,row,col);
break;
}
}
}
else
{
printf("请重新输入:\n");
}
}
}
测试程序
#include"game2.h"
void game(char mine[ROWS+2][COLS+2],char show[ROWS+2][COLS+2],int row,int col)
{
memset(mine,'0',row*col*sizeof(char));
memset(show,'*',row*col*sizeof(char));
set_mine(mine,row,col);
/*display(mine,row,col);*/ //测试时需要
display(show,row,col);
playgame(mine,show,row,col);
}
int main()
{
int input;
char mine[ROWS+2][COLS+2];
char show[ROWS+2][COLS+2];
srand((unsigned)time(NULL));
do
{
menu();
printf("请输入你的选择:\n");
scanf("%d",&input);
switch(input)
{
case 1:
game(mine,show,ROWS+2,COLS+2);
break;
case 0:
break;
default:
printf("输入错误,请重新输入\n");
}
}while(input);
return 0;
}
</span>