用c语言实现小游戏《扫雷》(第一次不会死和展开函数)
先写代码了,欢迎测试BUG
game.h
#ifndef __GAME_H__
#define __GAME_H__
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#define ROW 10
#define COL 10
#define ROW1 ROW+2
#define COL1 COL+2
#define LEI 15 //可以自定义雷的数目
void init(char show[ROW1][COL1],char clei[ROW1][COL1],int row,int col);
void display(char arr[ROW1][COL1],int row,int col);//打印游戏界面
void _lei(char arr[ROW1][COL1],int row,int col);//布置雷
int playergo(char show[ROW1][COL1],char clei[ROW1][COL1],int row,int col);
int _swap(char clei[ROW1][COL1],int x,int y);//查看(x,y)周围几个雷
void open(char clei[ROW1][COL1],char show[ROW1][COL1],int x,int y);//展开函数
int getcount(char show[ROW1][COL1],int row,int col); //获取剩余‘*’的个数
void safe_LEI(char clei[ROW1][COL1],int x,int y); //第一次是LEI偷偷移走
#endif __GAME_H__
test.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
menu()
{
printf("****扫雷小游戏**************************\n");
printf("***************1.play*******************\n");
printf("***************0.exit*******************\n");
printf("****************************************\n");
}
game()
{
char show[ROW1][COL1] = {0};// 游戏面板数组
char clei[ROW1][COL1] = {0};// 游戏内部含雷数组
srand((unsigned int)time(NULL));//随机数
init(show,clei,ROW1,COL1);//初始化两个数组;
_lei(clei,ROW,COL); // 布置雷
display(show,ROW1,COL1);// 打印游戏面板
/*display(clei,ROW1,COL1);*///可以查看雷布置的位置
playergo(show,clei,ROW,COL); // 玩家开始玩游戏(内置游戏输赢判断)
}
int main()
{
int input = 0;
do
{
menu();
scanf("%d",&input);
switch(input)
{
case(1):game();
break;
case(0):printf("游戏结束\n");
break;
default:printf("无效操作,请重新选择:\n");
break;
}
}while(input);
return 0;
}
只需要向四个方向递归就可以全部展开
void open(char clei[ROW1][COL1],char show[ROW1][COL1],int x,int y)
主要函数以及调用都在以下函数中
int playergo(char show[ROW1][COL1],char clei[ROW1][COL1],int row,int col)
游戏函数
game.c
#include"game.h"
void init(char show[ROW1][COL1],char clei[ROW1][COL1],int row,int col)
{
/*int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
show[i][j] = '*';
clei[i][j] = '0';
}
}*/
//库函数数组初始化,头文件string.h
memset(&show[0][0],'*', row*col*sizeof(show[0][0]));//游戏界面初始‘*’
memset(&clei[0][0],'0', row*col*sizeof(clei[0][0]));//雷数组初始为‘0’
}
void display(char arr[ROW1][COL1],int row,int col)
{
int i = 0;
int j = 0;
for(j=0; j<row-1; j++) //打印横坐标:
{
printf("%4d",j);
}
printf("\n");
for(i=1; i<row-1; i++)
{
printf("%4d",i); //打印纵坐标
for(j=1; j<col-1; j++)
{
printf("%4c",arr[i][j]);
}
printf("\n");
}
printf("-------------------------------------------------------------------\n");
}
void _lei(char arr[ROW1][COL1],int row,int col)
{
int lei = LEI;
while(lei)
{
int x = rand()%row+1;
int y = rand()%col+1;
if(arr[x][y]=='0') //判断坐标位置是否有雷;
{
arr[x][y]='1';
lei--; //安排雷控制循环;
}
}
}
int playergo(char show[ROW1][COL1],char clei[ROW1][COL1],int row,int col)
{
int x = 0;
int y = 0;
int count = row*col;
int ret = 0;
while(count!=LEI)
{
printf("请输入坐标:>");
scanf("%d%d",&x,&y);
if(x<1||x>col||y<1||y>row)
{
printf("输入坐标有误!\n");
}
else
{
if(count==row*col&&clei[x][y]=='1') //判断第一次玩的条件,如果
{
safe_LEI(clei,x,y);
}
if(clei[x][y]=='1')
{
printf("你被炸死了\n");
display(clei,ROW1,COL1);
return 0;
}
else
{
open(clei,show,x,y); // 判断是否连续展开;
count=getcount(show,ROW,COL); //剩余‘*’数量,与LEI比较控制循环;
display(show,ROW1,COL1);
/*display(clei,ROW1,COL1);*/
}
}
}
display(clei,ROW1,COL1);
printf("恭喜你,游戏胜利!\n");
return 1;
}
void safe_LEI(char clei[ROW1][COL1],int x,int y)
{
int count = 1;
while(count)
{
if(clei[x][y]=='1')
{
int i = rand()%ROW+1;
int j = rand()%COL+1;
clei[x][y]='0';
if(clei[i][j]=='0')
{
clei[i][j]='1';
count--;
}
}
else
count--;
}
}
int _swap(char clei[ROW1][COL1],int x,int y)
{
return clei[x-1][y]+clei[x-1][y-1]+clei[x][y-1]+clei[x+1][y-1]+clei[x+1][y]+
clei[x+1][y+1]+clei[x][y+1]+clei[x-1][y+1]-('0'*8);
}
void open(char clei[ROW1][COL1],char show[ROW1][COL1],int x,int y)
{
show[x][y] = _swap(clei,x,y)+'0';
if(clei[x][y]=='0'&&_swap(clei,x,y)==0) //如果此坐标不是LEI,并且附近安全则展开;
{
//x+1,x-1,y+1,y-1时需要判断是否越界
// ==‘*’表示未被展开,防止重复;
if(clei[x+1][y]=='0'&&show[x+1][y]=='*'&&x+1<=ROW)//向下
{
show[x+1][y] = _swap(clei,x+1,y)+'0';
if(_swap(clei,x+1,y)==0)
{
open(clei,show,x+1,y);
}
}
if(clei[x-1][y]=='0'&&show[x-1][y]=='*'&&x-1>0)//向上
{
show[x-1][y] = _swap(clei,x-1,y)+'0';
if(_swap(clei,x-1,y)==0)
{
open(clei,show,x-1,y);
}
}
if(clei[x][y+1]=='0'&&show[x][y+1]=='*'&&y+1<=COL)//向右
{
show[x][y+1] = _swap(clei,x,y+1)+'0';
if(_swap(clei,x,y+1)==0)
{
open(clei,show,x,y+1);
}
}
if(clei[x][y-1]=='0'&&show[x][y-1]=='*'&&y-1>0)//向左
{
show[x][y-1] = _swap(clei,x,y-1)+'0';
if(_swap(clei,x,y-1)==0)
{
open(clei,show,x,y-1);
}
}
}
}
int getcount(char show[ROW1][COL1],int row,int col)
{
int i = 0;
int j = 0;
int count = 0;
for(i=1;i<=row;i++)
{
for(j=1;j<=col;j++)
{
if(show[i][j]=='*')
count++;
}
}
return count;
}