C实现简单扫雷
程序员文章站
2022-04-12 10:41:37
...
主要实现以下功能:
(1)第一次不被炸死;
(2)若第一次没有踩到雷,以(x,y)坐标为中心进行展开,并统计雷的数目;
实现该游戏思路如下:
(1)需要用一个数组去布置雷,另一个数组进行显示;分别用mine[ ][ ]和board[ ][ ]表示;
(2)对这两个数组进行初始化,将mine[ ][ ]数组初始化成0,将board[ ][ ]数组初始化成*,
(3)在mine[ ][ ]数组中随机布置雷;
(4)设计扫雷过程:输入位置,是雷,报错并退出;不是雷,显示周围雷的个数。
具体代码如下:
(1)防止第一次被炸死,如果第一次踩到雷,则将此处设置为0,并重新布雷,进行下一次扫雷;
void safe_mine(char mine[ROWS][COLS],char board[ROWS][COLS],int row, int col)
{
int x=0;
int y=0;
printf("请输入坐标:>");
scanf("%d%d",&x,&y);
if(((x>=1)&&(x<=ROW))&&((y>=1)&&(y<=COL)))
{
if(mine[x][y]=='1')
{
mine[x][y]='0';
board[x][y]=get_count_mine(mine,x,y)+'0';
open_mine(mine,board,x,y);
display_board(board,ROWS,COLS);
set_mine(mine);
}
else
{
if(board[x][y]=='0')
board[x][y]=get_count_mine(mine,x,y)+'0';
open_mine(mine,board,x,y);
display_board(board,ROWS,COLS);
}
}
else
{
printf("下标有误,请重新输入\n");
}
}
(2)第一次扫雷后,统计坐标(x,y)周围雷的个数,将其个数显示在board棋盘的(x,y)坐标处,并以(x,y)为中心进行展开;
void open_mine(char mine[ROWS][COLS],char board[ROWS][COLS],int x, int y)//坐标周围展开函数
{
if (mine[x-1][y-1]=='0')
{
board[x-1][y-1]=get_count_mine(mine,x- 1,y-1)+'0';
}
else
{
board[x-1][y-1]='@';
}
if (mine[x-1][y]=='0')
{
board[x-1][y]=get_count_mine(mine,x-1,y)+'0';
}
else
{
board[x-1][y]='@';
}
if (mine[x-1][y+1]=='0')
{
board[x-1][y+1]=get_count_mine(mine,x-1,y+1)+'0';
}
else
{
board[x-1][y+1]='@';
}
if (mine[x][y-1]=='0')
{
board[x][y-1]=get_count_mine(mine,x,y-1)+'0';
}
else
{
board[x][y-1]='@';
}
if (mine[x][y+1]=='0')
{
board[x][y+1]=get_count_mine(mine,x,y+1) + '0';
}
else
{
board[x][y+1]='@';
}
if (mine[x+1][y-1]=='0')
{
board[x+1][y-1]=get_count_mine(mine,x+1,y-1)+'0';
}
else
{
board[x+1][y-1]='@';
}
if (mine[x+1][y]=='0')
{
board[x+1][y]=get_count_mine(mine,x+1,y)+'0';
}
else
{
board[x+1][y]='@';
}
if (mine[x+1][y+1]=='0')
{
board[x+1][y+1]=get_count_mine(mine,x+1,y+1)+'0';
}
else
{
board[x+1][y+1]='@';
}
}
(3)初始化棋盘
//初始化mine[][]成'0'
void init_mine(char mine[ROWS][COLS],int row,int col)
{
memset(mine,'0',row*col*sizeof(mine[0][0]));
}
//初始化board[][]成'*'
void init_board(char board[ROWS][COLS],int row,int col)
{
memset(board,'*',row*col*sizeof(board[0][0]));
}
(4)显示棋盘
//显示布雷的棋盘
void display_mine(char mine[ROWS][COLS],int row,int col)
{
int i=0;
int j=0;
printf(" 1 2 3 4 5 6 7 8 9 10 \n");
for(i=1;i<row-1;i++)
{
printf(" — — — — — — — — — —\n");
printf("%2d |",i);
for(j=1;j<col-1;j++)
{
printf("%c |",mine[i][j]);
}
printf("\n");
}
printf(" — — — — — — — — — —\n");
}
//显示棋盘
void display_board(char board[ROWS][COLS],int row,int col)
{
int i=0;
int j=0;
printf(" 1 2 3 4 5 6 7 8 9 10\n");
for(i=1;i<row-1;i++)
{
printf(" — — — — — — — — — —\n");
printf("%2d |",i);
for(j=1;j<col-1;j++)
{
printf("%c |",board[i][j]);
}
printf("\n");
}
printf(" — — — — — — — — — —\n");
}
(5)布雷
//布雷
void set_mine(char mine[ROWS][COLS])
{
int x=0;
int y=0;
int i=0;
int count=MINE_COUNT;
/*for(i=1;i<=count;i++)
{
x=rand()%ROW+1;
y=rand()%COL+1;
if(mine[x][y]=='0')
mine[x][y]='1';
else
i--;
} */
while(count)
{
x=rand()%ROW+1;
y=rand()%COL+1;
if(mine[x][y]=='0')
{
mine[x][y]='1';
count--;
}
else
continue;
}
}
(6)统计(x,y周围雷的个数
int get_count_mine(char mine[ROWS][COLS],int x,int y)
{
return ( mine[x-1][y]
+mine[x-1][y-1]
+mine[x][y-1]
+mine[x+1][y-1]
+mine[x+1][y]
+mine[x+1][y+1]
+mine[x][y+1]
+mine[x-1][y+1]-8*'0');
}
(7)测试代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"saolei.h"
game()
{
char mine[ROWS][COLS]={0};
char board[ROWS][COLS]={0};
int win=0;
int x=0;
int y=0;
int ret=1;
int count=0;
init_mine(mine,ROWS,COLS);
init_board(board,ROWS,COLS);
set_mine(mine);
display_mine(mine,ROWS,COLS);
display_board(board,ROWS,COLS);
//扫雷
printf("开始扫雷.....................................\n");
safe_mine(mine,board,ROWS,COLS);//防止第一次被炸死
display_mine(mine,ROWS,COLS);
while(win<=(ROW*COL-MINE_COUNT))
{
printf("请输入坐标:>");
scanf("%d%d",&x,&y);
if(((x>=1)&&(x<=ROW))&&((y>=1)&&(y<=COL)))
{
if(mine[x][y]=='1')
{
printf("很遗憾,你被炸死了\n");
break;
}
else
{
if(board[x][y]=='*')
win++;
count=get_count_mine(mine,x,y);
board[x][y]=count+'0';
open_mine(mine,board,x,y);
display_board(board,ROWS,COLS);
}
}
else
{
printf("下标有误,请重新输入\n");
}
}
if(win>(ROW*COL-MINE_COUNT))
printf("恭喜你排雷成功\n");
}
menu()
{
printf("**************\n");
printf("****1.play****\n");
printf("****0.exit****\n");
printf("**************\n");
}
test()
{
int input=0;
srand((unsigned)time(NULL));
do
{
menu();
printf("欢迎来到扫雷游戏,请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新输入:>\n");
break;
}
}while(input);
}
int main()
{
test();
return 0;
}
上一篇: 利用来巧妙实现map功能...
下一篇: JS中this与event的区别详解