扫雷是一个非常好玩经典的小游戏,相信小时候的你一定玩过吧,今天我就详细的介绍小用C语言实现扫雷小游戏。
游戏的难点在这:
1>第一次下子,不炸死。
2>坐标周围没雷,可以实现展开。
首先我们理清思路:
首先,定义两个二维数组,一个用来设置雷,一个展示给用户进行扫雷;
初始化两个数组,我们将雷盘有雷的位置设置为‘1’,其他设置为‘0’,给用户展示的全部设置为 ‘*’,然后将两个棋盘都打印出来,方便我们观察测试;
开始扫雷,第一次扫时不能炸死,我们将第一次下的分两种情况来说,如果第一次遇到雷,我们将这个雷即将‘1’改成‘0’,在其他位置重新将这个雷进行布置;如果第一次没有遇到雷,那我们将这个雷周围的雷计算个数显示在该雷位置,并判断周围是否有雷,如果没有显示其周围的雷的个数,知道周围有雷不进行显示,这就实现了展开。
void game()
{ //定义两个二维数组
char mine[ROWS][COLS] = {0};
char show[ROWS][COLS] = {0};
//初始化雷棋并布置雷
InitBoard(mine,ROWS,COLS,'0');
SetMine(mine);
Display(mine,ROW,COL);
初始化展示的雷棋并打印
InitBoard(show,ROWS,COLS,'*');
Display(show,ROW,COL);
SafeMine(mine,show,ROW,COL);
FindMine(mine,show,ROW,COL);
}
初始化 棋盘、打印棋盘 void InitBoard(char board[ROWS][COLS],int row,int col,char set)
{
memset(board,set,row*col*sizeof(board[0][0]));
/*int i = 0;
int j = 0;
printf("\n");
for (i=0;i<row-1;i++)
{
for (j=0;j<col-1;j++)
{
board[i][j] = set;
}
}*/
}
void Display(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
for (i=0;i<=row;i++)
{
printf(" ");
printf("%d",i);
}
printf("\n");
for (i=1;i<=row;i++)
{
printf("%2d ",i);
for (j=1;j<=col;j++)
{
printf("%c ",board[i][j]);
}
printf("\n");
}
}
设置雷
void SetMine(char mine[ROWS][COLS])
{
int x = 0;
int y = 0;
int count = SetMine_Count;
while(count)
{
x=rand()%ROW+1;
y=rand()%COL+1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
计算当前雷周围的雷的个数,并将周围雷的个数显示出来,实现展开 int CountMine(char mine[ROWS][COLS],int x,int y)
{
return (mine[x-1][y-1]+
mine[x+1][y-1]+
mine[x][y-1]+
mine[x][y+1]+
mine[x-1][y]+
mine[x+1][y]+
mine[x+1][y+1]+
mine[x-1][y+1]
-8*'0');
}
void OpenMine(char mine[ROWS][COLS],char show[ROWS][COLS],int x,int y)
{
int i = 0;
for (i= 1;i<ROW;i++)
{
if (mine[x - i][y - i]== '0')
{
show[x - i][y - i] = CountMine(mine,x - i, y - i) + '0';//显示该坐标周围雷数
/* break;*/
}
if (mine[x - i][y] == '0')
{
show[x - i][y] = CountMine(mine,x - i, y) + '0';//显示该坐标周围雷数
//break;
}
if (mine[x - i][y + i] == '0')
{
show[x - i][y + i] = CountMine(mine,x - i, y + i) + '0';//显示该坐标周围雷数
//break;
}
if (mine[x][y - i] == '0')
{
show[x][y - i] = CountMine(mine,x, y - i) + '0';//显示该坐标周围雷数
//break;
}
if (mine[x][y + i] == '0')
{
show[x][y + i] = CountMine(mine,x, y + i) + '0';//显示该坐标周围雷数
//break;
}
if (mine[x + i][y - i] == '0')
{
show[x + i][y - i] = CountMine(mine,x + i, y - i) + '0';//显示该坐标周围雷数
//break;
}
if (mine[x + i][y] == '0')
{
show[x + i][y] = CountMine(mine,x + i, y) + '0';//显示该坐标周围雷数
//break;
}
if (mine[x + i][y + i] == '0')
{
show[x + i][y + i] = CountMine(mine,x + i, y + i) + '0';//显示该坐标周围雷数
//break;
}
}
}
扫雷第一次遇到雷,我们进行处理 void SafeMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int x = 0;
int y = 0;
int ret = 1;
printf("input (x y)>>>");
while (1)
{
scanf("%d%d",&x,&y);
if ((x>0&&x<=row)&&(y>0&&y<=col))
{
if (mine[x][y] =='1')
{
mine[x][y] = '0';
show[x][y] = CountMine(mine,x,y)+'0';
OpenMine(mine,show,x,y);
while(ret)
{
x=rand()%ROW+1;
y=rand()%COL+1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
ret--;
break;
}
}break;
}
if (mine[x][y] =='0')
{
show[x][y] = CountMine(mine,x,y)+'0';
OpenMine(mine,show,x,y);
break;
}
}
else{
printf("input wrong\n");
}
}
}
第一没有遇到雷继续-扫雷
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int x = 0;
int y = 0;
int win = SetMine_Count;
do
{
printf("input two (x y)>>>");
scanf("%d%d",&x,&y);
if ((x>0&&x<=row)&&(y>0&&y<=col))
{
if (mine[x][y] == '1')
{
printf("恭喜你,你被炸死了\n");
Display(mine,row,col);
break;
}
else
{
show[x-1][y-1] = CountMine(mine,x-1,y-1)+'0';
OpenMine(mine,show,x+1,y+1);
Display(show,row,col);
win--;
}
}else
{
printf("输入坐标有误\n");
}
} while (win);
if (win == 0)
{
printf("你赢了\n");
}
}
在这里,我们把头文件统一放在这里
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 9
#define COL 9
#define ROWS (ROW + 2)
#define COLS (COL + 2)
#define SetMine_Count 10
void InitBoard(char board[ROWS][COLS],int row,int col,char set);
void Display(char board[ROWS][COLS],int row,int col);
void SetMine(char board[ROW][COL]);
void SafeMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col);
#endif //__GAME_H__
这里当然就是我们游戏的入口啦
#define _CRT_SECURE_NO_WARNINGS 0
#include "game.h"
void menu()
{
printf("**********************\n");
printf("********1.play********\n");
printf("********2.exit********\n");
printf("**********************\n");
}
void game()
{
char mine[ROWS][COLS] = {0};
char show[ROWS][COLS] = {0};
InitBoard(mine,ROWS,COLS,'0');
SetMine(mine);
Display(mine,ROW,COL);
InitBoard(show,ROWS,COLS,'*');
Display(show,ROW,COL);
SafeMine(mine,show,ROW,COL);
FindMine(mine,show,ROW,COL);
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("input choice>>>");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 2:
break;
default:
printf("choice default\n");
}
} while(input);
system("pause");
}
int main()
{
test();
}
其实,写完你才发现,所有的难点都不算是难点,当你理清思路后,在下手写代码时,你的大脑非常清晰你想要的结果,顺着这个思路写完就达到我们想要的预期效果啦~~
加油!@~@