扫雷(简易版) 10*10

扫雷的游戏规则:

扫雷就是要把所有非地雷的格子揭开即胜利;踩到地雷格子就算失败。游戏主区域由很多个方格组成。使用鼠标左键随机点击一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的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语言代码

我们总结一下,这个程序主要的几点就是埋雷,计算坐标周围的雷数,保证第一次不被炸死,如果你仔细理解了这些,你就会明白其中的原理,包括为什么要在数组元素周围多一圈元素,这些模块都是游戏的核心,等你掌握了这个程序,你的逻辑思维能力就会有很大的提高!扫雷游戏还可以展开,今后有能力了再做补充。先实现这个简易版的,之后再升级吧

小白, 能力有限, 若有缺陷,请指教。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值