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语言实现扫雷小游戏

C语言实现扫雷小游戏

扫雷

在这里插入图片描述

思路

1.用二维数组存储数据,考虑到显示的内容与实际存储的内容有差别,故定义两个完全相同的二维数组,一个用取名mine_board用来存储实际的雷的位置,另一个show_board用来向玩家显示。
2.为了避免边框位置周边雷的个数不方便统计,所以定义一个比实际使用的数组大2的数组,只使用其中没有边框的部分:
在这里插入图片描述
埋雷时只在中间埋,向用户展示时也只显示中间部分,这样便于统计雷的个数,不用考虑边角的特殊情况。
3.电脑埋雷时使用随机数,在随机生成的坐标中埋雷,用字符1表示有雷,用字符0表示没有雷。

代码实现

程序多文件形式,一个头文件clear_mine.h和两个源文件main.c,clear_mine.c,其中main.c和 clear_mine.c之间只有Game一个函数的交互,耦合低,两个文件彼此高度独立。
程序注释中对每个函数的作用有详细解释, 源码如下:

1.头文件clear_mine.h(包含头文件、宏定义、函数声明等)

#pragma once//防止头文件被重复包含 
#define  _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>

#define ROW 12//行数
#define COL 12//列数
#define NUM 20//雷的个数
//这三个参数都可以根据需要更改,以选择不同的难度等级

#define SHOW '*'//面板初始化显示

extern void Game();//声明Game函数

2.源文件main.c(程序入口)

#include"clear_mine.h"//包含头文件

void Manu()//游戏主菜单
{
	printf("------------------------\n");
	printf("+----1.Play  0.Quit----+\n");
	printf("------------------------\n");
}
int main()
{
	int select = 0;
	int quit = 0;
	while (!quit)
	{
		Manu();//显示主菜单
		printf("Please select:");
		//select变量用于存放用户的选择
			scanf("%d",&select);
			switch (select){
			case 1:
				Game();//调用Game函数,进入游戏
				break;
			case 0:
				quit = 1;
				printf("Bye bye!");
				break;
			default:
				printf("Enter error!\n");
				break;
			}
			
	}
	system("pause");
	return 0;
}

3.源文件clear_mine.c(游戏的具体实现)

#include"clear_mine.h"
static void SetMines(char mine[][COL], int row,int col)
{
	//用'0'表示没有雷,'1'表示有雷
	int num = NUM;//雷的个数
	while (num){
		int x = rand() % (row - 2) + 1;
		int y = rand() % (col - 2) + 1;
		//若该位置已经有雷,则重新生成随机数
		if (mine[x][y] != '1'){
			mine[x][y] = '1';
			num--;
		}
	}
}
static void ShowLine(int col){
	for (int i = 1; i <= col - 1; i++){
		printf("----");
	}
	printf("\n");
}

static void ShowBoard(char show[][COL], int row,int col)//显示面板
{
	
	printf("    ");
	for (int i = 1; i <= (col - 2); i++){
		printf("%-4d", i);
	}
	printf("\n");
	ShowLine(col);//用ShowLine函数打印横线

	for (int i = 1; i <= row-2; i++){
		printf("%2d|", i);
		for (int j = 1; j <= col-2; j++){
			printf(" %c |", show[i][j]);
		}
		printf("\n");
		ShowLine(col);
	}
}

static char Count(char board[][COL],int x,int y)
{
	//统计当前位置周边雷的个数
	return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1] + \
		board[x][y + 1] + board[x + 1][y + 1] + board[x + 1][y] + \
		board[x + 1][y - 1] + board[x][y - 1] - 8 * '0' + '0';
	//将雷的个数转换字符型并返回
}

void Game()
{
	srand((unsigned long)time(NULL));//种随机数种子
	
	char show_board[ROW][COL];//用于显示面板的数组
	char mine_board[ROW][COL];//用于存放雷位置的数组

	//用memset对数组进行初始化
	memset(show_board, SHOW,sizeof(show_board));
	memset(mine_board, '0', sizeof(mine_board));

	//二维数组传参,数组名、行列  
	SetMines(mine_board, ROW, COL);//埋雷
	int count = 0;
	//count表示还需要进行排雷的坐标个数
	count = (ROW - 2)*(COL - 2) - NUM;
	while (count)
	{
		ShowBoard(show_board, ROW, COL);//显示面板的函数

		int x = 0;
		int y = 0;
		printf("Please enter your position:\n");
		scanf("%d %d", &x, &y);
		//对输入的坐标进行合法性判断
		if (x<1 || x>ROW || y<1 || y>COL){
			printf("Enter error!\n");
			continue;
		}
		if (show_board[x][y] != SHOW){
			printf("The coordinates have been cleaned!\n");
			continue;
		}
		//判断该位置是否有雷
		if (mine_board[x][y] == '1'){
			ShowBoard(mine_board, ROW, COL);
			printf("Game over...\n");
			break;
		}
		//统计周围雷的个数,并显示到当前坐标
		show_board[x][y] = Count(mine_board,x,y);
		count--;
		system("cls");
		
	}
	if (count == 0){
		printf("You win!\n");
	}
}

运行截图

在这里插入图片描述

  游戏开发 最新文章
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-29 21:53:49  更:2021-08-29 21:53:55 
 
开发: 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/2 10:07:29-

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