扫雷的游戏规则:
扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败。游戏主区域由很多个方格组成。使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷。逐一排除所有雷,找到所有非雷区即为胜利。
我们用C语言实现一个简易的扫雷小游戏,其思路和具体代码如下:
首先我用多文件来实现。一个头文件game.h 两个源文件game.c和main.c。
1.首先,我们需要打印两个棋盘mine_board和show_board,两个数组在开始必须要初始化,在mine_board中字符0代表不是雷,字符1代表雷。但假设我们要打印10X10的棋盘,那我们的二维数组元素也要为10X10个吗?,不能,因为我们在设计算法时需要统计坐标周围8个方位雷的个数,假如要统计边界坐标周围雷的个数,那么就会有数组越界的问题,那我们就要在10X10的边界多上一圈元素,也就要定义12X12的数组元素,但是不需要打印出来。
#define COL 12
#define ROW 12
2.打印显示棋盘。
void ShowBoard(char board[][COL], int row, int col)
{
int i = 1;
for (; i <= 10; i++) {
printf(" %d", i);
}
printf("\n");
for (; i <= 10; i++) {
printf("____");
}
for (i = 1; i < 11; i++)
{
printf("%2d |", i);
int j = 1;
for (; j < 11; j++)
printf(" %c |", board[i][j]);
printf("\n");
}
int k = 1;
for (; k <11; k++) {
printf("____");
}
printf("\n");
}
3.我们在每一次玩的时候棋盘中的雷分布都必须不相同,所以使用随机数生成横竖坐标确定布雷坐标。字符0代表非雷,字符1代表雷。定义SetMine()函数实现。
void SetMine(char board[][COL], int row, int col,int *x_p,int *y_p)
{
int count = NUM;
while (count > 0) {
int x=rand()%(row-2)+1;
int y=rand()%(col-2)+1;
if (board[x][y] == '0') {
count--;
board[x][y] = '1';
}
}
int i = 1;
for (; i < 11; i++) {
int j = 1;
for (; j < 11; j++) {
if (board[i][j] == '0')
{
*x_p = i;
*y_p = j;
return;
}
}
}
}
4.为了统计当前坐标周围雷的个数,定义一个GetCount()函数实现:
int GetCount(char board[][COL], int x, int y)
{
return (board[x-1][y-1] + board[x-1][y] + board[x][y+1] + board[x][y-1] + board[x][y+1] \
+ board[x+1][y-1] + board[x+1][y] + board[x+1][y+1]) - 8 * '0';
}
5.为了防止第一次被炸死,所以做了点改变。定义了一个临时变量,如果第一次踩到雷,则交换位置。
if (board[i][j] == '0')
{
*x_p = i;
*y_p = j;
return;
}
if (mine_board[x][y] == '1') {
if (times == 80) {
mine_board[x][y] == '0';
mine_board[no_x][no_y] == '1';
}
我们将以上函数的定义和实现放在 game.c 文件中
在头文件game.h中声明各种函数
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<windows.h>
#include<string.h>
#include<time.h>
#pragma warning(disable :4996)
#define COL 12
#define ROW 12
#define NUM 20
void Game();
void SetMine(char board[][COL], int row,int col,int *x_p,int *y_p);
void ShowBoard(char board[][COL], int row, int col);
int GetCount(char board[][COL], int x, int y);
#endif
我们可以确定一个大的思路,将各个函数的执行放在游戏执行函数game函数中,将game函数放在一个循环中,根据循环条件判断是否继续循环,然后将game函数放在一个main()钟函数实现即可*
以上我们便完成了扫雷的所有C语言代码
我们总结一下,这个程序主要的几点就是埋雷,计算坐标周围的雷数,保证第一次不被炸死,如果你仔细理解了这些,你就会明白其中的原理,包括为什么要在数组元素周围多一圈元素,这些模块都是游戏的核心,等你掌握了这个程序,你的逻辑思维能力就会有很大的提高!扫雷游戏还可以展开,今后有能力了再做补充。先实现这个简易版的,之后再升级吧
小白, 能力有限, 若有缺陷,请指教。