作为第一篇博客,可能有很多瑕疵,有不足之处还请多指教。
该代码是devc++实现的9×9棋盘下扫雷,没有设置难度选项,此为不足之处。此外,代码中设置地雷代码在输入坐标前运行,即有可能出现翻开的第一张牌就是雷的情况,游戏失败。以终端输入坐标的形式来进行翻牌和标记。效果图如下。
话不多说,接下来我们就上代码,三段代码分别是头文件,主逻辑函数,游戏函数。放置一个项目中。
头文件如下:注意头文件需命名为“game.h"
//头文件
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<windows.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 ret);
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);
主逻辑函数如下:
//测试游戏逻辑
#include"game.h"
void menu()
{
printf("********** 扫雷 **********\n");
printf("**************************\n");
printf("****** 1.play 0.exit *****\n");
printf("**************************\n");
}
void game()
{
char mine[ROWS][COLS] = {0}; //存放布置好雷的信息
char show[ROWS][COLS] = {0}; //存放排查出的雷的信息
//初始化数组的内容为指定的内容
//mine数组在没有布置雷的时候,都是‘0’;
InitBoard(mine,ROWS,COLS,'0');
//show数组在没有排查雷的时候,都是‘*’;
InitBoard(show,ROWS,COLS,'*');
//设置雷
SetMine(mine,ROW,COL);
// DisplayBoard(mine,ROW,COL);
DisplayBoard(show,ROW,COL);
FindMine(mine,show,ROW,COL);
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();//打印菜单
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1 :
game();
break;
case 0 : printf("退出游戏\n"); break;
default: printf("请重新选择\n"); break;
}
}while(input);
return 0;
}
游戏函数如下:
//游戏函数
#include"game.h"
//初始化棋盘
void InitBoard(char board[ROWS][COLS],int rows,int cols,char ret)
{
int i = 0;
int j = 0;
for(i=0;i<rows;i++)
{
for(j=0;j<cols;j++)
{
board[i][j] = ret;
}
}
}
//打印棋盘
void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
int l = 0;
printf("----------------扫雷游戏----------------\n");
printf("游戏规则:9×9的棋盘里布置有十颗地雷,格子里的数字即其一圈方格内地雷数量\n");
printf("输入规则:“数字”“空格”“数字”,回车即可\n");
for(j=0;j<=COL;j++)
{
printf(" %d |",j);
}
printf("\n");
for(l=0;l<=COL;l++)
{
printf("---|"); //横坐标
}
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 k = 0;
for(k=0;k<=COL;k++)
{
printf("---|");
}
printf("\n");
}
printf("---------------扫雷游戏----------------\n");
}
//设置炸弹
void SetMine(char board[ROWS][COLS],int row,int col)
{
int count = EASY_COUNT;
while(count)
{
int x = rand() % ROW+1;
int y = rand() % COL+1; //x,y 随机取值1~9;
if(board[x][y]=='0')
{
board[x][y]='1'; //字符1为雷,字符0为无雷
count--;
}
}
}
//获取周围炸弹数目
int get_mine_count(char board[ROWS][COLS],int x,int y)
{
int number = 0;int i=x-1; int j = y-1;
for(i=x-1;i<=x+1;i++)
{
for(j=y-1;j<=y+1;j++)
{
if(board[i][j]=='1')
{
number++;
}
}
}
return number;
}
//展开没雷的格子
void clear(char mine[ROWS][COLS],char show[ROWS][COLS],int x,int y)
{
int count = get_mine_count(mine,x,y);
if(0==count)
{
show[x][y]=' ';
int i = 0; int j = 0;
for(i=x-1;i<=x+1;i++)
{
for(j=y-1;j<=y+1;j++)
{
if(i>=1 && i<=9 && j>=1 && j<=9)
{
if(show[i][j]=='*'&& mine[i][j]!='1')
{
clear(mine,show,i,j);
}
}
}
}
}
else
{
show[x][y] = count + '0';
}
}
//标记雷
void sign(char show[ROWS][COLS],int row,int col)
{
int x = 0; int y = 0;int fly = 0;
while(1)
{
printf("键入‘0 0’即可返回功能选择界面\n");
printf("请输入要标记的坐标:>\n");
scanf("%d%d",&x,&y);
if(x>=1 && x<=row &&y>=1 && y<=col)
{
if(show[x][y]=='*')
{
system("cls");
show[x][y]='&';
DisplayBoard(show,ROW,COL);
printf("坐标已标记\n");
}
else
{
printf("该坐标无法被标记,请重新选择\n");
}
}
else if(x==0 &&y==0)
{
printf("功能选择\n");
break;
}
else
{
printf("无效坐标,请重新选择\n");
}
}
}
//翻牌
void open(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col,int * result)
{
int x = 0;
int y = 0;
while(1)
{
int win = 0;
printf("键入‘0 0’即可返回功能选择界面\n");
printf("请输入要翻开的坐标:>\n");
scanf("%d%d",&x,&y);
if(x>=1 && x<=row &&y>=1 && y<=col)
{
if(show[x][y]!='*')
{
printf("该坐标已排查\n");
}
else
{
if(mine[x][y]=='1')
{
*result = 0;
printf("很遗憾,你被炸死了!!!\n");
printf("很遗憾,你被炸死了!!!\n");
printf("很遗憾,你被炸死了!!!\n");
Sleep(1000);
system("cls");
DisplayBoard(mine,ROW,COL);
break;
}
else//如果不是雷
{
clear(mine,show,x,y);
}
system("cls");
DisplayBoard(show,ROW,COL);
//统计非雷格子数目
int i = 0; int j = 0;
for(i=1;i<=ROW;i++)
{
for(j=1;j<=COL;j++)
{
if(show[i][j]!='*'&&show[i][j]!='&')
{
win++;
}
}
}
printf("当我达到71,你就赢了噢:%d \n",win);
if(win==row*col-EASY_COUNT)
{
*result = 0;
system("cls") ;
printf("恭喜你,排雷成功\n");
DisplayBoard(mine,ROW,COL);
break;
}
}
}
else if(x==0 &&y==0)
{
printf("功能选择\n");
break;
}
else
{
printf("输入的坐标非法,请重新输入\n");
}
}
}
//排雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int ch = 0;
int result = 1;
while(1)
{
printf("功能项选择:键入1为标记地雷,键入2即翻开\n");
scanf("%d",&ch);
char ch2 =getchar();
switch(ch)
{
case 1 : sign(show,row,col);break;
case 2 : open(mine,show,row,col,&result);
if(result==0)
{
goto again;
}
break;
default : printf("功能项选择错误,请重新选择\n"); break;
}
}
again: ;
}
目前博主还没发现什么bug,如果有小伙伴发现或者有好的提议,欢迎评论区留言