扫雷游戏的实现
要实现扫雷,首先应该有一个基本的游戏菜单,打印我们的游戏开始选项和退出游戏选项,当用户选择玩游戏,在运行游戏函数,在玩完一把之后应该再次打印菜单询问玩家是否要再来一把,这个可以使用do while语句循环来实现。
重点在于游戏函数的算法实现,包括雷的随机设置与存储,9*9的扫雷界面的初始化,当我们选择试探一个格子我们应该统计这个格子周围的8个坐标有多少雷,因此还要实现排查雷函数。
再深层次的思考,如果试探边界的坐标是否有雷,我们再来统计周围8个坐标可能会越界,与其每次点击都判断周围坐标是否越界,不如我们设置为11*11的雷盘,并且在最外围一圈保证无雷,这样就可以正确反馈周围雷数量的同时提高效率。
上面是一些开始的思路。直接展示代码
头文件"game.h"
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 80
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//雷盘初始化
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
//打印棋盘
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);
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
源文件game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
{
int i = 0;
int j = 0;
for(i = 0;i <rows ;i++)
{
for(j = 0;j<cols;j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS],int row,int col)
{
int i = 0;
int j = 0;
//打印列号
for(j = 0;j <= col;j++)
{
printf("%d ",j);
}
printf("\n");
for(i = 1;i <= row;i++)
{
//打印行号
printf("%d ",i);
for(j = 1;j <= col;j++)
{
printf("%c ",board[i][j]);
}
printf("\n");
}
}
void SetMine(char board[ROWS][COLS],int row,int col)
{
int count = EASY_COUNT;//10棵
while(count)
{
int x = rand()%row+1; //使雷横纵坐标处于1-9
int y = rand()%col+1;
if(board[x][y]== '0')
{
board[x][y] = '1';
count--;
}
}
}
//'3'-'0'=3以此类推
int Get_mine_count(char mine[ROWS][COLS],int x,int y)
{
int sum = 0;
int i = 0;
int j = 0;
for(i = x-1;i<=x+1;i++)
{
for(j = y-1;j<=y+1;j++)
{
sum = sum + (mine[i][j]-'0');
}
}
return sum;
}
void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row,int col)
{
int x = 0;
int y = 0;
int win = 0;
while(win < row*col-EASY_COUNT )
{
printf("美女,请输入你想排查的坐标:");
scanf("%d,%d",&x,&y);
if(x>=1 && x <= row && y>=1 && y<=col)
{
//坐标合法
//踩雷
if(mine[x][y] == '1')
{
printf("很遗憾,此处是雷区,但是黑骑士挡在了你的身前\n");
printf("再来一把,救回忠心耿耿的黑骑士吧!\n");
DisplayBoard(mine,ROW,COL);
break;
}
//未踩雷
else
{
int count = Get_mine_count(mine,x,y);
show[x][y] = count+ '0';
DisplayBoard(show,row,col);
win++;
}
}
else
{
printf("这不合法,公主请重新输\n");
}
}
if(win == row*col-EASY_COUNT )
{
printf("赢了!你太强了!\n");
DisplayBoard(mine,ROW,COL);
}
}
//实现一点一大片的效果,连锁判断,应该使用递归
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
源文件test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("****************************\n");
printf("*** 1.play 0.exit ***\n");
printf("****************************\n");
}
void game()
{
//雷的信息存储
//1.布置好的雷的信息
char mine[ROWS][COLS] = {0};
//2.排查出的雷的信息
char show[ROWS][COLS] = {0};
//初始化
InitBoard(mine,ROWS,COLS,'0');
InitBoard(show,ROWS,COLS,'*');
//打印雷盘
// DisplayBoard(mine,ROW,COL);
DisplayBoard(show,ROW,COL);
//布置雷
SetMine(mine,ROW,COL);
DisplayBoard(mine,ROW,COL);
//扫雷
FindMine(mine,show,ROW,COL);
}
void test()
{
int input= 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d",&input);
switch(input)
{
case 1:
printf("游戏开始!\n");
game();
break;
case 0:
printf("游戏结束!\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
/*if(input == 0)
{
printf("游戏结束!\n");
break;
}else if(input == 1)
{
printf("游戏开始!\n");
game();
}*/
}while(input);
}
int main()
{
test();
return 0;
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
运行结果: