初阶扫雷小游戏(C语言详解)

1.游戏实现的大概思路

先打印一个菜单,让玩家选择输入是进行游戏还是要退出游戏,菜单打印完后通过创建数组来制作扫雷时候所要用到的棋盘并对棋盘进行初始化,然后开始布置雷,雷埋好以后最后进行排雷。
具体实现请往下看 ☟☟☟

2.具体实现代码

1、打印菜单

void menu() {
	printf("***********************\n");
	printf("********1.play*********\n");
	printf("********0.exit*********\n");
	printf("***********************\n");
}
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");
			break;
		}
	} while (input);
	return 0;
}

效果图展示:
在这里插入图片描述

2、创建数组

为方便后面功能的实现,因此我创建了两个二维数组,一个数组用来存放布置雷的信息,而另一个数组则用来显示排查出雷的个数。
由于是初级扫雷小游戏,所以棋盘上只有九格可供玩家来玩,而为何第二个数组的行和列都要加二呢,是为了保证排雷遍历时不越界,所以将99的棋盘变成了1111的棋盘。(就是将9*9的棋盘上下左右都往外扩了一格)

#define row 9     //第一个数组大小
#define col 9
#define row1 row+2    //第二个数组大小
#define col1 col+2
char save[row1][col1] = {0};       //存放雷的信息
char find[row1][col1] = {0};      //存放排查出雷的信息

3、初始化棋盘

在初始化数组时,将第一个数组初始化为0,将第二个数组初始化为*。为方便,所以我只用了一个函数进行初始化,直接用ret接收数组传过来的0和 *即可对两个数组进行初始化。

//初始化棋盘
void initboard(char board[row1][col1], int rows, int cols, char ret) {
	int i = 0;
	for (i = 0; i < rows; i++) {
		int j = 0;
		for (j = 0; j < cols; j++) {
			board[i][j] =ret;
		}
	}
}

然后利用一个函数打印棋盘看两个数组是否进行了有效的初始化。(全0代表我们将要埋雷的数组,而全*代表的是玩家所看到的。一般来说,只需要显示玩家所看到的那个数组就好,但为了测验两个数组都完成了初始化,所以先都打印一下。)

//打印棋盘
void printboard(char board[row1][col1], int ROW, int COL) {
	int i = 0;
	printf("------------------------------------\n");
	for (i = 0; i <= COL; i++) {
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= ROW; i++) {
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= COL; j++) {
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("-------------------------------------\n");
}

效果图如下:
在这里插入图片描述

4、布置雷

使用随机函数来生成随机下标埋雷。
由于是初级扫雷,所以棋盘只有9*9格,因此生成的随机下标范围只能是1-9。因为随机函数对棋盘的行和列取余后的范围是0-8,所以加一即可实现所需要的下标范围。
在生成随机下标时,要判断该下标之前是否被生成过。

//布置雷
void setboard(char board[row1][col1], int  rows, int  cols) {
	int count = lei;
	 while(count){
		int x = rand() % rows + 1;
		int y = rand() % cols + 1;
		if (board[x][y] != '1') {
			board[x][y] = '1';
			count --;
		}
	}
}

效果图如下:
在这里插入图片描述

5、排查雷

由于是用0初始化,用1来代替雷,所以在排雷时,包括输入坐标在内的九个格子里有几个1就说明有几个雷。
由于数组里面放的是字符1,而我们需要得到得是一个整型数字,所以让每个格子里的字符数字减去字符0在全部相加即可得到一共有几个雷。

//排查雷
//统计周围雷的个数
int getsavecount(char save[row1][col1], int x, int y) {
	int count = 0;
	for (int i =x -1; i <= x+1; i++) {
		for (int j = y-1; j <= y+1; j++) {
			count += (save[i][j] - '0');
		}
	}
	return count;
}
void solve(char save[row1][col1], char find[row1][col1], int rows, int cols) {
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<rows*cols-lei) {
		printf("请输入坐标:");
		scanf("%d %d", &x, &y);
		//判断坐标是否合法
		if ((x >= 1 && x <= rows) && (y >= 1 && y <= cols)) {
			if (save[x][y] == '1') {
				printf("你已经被炸死了\n");
				printboard(save, row, col);
				break;
			}
			else {
				int count = getsavecount(save, x, y);
				find[x][y] = count + '0';
				printboard(find, row, col);
				win++;
			}
		}
		else
			printf("坐标不合法,请重新输入\n");
	}
	if (win == rows * cols - lei) {
		printf("恭喜你,排雷成功!\n");
	}
}

