C语言完成一个简单的扫雷游戏

         感谢大家来看到我的文章,我在此给大家分享一个我新学到的扫雷游戏,这个游戏项目主要的组成由二维数组来显示。

        我希望大家看到我的博客的时候可以自己想想其中的生成和其中的运算,如有需要可以私聊我哦。

         首先便是显示数组show-broad来表示:定义一个show-broad二维数组;应用memset函数将指定值来填充整个数组。再次用同样的方法定义显雷数组mine-board。并且定义一个ShowBoard函数对显示数组进行格式控制。

char show_board[Row][Col];
memset(show_board, '*', sizeof(show_board));
char mine_board[Row][Col];
memset(mine_board, '0', sizeof(mine_board));
static void ShowBoard(char show_board[][Col], int row, int col)
{
	for (int i = 1;i <= row - 2;i++) {
		printf(" %3d", i);
	}
	printf("\n");
	for (int i = 1;i <= row - 2;i++) {
		printf("%2d ", i);
		for (int j = 1;j <= col - 2;j++) {
			printf("%c   ", show_board[i][j]);
		}
		printf("\n");
	}
}

之后便是将开辟的埋雷数组中埋下雷,我在这里定义一个埋雷函数:我在这里用循环埋了20个雷,用‘1’表示雷。(解释一下rand()函数:该函数是一个生成随机数的)

static void SetMines(char mine_board[][Col], int row, int col)
{
	int i = 0;
	while(i<NUM){
		int _x = rand() % (row - 2) +1;
		int _y = rand() % (col - 2) +1;
		if (mine_board[_x][_y] == BOOM) {
			continue;
		}
		mine_board[_x][_y] = BOOM;
		i++;
	}
}

        埋完雷后就到了我们该排雷的时候了:我们总该将输入坐标显示在我们定义的范围之间,便需要进行有效输入的判断。后来便是胜利和失败的判断了,赢得条件就是除雷之外的都被排除掉了,这下逻辑便介绍完了。

	int total = 0;
	while (1) {
		int x = 0;
		int y = 0;
		ShowBoard(show_board,Row,Col);
		printf("请输入坐标<x,y>#");
		scanf("%2d %2d", &x,&y);
		if (!(x >= 1 && x <= Row - 2 && y >= 1 && y <= Col - 2)) {
			printf("输入有误,从新输入\n");
			continue;
		}
		if (show_board[x][y] != '*') {
			printf("扫雷位置被排过\n");
			continue;
		}
		if (mine_board[x][y] == '1') {
			ShowBoard(mine_board, Row, Col);
			printf("你被炸死了\n");
			break;
		}
		else {
			int count = CountMines(mine_board, x, y);
            show_board[x][y] = count+'0';   
			total++;
		}
		if (total >= (Row - 2) * (Col - 2) - NUM) {
			printf("恭喜你赢了!#\n");
			break;
		}
	}

    在这段代码中有一个CountMines函数,我们都知道扫雷点击后会显示周围8个雷的总数,所以就要进行统计周围雷的数量。(解释一下:‘0’的ASCII值为48,以此类推往上的数字的ASCII值就知道了吧)我们只有‘0’和‘1’哦。

static int CountMines(char mine_board[][Col], int x, int y)
{
	return 	mine_board[x - 1][y - 1] + mine_board[x - 1][y] + \
		mine_board[x - 1][y + 1] + mine_board[x][y - 1] + \
		mine_board[x][y + 1] + mine_board[x + 1][y - 1] + \
		mine_board[x + 1][y] + mine_board[x + 1][y + 1] - 8 * '0';
}

        那莫显示后输出的值又要通过字符串显示又该干什么呢?上述大家思考一下吧。相信思考出来的结果会让你融会贯通的

        最后便是我的函数调用了,Menu为菜单,大家可以自行设计;Game为我的游戏逻辑,上述都介绍给大家了,大家可以自己尝试做做这个小项目。(解释一下:srand是随机生成的数,与上述rand函数是配套使用的)

int main()
{
	srand((unsigned long)time(NULL));
	int quit = 0;
	while (!quit) {
		Menu();
		int select = 0;
		scanf("%d", &select);
		switch (select) {
		case 1:
			Game();
			break;
		case 2:
			quit = 1;
			break;
		default:
			printf("输入有误,重新输入#\n");
			break;
		}
	}
	printf("Bye Bye\n");
	return 0;
}

        这是运行出来的样子:

        接下来就是玩游戏了,写完一个小项目,这不比打一场游戏胜利获得的荣誉感强吗铁子?

        谢谢大家阅读哦!!感谢捧场~

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值