1.基础步骤介绍
1.打印游戏棋盘;
2.创建两个数组一个用来埋雷,一个用来显示棋盘;
3.将两个数组初始化;
4.埋雷;
5.排雷;
6代码总览;
2.代码的实现
第一步,打印棋盘
void meaf()
{
printf("------------------\n");
printf("----1.开始游戏----\n");
printf("----0.退出游戏----\n");
printf("------------------\n");
printf("------------------\n");
}
int main()
{
int initp = 0;
do
{
rand((unsigned int)time(NULL));
meaf();
printf("请选择>:");
scanf("%d", &initp);
switch (initp)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
}
} while (initp);
return 0;
}
先使用do while循环打印游戏单,再用switch语句来确定你要的选项。
二.初始化棋盘
1.要完成棋盘的打印我们就要创建两个二维数组一个用来存放雷的位置,一个用来打印棋盘和显示周围雷的数量。
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
如果创建九乘九的的二维数组探查周围八个坐标是否有雷是会造成越界,为了避免越界我们创建两个十一乘十一的二维数组但是我们使用只包括九乘九的位置,就可以避免造成越界了。
void InitBoard(char board[ROWS][COLS], int rows, int cols,char lis)//初始化
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = lis;
}
}
}
InitBoard(mile,ROWS,COLS,'0');//初始化'0'
InitBoard(mils, ROWS, COLS, '*');//初始化'*'
两个棋盘的初始化将第一个放置雷的棋盘全部初始化为字符0,另一个游戏盘初始化为*代表没有开的位置。
三、打印棋盘
void DispiayBoard(char board[ROWS][COLS], int row, int col)//初始化棋盘
{
int i = 0;
int j = 0;
printf("-----------扫雷游戏-----------\n");
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");
}
printf("-----------扫雷游戏-----------\n");
}
如果我们要玩游戏那我们该怎么知道他的横纵坐标呢??总不可能是一个一个数吧。
我们可以边打印棋盘边打印他的横纵坐标,我们都知道数组的下标是从0开始的但是我们
对玩家的要求不可能这么高它只需要知道我们的横纵坐标的第一位是1,1就可以了,
我们可以对玩家输入的数减一来得到数组的下标位置,完成到这一步棋盘就算打印完成了
四.埋雷
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;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
#define EASY_COUNT 10
rand((unsigned int)time(NULL));
我们利用rand((unsigned int)time(NULL));来给我们生成随机数,再模于我们的横纵坐标得到我们棋盘里随机位置的值,把他从原来的字符‘0’更改为字符‘1’;把字符‘1’看成我们的雷。
五.开始排雷(麻烦的一步)
FindMine(char mile[ROWS][COLS], char mils[ROWS][COLS], int row, int col)
{
int win = 0;
int x = 0;
int y = 0;
while (win<row*col- EASY_COUNT)
{
printf("请输入坐标>:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断输入坐标是否合法
{
if (mile[x][y] == '1')//如果是雷
{
printf("你被炸死了!!\n");
DispiayBoard(mile, ROW, COL);//打印雷盘
break;
}
else//如果不是雷
{
win++;
int count = get_mile_count(mile,x,y);//统计周围格子里雷的个数;
mils[x][y] = count+'0';//将得到的雷数转化成字符型
if (count == 0)
{
findmines(mile, mils, row, col, x, y - 1);
findmines(mile, mils, row, col, x, y + 1);
findmines(mile, mils, row, col, x - 1, y + 1);
findmines(mile, mils, row, col, x - 1, y - 1);
findmines(mile, mils, row, col, x + 1, y + 1);
findmines(mile, mils, row, col, x + 1, y - 1);
findmines(mile, mils, row, col, x - 1, y);
findmines(mile, mils, row, col, x + 1, y);
}
DispiayBoard(mils, ROW, COL);//打印游戏盘
}
}
else
{
printf("坐标越界,请重新输入");
}
}
if (win== row * col - EASY_COUNT)//判断是否满足游戏胜利条件
{
printf("恭喜你排雷成功!!\n");
DispiayBoard(mile, ROW, COL);//打印雷盘
}
}
首先接收玩家输入的横纵坐标,看是否越界,如果输入的位置里是字符‘1’,游戏结束,如果输入的位置里是字符‘0’我们就看看他的周围有没有雷,如果没有雷的话把周围的位置显示出来,如果有雷的话则看周围有几个雷并打印到游戏盘上,每次找到一个不是雷的位置win++;到最后把所有不是雷的位置找到则游戏成功,每进行一步打印一次棋盘。
六.代码总览
我一共把扫雷这个代码分成了三个文件,game.h里面包含了头文件以及定义的全局变量。
#pragma once
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define EASY_COUNT 10
void InitBoard(char mile[ROWS][COLS],int rows,int cols,char lis);//数组的初始化
void DispiayBoard(char mile[ROWS][COLS],int row,int col);//数组的打印
void SetMine(char board[ROWS][COLS], int row, int col);//埋雷
FindMine(char mile[ROWS][COLS], char mils[ROWS][COLS], int row, int col);//排雷,并打印周围雷的数量
test.c包含了游戏的运行逻辑步骤。
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void meaf()
{
printf("------------------\n");
printf("----1.开始游戏----\n");
printf("----0.退出游戏----\n");
printf("------------------\n");
printf("------------------\n");
}
void game()
{
char mile[ROWS][COLS] = { 0 };//存放布置好雷的信息
char mils[ROWS][COLS] = { 0 };//存放排查出的雷的信息
//mile在没有布置雷时都是'0'
//mils在没有排查的时候都是'*'
InitBoard(mile,ROWS,COLS,'0');//初始化'0'
InitBoard(mils, ROWS, COLS, '*');//初始化'*'
DispiayBoard(mils, ROW, COL);//打印棋盘
SetMine(mile, ROW, COL);//设置雷
DispiayBoard(mile, ROW, COL);//雷盘的打印
FindMine(mile, mils, ROW, COL);//排雷
}
int main()
{
int initp = 0;
do
{
rand((unsigned int)time(NULL));
meaf();
printf("请选择>:");
scanf("%d", &initp);
switch (initp)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
}
} while (initp);
return 0;
}
最后是函数的实现部分game.c
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void InitBoard(char board[ROWS][COLS], int rows, int cols,char lis)//初始化
{
int i = 0;
int j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
board[i][j] = lis;
}
}
}
void DispiayBoard(char board[ROWS][COLS], int row, int col)//初始化棋盘
{
int i = 0;
int j = 0;
printf("-----------扫雷游戏-----------\n");
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");
}
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;
if (board[x][y] == '0')
{
board[x][y] = '1';
count--;
}
}
}
int get_mile_count(char board[ROWS][COLS], int x, int y)//统计周围雷的个数
{
int i = 0;
int j = 0;
int max = 0;
for (i = x-1; i <= x+1; i++)
{
for (j = y-1; j <= y+1; j++)
{
if (board[i][j] == '1')
{
max++;
}
}
}
return max;
}
void findmines(char mile[ROWS][COLS], char mils[ROWS][COLS], int row, int col, int x, int y)
{
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
int count = get_mile_count(mile, x, y);
mils[x][y] = +'0';
mile[x - 1][y - 1] = count + '0';
}
}
FindMine(char mile[ROWS][COLS], char mils[ROWS][COLS], int row, int col)
{
int win = 0;
int x = 0;
int y = 0;
while (win<row*col- EASY_COUNT)
{
printf("请输入坐标>:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断输入坐标是否合法
{
if (mile[x][y] == '1')//如果是雷
{
printf("你被炸死了!!\n");
DispiayBoard(mile, ROW, COL);//打印雷盘
break;
}
else//如果不是雷
{
win++;
int count = get_mile_count(mile,x,y);//统计周围格子里雷的个数;
mils[x][y] = count+'0';//将得到的雷数转化成字符型
if (count == 0)
{
findmines(mile, mils, row, col, x, y - 1);
findmines(mile, mils, row, col, x, y + 1);
findmines(mile, mils, row, col, x - 1, y + 1);
findmines(mile, mils, row, col, x - 1, y - 1);
findmines(mile, mils, row, col, x + 1, y + 1);
findmines(mile, mils, row, col, x + 1, y - 1);
findmines(mile, mils, row, col, x - 1, y);
findmines(mile, mils, row, col, x + 1, y);
}
DispiayBoard(mils, ROW, COL);//打印游戏盘
}
}
else
{
printf("坐标越界,请重新输入");
}
}
if (win== row * col - EASY_COUNT)//判断是否满足游戏胜利条件
{
printf("恭喜你排雷成功!!\n");
DispiayBoard(mile, ROW, COL);//打印雷盘
}
}
以上就是扫雷的全部部分了,当然也有好多未完成是步骤比如标记雷的位置,和展开周围所有没有雷的位置,这就是这一期扫雷的全部了。