? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ? ???希望本篇内容对有需要的小伙伴儿们有帮助哦!
目录
文件
简单的逻辑
?对目标位置进行判定
game2.h
game2.c
test2.c
文件
简单的逻辑
? ? ?打印菜单? ->? 选择是否进入游戏??-> 初始化数组? ->? 埋雷数组用字符零初始化??->? 排雷数组用? ?' * '? 初始化??->? 随机埋雷?->? 打印排雷数组? ->? 输入坐标进行排雷并对该位置进行判断
假如我们想要创建的是一个9×9的扫雷,我们需要存放雷,那么我们很容易便想到了用二维数组来实现,那么我们建立两个二维数组,一个用来存放雷,另一个用来排雷,并显示排雷的信息。本文中,我们用字符0来代表非雷,用字符1来代表雷,所以,我们需要建立char型的数组来存储。
好,那么在了解了基本信息后让我们来思考一个问题,在排位的过程中会不会出现什么问题?在扫雷中,点击你要排雷的位置后,如果该位置是雷,那么会被炸死,游戏结束;如果不是雷,它会显示周围雷的数量,好,在我们用代码实现该过程中,是雷——炸死——游戏结束这一过程很简单;“显示周围雷的数量”这一过程呢?会有什么问题吗?
显示周围雷的数量
假设我们按照一开始的思路建立了两个char[9][9]的数组。
?那么请大家思考,当我们想要排查上图中红色区域时,是否能正确排查呢?答案是不能,请假来和我一起思考:如果该位置是雷那么很简单,如果不是雷它就需要对周围区域进行遍历,以此来显示周围数量,好,重点来啦!我们初始化的数组只有9行9列,当我们设置代码对目标位置进行遍历时,红色区域的外围是非法地带,即越界!那么怎么办呢,其实很简单,我们只要在创建的时候将其扩大一圈便可以了,即11×11的二维数组;但我们对数组初始化时只初始化9×9的区域。
?对目标位置进行判定
//雷——'1'
// 非雷——'0'
//排查雷
void mine_clearance(char mine[ROWS][COLS], char arr2[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;//用来计算排查的区域,当非雷区域被排查完后便获得了胜利
while (win < row * col - MINENUMBER)
{
printf("请输入选择排查的坐标->");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遗憾被炸死了\n");
Printboard(mine, ROW, COL);//显示雷图令玩家明白
break;//已被炸死 跳出程序防止死循环
}
else
{
int count = mines_num(mine, x, y);//计算周围雷的数量
arr2[x][y] = count + '0';
//count是整型,加上字符零后便可显示字符数字。
Printboard(arr2, ROW, COL);
win++;
}
}
else
{
printf("坐标非法,请重新输入->"); //我们要对玩家输入的坐标进行判断防止玩家出错
}
}
if (win == row * col - MINENUMBER)
{
printf("恭喜你!排雷成功!\n");
Printboard(mine, ROW, COL);
}
}
game2.h
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINENUMBER 20 //埋雷的数量
void menu();
//初始化
void initialize(char mine[ROWS][COLS], int row, int col, char set);
//打印
void Printboard(char mine[ROWS][COLS], int row, int col);
//埋雷
void Buriedmine(char mine[ROWS][COLS], int row, int col);
//排查雷
void mine_clearance(char mine[ROWS][COLS],char arr2[ROWS][COLS], int row, int col);
game2.c
#include"game2.h"
//菜单
void menu()
{
printf("********************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("********************\n");
}
//初始化
void initialize(char mine[ROWS][COLS], int row, int col, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
mine[i][j] = set;
}
}
}
//打印
void Printboard(char mine[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf(" ----------- 扫雷 -----------\n");
printf(" |");
for (j = 1; j <= col; j++)
{
printf("%2d ", j);
}
printf("\n");
printf(" --|-------------------------\n");
for (i = 1; i <= row; i++)
{
printf("%2d |", i );
for (j = 1; j <= col; j++)
{
printf(" %c ", mine[i][j]);
}
printf("\n");
}
}
//埋雷
void Buriedmine(char mine[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = MINENUMBER;
while (count)
{
x = rand() % row + 1;
y = rand() % col + 1;
if (mine[x][y] == '0')
{
mine[x][y] = '1';
count--;
}
}
}
//计算雷的数量
int mines_num(char mine[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y + 1] + mine[x][y + 1] + mine[x + 1][y + 1] + mine[x - 1][y]
+ mine[x + 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] + mine[x + 1][y - 1] - 8 * '0');
}
//雷——'1'
// 非雷——'0'
//排查雷
void mine_clearance(char mine[ROWS][COLS], char arr2[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;
while (win < row * col - MINENUMBER)
{
printf("请输入选择排查的坐标->");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (mine[x][y] == '1')
{
printf("很遗憾被炸死了\n");
Printboard(mine, ROW, COL);
break;
}
else
{
int count = mines_num(mine, x, y);//计算周围雷的数量
arr2[x][y] = count + '0';
Printboard(arr2, ROW, COL);
win++;
}
}
else
{
printf("坐标非法,请重新输入->");
}
}
if (win == row * col - MINENUMBER)
{
printf("恭喜你!排雷成功!\n");
Printboard(mine, ROW, COL);
}
}
test2.c
#include"game2.h"
void game()
{
char mine[ROWS][COLS] = { 0 };
char demining[ROWS][COLS] = { 0 };
//初始化
initialize(mine, ROWS, COLS, '0');
initialize(demining, ROWS, COLS, '*');
//打印
//Printboard(demining, ROW, COL);
//埋雷
Buriedmine(mine, ROW, COL);
Printboard(mine, ROW, COL);
//排查雷
mine_clearance(mine,demining, ROW, COL);
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择->");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("您已退出游戏\n");
break;
default:
printf("输入错误请重新输入\n");
}
} while (input);
}
|