扫雷游戏:
1.第一次不会被炸死。
2.坐标周围没有雷,实现展开。
第一步:先建个头文件,方便我们写测试,游戏文件。
game.h 如下:
#ifndef _GAME_H_ //防止头文件被重复引用,用ifndef/define/endif产生预处理块
#define _GAME_H_
typedef unsigned int uint;
enum OPTION //利用枚举,把EXIT,初始化为0,START为1
{
EXIT,
START
};
enum MINE_COUNT //同理
{
EASY_COUNT=10
};
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set); //声明函数
void PrintBoard(char board[ROWS][COLS],int rows,int cols);
void SetMine(char board[ROWS][COLS],int row,int col,int x,int y);
int GetMineCount(char mine[ROWS][COLS],int x,int y);
void expend (char board[ROWS][COLS],char arr[ROWS][COLS],int row,int col,int x,int y);
#endif
第二步:建测试文件(test.c),用循环实现重复玩游戏,调用函数功能
test.c 如下:
#include"game.h" //引用头文件
void menu()
{
printf("____________________\n"); //开始界面
printf("|*****扫雷游戏*****|\n");
printf("|******1.play******|\n");
printf("|******0.exit******|\n");
printf("|------------------|\n");
}
void game()
{
int x = 0;
int y = 0;
int ret =0;
int n = 0;
char show[ROWS][COLS] = {0}; //创建2个数组,一个用来放你设置的雷,一个用来展示
char mine[ROWS][COLS] = {0};
InitBoard(show,ROWS,COLS,'*'); //初始化
InitBoard(mine,ROWS,COLS,'0');
PrintBoard(show,ROW,COL); //先把第一个图形展示出来
while(1) //用循环,是你能多次输入坐标
{
printf("输入坐标:");
scanf("%d %d",&x,&y);
if(n==0) //先让你输入坐标,才开始设置雷,这样就不会让你第一次被炸死了(也可以用其他办法)
{
SetMine(mine,ROWS,COLS,x,y); //设置雷
}
if(x>0 && x<=ROW && y>0 && y<=COL)
{
ret = GetMineCount(mine,x,y); //得到雷数
if(ret==-1)
{
printf("很遗憾,你被炸死了\n");
PrintBoard(mine,ROW,COL);
break;
}
else if(ret==-2)
{
printf("你已经排掉了所有雷");
break;
}
else
{
expend(mine,show,ROWS,COLS,x,y); //扩展
PrintBoard(show,ROW,COL);
}
}
else
printf("输入位置错误");
n++;
}
}
int main()
{
int input = 0;
srand((unsigned int )time(NULL)); //产生随机数
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case START:
game();
break;
case EXIT:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
}
while(input);
system("pause");
return 0;
}
第三步:写game.c ,把函数封装在这里面,这样你每次调用,只需声明就ok了
game.c
#include"game.h"
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set) //初始化
{
int i = 0; //也可用 memset(board,set,rols*cols*sizeof(board[0][0])
int j = 0;
for(i=0; i<rows; i++)
{
for(j=0; j<cols; j++)
board[i][j] = set;
}
}
void PrintBoard(char board[ROWS][COLS],int row,int col) //打印函数
{
int i = 0;
int j = 0;
printf(" ");
for(i=1; i<col+1; i++)
{
printf(" %2d ",i);
}
printf("\n");
for(i=1; i<=row; i++)
{
printf("%-2d",i);
for(j=1; j<=col; j++)
{
printf(" %2c ",board[i][j]);
}
printf("\n");
}
}
void SetMine(char board[ROWS][COLS],int rows,int cols,int x,int y)
{
int ret1 = 0;
int ret2 = 0;
int count = 0;
while(count<EASY_COUNT) //设置10个雷,也可设很多个
{
ret1 = rand()%(rows-3)+1;
ret2 = rand()%(cols-3)+1;
if(board[ret1][ret2]=='0')
{
if(ret1!=x || ret2!=y)
{
board[ret1][ret2] = '1';
count++;
continue;
}
}
}
}
int GetMineCount(char mine[ROWS][COLS],int x,int y)
{
if(mine[x][y]=='1')
{
return -1;
}
else if(mine[x][y]=='0')
{
return ((mine[x-1][y-1]+mine[x-1][y]+mine[x-1][y+1]+ //得到x,y周围有多少个雷
mine[x][y-1]+mine[x][y+1]+
mine[x+1][y-1]+mine[x+1][y]+
mine[x+1][y+1])-8*('0'));
}
return -2;
}
void expend (char board[ROWS][COLS],char arr[ROWS][COLS],int rows,int cols,int x,int y)
{
int i = 0;
int j = 0;
int count = 0;
if(arr[x][y]=='*')
{
count=GetMineCount(board,x,y);
if(count!=0 )
{
arr[x][y]=count+'0';
}
else
{
arr[x][y]='0';
for(i=-1; i<=1; i++)
{
for(j=-1; j<=1; j++)
{
if( (x+i>=1) && (x+i<=ROWS) && (y+j>=-1) &&(y+j<=COLS))
{
if((i!=0)||(j!=0))
expend(board,arr,ROWS,COLS,x+i,y+j);//用递归不断展开,直到它周围有雷
}
}
}
}
}
}//也可用 memset(board,set,rols*cols*sizeof(board[0][0]
到此结束,我们看一下运行结果
有哪里做的不好请大家见谅,毕竟我也是新手,希望大家每天都能进步。