家人们,这是我最近学的简单的扫雷游戏,这是一个工程里面的包含函数声明模块,游戏实现模块,测试模块,建议从主函数开始理解
#define _CRT_SECURE_NO_WARNINGS
//函数声明模块
//扫雷9行9列式;
#define R 9
#define C 9
//定义雷的个数
#define LC 10
//为了数顶点和最边上的雷的个数,所以设置11*11的棋盘,并且在第1和第11行及列的位置放置非雷;
//便于找雷的位置,包括放雷和排雷
#define RS R+2
#define CS C+2
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
//初始化声明
void beboard(char board[RS][CS],int rs,int cs,char set);
//打印棋盘
//传过来时rs的原因是(只要9*9的区域)
void dyboard(char board[RS][CS],int r,int c);
//布置雷
void setL(char board[RS][CS],int r,int c);
//排雷
void PL(char nshow[RS][RS],char show[RS][CS],int r,int c);
这里往上是game.h里面的代码;
#include "game.h"
//当set='0'时,11*11中全放'0';
//当set='*'时,11*11中全放'*';
void beboard(char board[RS][CS],int rs,int cs,char set)
{
int i,j;
for(i=0;i<rs;i++)
for(j=0;j<cs;j++)
{
board[i][j]=set;
}
}
//仅仅打印自己看时全部是字符'0';对应的ASCII码值为48;
//当打印玩家看到的就全部都是'*';对应的ASCII码值为42;
void dyboard(char board[RS][CS],int r,int c)
{
int i=0;
int j=0;
//打印最上面一行的0到9
for(i=0;i<=c;i++)
printf("%d ",i);
printf("\n");
for(i=1;i<=R;i++)
{ printf("%d ",i);
for(j=1;j<=C;j++)
{printf("%c ",board[i][j]);}
printf("\n");
}
printf("\n");
}
//布置雷
void setL(char board[RS][CS],int r,int c)
{
int count=LC;
int x,y;
while(count)
{
//随机生成合法坐标
x=rand()% (r+1);//1到9
y=rand()% (c+1);//1到9
if(x>=1 && x<=9 && y>=1 &&y<=9)
{
{if(board[x][y]=='0')
{
board[x][y]='1';
count--;
}
}
}
else
continue;//不满足if条件跳出这次循环,进入下次循环;
}
}
//计算以x,y坐标为中心的雷的数目
int countL(char nshow[RS][CS],int x,int y)
{
int count=0;
count=nshow[x-1][y-1]+nshow[x-1][y]+nshow[x-1][y+1]
+nshow[x][y-1]+nshow[x][y+1]+nshow[x+1][y-1]
+nshow[x+1][y]+nshow[x+1][y+1]-8*'0';
return count;
}
//排雷
void PL(char nshow[RS][RS],char show[RS][CS],int r,int c)
{
int x,y,ret,win=0;
while(win<R*C-LC)
{printf("请输入要排的坐标:> ");
scanf("%d%d",&x,&y);
if(x>=1 && x<=9 && y>=1 &&y<=9)
{
//坐标已合法,判断
if(nshow[x][y]=='1')//是雷
{
printf("真不错,踩到雷了\n");
dyboard(nshow,r,c);
break;
}
//不是雷,求以此坐标为中心的周围八个坐标有多少个雷
else
{
ret=countL(nshow,x,y);
//将整型ret转换为字符放入show中;
show[x][y]=ret+'0';
dyboard(show,r,c);
win++;
}
}
else
printf("输入的坐标不合法,请重新输入坐标! * _ * \n");
}
if(win==R*C-LC)
printf("哇哦,你扫雷成功啦,建议去买彩票哦,可能会中大奖\n");
Sleep(2000);//延时2ms
system("cls");//一局游戏玩玩清屏
}
这里到往上的红色字体截止,是游戏实现部分game.c;
下面是包括主函数代码部分test.c
#include "game.h"
//测试游戏;
//打印菜单
void game()
{
char nshow[RS][CS]={0};
char show[RS][CS]={0};
printf("扫雷开始\n");
//先布置棋盘
//初始化棋盘
beboard(nshow,RS,CS,'0');//放'0';
beboard(show,RS,CS,'*');//放'*';
//打印棋盘
dyboard(nshow,R,C);//只要打印9*9的格子'0';实际上用户玩的时候这个是不打印的
dyboard(show,R,C);//只要打印9*9的格子'*'
//布置雷
setL(nshow,R,C);
dyboard(nshow,R,C);//打印给自己看下雷区
//排雷
PL(nshow,show,R,C);
}
void mune()
{
printf("*****欢迎来到扫雷游戏*****\n");
printf("**************************\n");
printf("***** 1.play 0.exit *****\n");
printf("**************************\n");
}
void xuanze()
{
int input=0;
srand((unsigned int)time (NULL));
do
{
mune();
printf("请选择:> ");
scanf("%d",&input);
switch(input)
{
case 1:
{printf("请开始游戏\n");
game();
break;
}
case 0:
{printf("退出游戏\n");
break;
}
default:
{ printf("抱歉,没有该选项,请重新输入\n");
break;
}
}
}
//只要输入为真,就可以重新选择;
while(input);
}
int main()
{
xuanze();
return 0;
}