目录
前言
一、游戏介绍
二、游戏的设计思路
1、主要游戏逻辑
二、游戏的功能实现
(1)数组的创建和初始化
初始化数组
显示游戏界面:
布置雷
排查雷:
扫雷是一个比较经典的游戏,用C语言实现扫雷需要先了解扫雷的游戏规则和逻辑结构,我首先想到用数组来实现存储雷,运用数组扫雷。
扫雷游戏,是在一个m*m的格子区间内具有一定数量的雷,而没有雷的格子会根据附近3*3区间的雷的数量来产生相应的数字,而我们便需要通过观察点击格子所出现的数字来将所有雷的位置找出来。
在main函数中实现游戏的整体结构,用text函数操作;开始时,要设计一个菜单:1表示play,0表示退出;
void menu()
{
printf("***************************\n");
printf("******** 1.play *********\n");
printf("******** 0.exit *********\n");
printf("***************************\n");
}
之后,在设计整体逻辑,用switch语句实现逻辑;
void text()
{
int input;
do {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入出错,请重新选择\n");
break;
}
} while (input);
}
为了游戏简便,分成几个函数来操作。
需要二维数组实现扫雷的界面,选择使用两个二维数组,第一个用来存放所有的雷和数字第二个为空白,当我们选择要点击的坐标时,再将第一个数组中对应位置的雷和数字赋予第二个数组。为防止数组越界,要多设两行两列。
void initboard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
for (j = 0; j < cols; j++)
{
board[i][j] = set;
}
}
}
void DisplayBoard(char board[ROWS][COLS], int row, int col)
{
int i, j;
printf("--------------扫雷-----------\n");
for (i = 0; i < col; i++)
{
printf("%d ", i);
}
printf("\n");
for (i = 0; i < row; i++)
{
printf("%d ", i);
for (j = 0; j < col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("--------------扫雷-----------\n");
}
首先,用rand函数生成随机数,并且要判断生成雷的位置是否存在雷。
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--;
}
}
}
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 (show[x][y] != '*')
{
printf("该坐标被排查过了\n");
continue;
}
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
int n = get_mine_count(mine, x, y);
show[x][y] = n + '0';
DisplayBoard(show, ROW, COL);
win++;
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
if (win == (row * col - EASY_COUNT))
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, ROW, COL);
}
}
还要一个计算周围的雷的函数:get_mine_count(board, x, y)
int get_mine_count(char mine[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] +
mine[x + 1][y - 1]+ mine[x + 1][y] + mine[x][y + 1] +
mine[x + 1][y + 1] + mine[x - 1][y - 1] + 8 * '0');
}
这个代码的基本结构就是这样的。
三、源文件和头文件
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 10
#include
#include
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);
int get_mine_count(char mine[ROWS][COLS], int x, int y);
game.h 游戏功能的实现:
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void initboard(char board[ROWS][COLS], int rows, int cols, char set)
{
int i = 0;
for (i = 0; i < rows; i++)
{
int j = 0;
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;
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_mine_count(char mine[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y] + mine[x - 1][y - 1] + mine[x][y - 1] +
mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] +
mine[x][y + 1] + mine[x - 1][y + 1] - 8 * '0');
}
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 (show[x][y] != '*')
{
printf("该坐标被排查过了\n");
continue;
}
if (mine[x][y] == '1')
{
printf("很遗憾,你被炸死了\n");
DisplayBoard(mine, ROW, COL);
break;
}
else
{
int n = get_mine_count(mine, x, y);
show[x][y] = n + '0';
DisplayBoard(show, ROW, COL);
win++;
}
}
else
{
printf("坐标非法,重新输入\n");
}
}
if (win == (row * col - EASY_COUNT))
{
printf("恭喜你,排雷成功\n");
DisplayBoard(mine, ROW, COL);
}
}
text.h 游戏的运行
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include"game.h"
void menu()
{
printf("***************************\n");
printf("******** 1.play *********\n");
printf("******** 0.exit *********\n");
printf("***************************\n");
}
void game()
{
//printf("扫雷游戏\n");
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
initboard(mine,ROWS,COLS,'0');
initboard(show,ROWS,COLS,'*');
DisplayBoard(show, ROW, COL);
Setmine(mine, ROW, COL);
//DisplayBoard(mine, ROW, COL);
FindMine(mine,show, ROW, COL);
}
void text()
{
srand((unsigned int)time(NULL));
int input;
do {
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入出错,请重新选择\n");
break;
}
} while (input);
}
int main()
{
text();
return 0;
}