得到周围一共有几个雷后显示在全是*的那个棋盘上,因为我们现在得到的雷的个数是一个整形数字,而在棋盘上显示雷的个数是字符型,因此把数字加上字符0就可以得到一个字符数字以显示周围雷的个数。
在这里插入图片描述

效果图如下:
在这里插入图片描述
测试排雷成功效果图:
在这里插入图片描述

3、完整代码

game.h----游戏函数的声明

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define row 9     //第一个数组大小
#define col 9
#define row1 row+2    //第二个数组大小
#define col1 col+2
#define lei 10     //初级
void initboard(char board[row1][col1], int rows, int cols, int ret);//初始化棋盘
void printboard(char board[row1][col1], int ROW, int COL);//打印棋盘
void setboard(char board[row1][col1],int  rows,int  cols);//布置雷
void solve(char save[row1][col1],char find[row1][col1], int rows,int cols);//排查雷

game.c----游戏函数的实现

#include "game.h"
//初始化棋盘
void initboard(char board[row1][col1], int rows, int cols, char ret) {
	int i = 0;
	for (i = 0; i < rows; i++) {
		int j = 0;
		for (j = 0; j < cols; j++) {
			board[i][j] =ret;
		}
	}
}
//打印棋盘
void printboard(char board[row1][col1], int ROW, int COL) {
	int i = 0;
	printf("------------------------------------\n");
	for (i = 0; i <= COL; i++) {
		printf("%d ", i);
	}
	printf("\n");
	for (i = 1; i <= ROW; i++) {
		printf("%d ", i);
		int j = 0;
		for (j = 1; j <= COL; j++) {
			printf("%c ", board[i][j]);
		}
		printf("\n");
	}
	printf("-------------------------------------\n");
}
//布置雷
void setboard(char board[row1][col1], int  rows, int  cols) {
	int count = lei;
	 while(count){
		int x = rand() % rows + 1;
		int y = rand() % cols + 1;
		if (board[x][y] != '1') {
			board[x][y] = '1';
			count --;
		}
	}
}
//排查雷
int getsavecount(char save[row1][col1], int x, int y) {
	int count = 0;
	for (int i =x -1; i <= x+1; i++) {
		for (int j = y-1; j <= y+1; j++) {
			count += (save[i][j] - '0');
		}
	}
	return count;
}
void solve(char save[row1][col1], char find[row1][col1], int rows, int cols) {
	int x = 0;
	int y = 0;
	int win = 0;
	while (win<rows*cols-lei) {
		printf("请输入坐标:");
		scanf("%d %d", &x, &y);
		if ((x >= 1 && x <= rows) && (y >= 1 && y <= cols)) {
			if (save[x][y] == '1') {
				printf("你已经被炸死了\n");
				printboard(save, row, col);
				break;
			}
			else {
				int count = getsavecount(save, x, y);
				find[x][y] = count + '0';
				printboard(find, row, col);
				win++;
			}
		}
		else
			printf("坐标不合法,请重新输入\n");
	}
	if (win == rows * cols - lei) {
		printf("恭喜你,排雷成功!\n");
	}
}

源.c----测试

#include "game.h"
void menu() {
	printf("***********************\n");
	printf("********1.play*********\n");
	printf("********0.exit*********\n");
	printf("***********************\n");
}
void game() {
	char save[row1][col1] = {0};       //存放雷的信息
	char find[row1][col1] = {0};      //存放排查出雷的信息
	//初始化棋盘
	initboard(save, row1, col1, '0');// '0'
	initboard(find, row1, col1, '*');//'*'
	//打印棋盘
	/*printboard(save, row, col);
	printboard(find, row, col);*/
	//布置雷
	setboard(save,row,col);
	printboard(save, row, col);
	//
	排查雷
	solve(save,find, 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");
			break;
		}
	} while (input);
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值