IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 初阶扫雷小游戏(C语言详解) -> 正文阅读

[游戏开发]初阶扫雷小游戏(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;
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-08-11 12:46:26  更:2021-08-11 12:47:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 13:01:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码