在C语言的学习过程中,自主实现小游戏能提高我们对C语言的兴趣,我今天将为大家带来扫雷小游戏的实现。
文章目录
扫雷游戏需要的文档
game.c ----- 游戏代码的实现
game.h----- 游戏代码的声明
test.c ----- 扫雷小游戏的检验
菜单的实现
1.选择是否开始游戏
2.选择是否退出游戏
3.判断非法输入
代码如下:
void menu ()
{
printf("######################################################\n");
printf("############### 1.play ####### 0.exit ################\n");
printf("######################################################\n");
}
int main ()
{
int input = 0;
do
{
menu();
scanf("%d",&input);
switch(input)
{
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("退出游戏。\n");
break;
default:
printf("输入错误,请重新输入。\n");
break;
}
}while(input);
}
初始化布置雷的表格和排雷信息的表格
void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set)
{
int i = 0;
for(i=0;i<rows;i++)
{
int j = 0;
for(j=0;j<cols;j++)
{
Board[i][j]=set;
}
}
}
随机布置雷
void setmine (char Board[ROWS][COLS],int row,int col)
{
int count = 0;
while(count<easy_count)
{
int x = rand()%row+1;
int y = rand()%col+1;
if(x>=1 && x<=row && y>=1 && y<=col)
{
if(Board[x][y]=='0')
{
Board[x][y]='1';
count++;
}
}
}
}
打印排雷信息
void DisplayBoard(char Board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for(i=0;i<=col;i++)
{
printf("%d ",i);
}
printf("\n");
for(i=1;i<=row;i++)
{
printf("%d ",i);
for(j=1;j<=col;j++)
{
printf("%c ",Board[i][j]);
}
printf("\n");
}
}
排查雷
int mine_count (char Board[ROWS][COLS],int x,int y)
{
return Board[x-1][y-1]+
Board[x-1][y]+
Board[x-1][y+1]+
Board[x][y-1]+
Board[x][y+1]+
Board[x+1][y-1]+
Board[x+1][y]+
Board[x+1][y+1]-8*'0';
}
void Findmine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row ,int col)
{
int x = 0;
int y = 0;
int win = 0;
while(win<row*col-easy_count)
{
scanf("%d %d",&x,&y);
//判断坐标合法
if(x>=1 && x <=row && y>=1 && y<=col)
{
//判断该坐标是否被排过
if(Show[x][y]=='*')
{
if(Mine[x][y]=='0')
{
int ret = mine_count(Mine,x,y);
Show[x][y] = ret + '0';
DisplayBoard(Show,ROW,COL);
win++;
}
else
{
printf("你已经被炸死了。\n");
break;
}
}
else
{
printf("你已经排查过该坐标。\n");
}
}
else
{
printf("输入的坐标不合分,请重新输入。\n");
}
}
}
扫雷游戏的整体声明
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define easy_count 10
void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char Board[ROWS][COLS],int row,int col);
void setmine (char Board[ROWS][COLS],int row,int col);
void Findmine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row ,int col);
函数的整体调用
void game ()
{
char mine[ROWS][COLS]={0};
char show[ROWS][COLS]={0};
//初始化
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');
//打印排雷信息
DisplayBoard(show,ROW,COL);
//布置雷
setmine(mine,ROW,COL);
//排雷
Findmine(mine,show,ROW,COL);
}
game.c文档代码
#include "game.h"
void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set)
{
int i = 0;
for(i=0;i<rows;i++)
{
int j = 0;
for(j=0;j<cols;j++)
{
Board[i][j]=set;
}
}
}
void DisplayBoard(char Board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for(i=0;i<=col;i++)
{
printf("%d ",i);
}
printf("\n");
for(i=1;i<=row;i++)
{
printf("%d ",i);
for(j=1;j<=col;j++)
{
printf("%c ",Board[i][j]);
}
printf("\n");
}
}
void setmine (char Board[ROWS][COLS],int row,int col)
{
int count = 0;
while(count<easy_count)
{
int x = rand()%row+1;
int y = rand()%col+1;
if(x>=1 && x<=row && y>=1 && y<=col)
{
if(Board[x][y]=='0')
{
Board[x][y]='1';
count++;
}
}
}
}
int mine_count (char Board[ROWS][COLS],int x,int y)
{
return Board[x-1][y-1]+
Board[x-1][y]+
Board[x-1][y+1]+
Board[x][y-1]+
Board[x][y+1]+
Board[x+1][y-1]+
Board[x+1][y]+
Board[x+1][y+1]-8*'0';
}
void Openzero (char Mine[ROWS][COLS],char Show[ROWS][COLS],int x,int y,int win)
{
int ret = 0;
//判断坐标是否合法
if(x>1 && x<=ROW && y>1 && y>COL)
{
return ;
}
//判断是否被排过雷
if(Show[x][y]!='*')
{
return ;
}
ret = mine_count(Mine,x,y);
Show[x][y] = ret + '0';
win++;
//判断坐标周围是否有雷
if(Show[x][y]>'0')
{
return ;
}
if(Show[x][y]=='0')
{
Openzero (Mine,Show,x-1,y-1,win);
Openzero (Mine,Show,x,y-1,win);
Openzero (Mine,Show,x+1,y-1,win);
Openzero (Mine,Show,x-1,y,win);
Openzero (Mine,Show,x+1,y+1,win);
Openzero (Mine,Show,x+1,y,win);
Openzero (Mine,Show,x-1,y+1,win);
Openzero (Mine,Show,x,y+1,win);
}
}
void Findmine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row ,int col)
{
int x = 0;
int y = 0;
int win = 0;
while(win<row*col-easy_count)
{
scanf("%d %d",&x,&y);
//判断坐标合法
if(x>=1 && x <=row && y>=1 && y<=col)
{
//判断该坐标是否被排过
if(Show[x][y]=='*')
{
if(Mine[x][y]=='0')
{
Openzero(Mine,Show,x,y,win);
DisplayBoard(Show,ROW,COL);
}
else
{
printf("你已经被炸死了。\n");
DisplayBoard(Mine,ROW,COL);
break;
}
}
else
{
printf("你已经排查过该坐标。\n");
}
}
else
{
printf("输入的坐标不合法,请重新输入。\n");
}
}
}
game.h文档代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define easy_count 10
void InitBoard(char Board[ROWS][COLS],int rows,int cols,char set);
void DisplayBoard(char Board[ROWS][COLS],int row,int col);
void setmine (char Board[ROWS][COLS],int row,int col);
void Findmine(char Mine[ROWS][COLS],char Show[ROWS][COLS],int row ,int col);
test.c文档代码
#include "game.h"
void menu ()
{
printf("######################################################\n");
printf("############### 1.play ####### 0.exit ################\n");
printf("######################################################\n");
}
void game ()
{
char mine[ROWS][COLS]={0};
char show[ROWS][COLS]={0};
//初始化
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');
//打印排雷信息
DisplayBoard(show,ROW,COL);
//布置雷
setmine(mine,ROW,COL);
//排雷
Findmine(mine,show,ROW,COL);
}
int main ()
{
int input = 0;
do
{
menu();
scanf("%d",&input);
switch(input)
{
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("退出游戏。\n");
break;
default:
printf("输入错误,请重新输入。\n");
break;
}
}while(input);
}
关注点一点,下期更精彩。