首页 > 其他分享 >用函数和数组实现扫雷游戏(从0开始)

用函数和数组实现扫雷游戏(从0开始)

时间:2024-03-23 17:33:03浏览次数:37  
标签:ROWS 游戏 int mine COLS char 扫雷 数组 printf

文章目录

概要

学完数组和函数后我们可以通过所学知识写一个扫雷游戏,并实现一些拓展功能。
我们采用多文件联调的模式来制作,这里需要先建好三个文件
game.h
game.c
mine sweeper.c

整体架构流程(这里用VS2023来制作)

  1. 在mine sweeper.c中我们要先实现游戏的整体架构一开始要有一个菜单面板呈现在我们面前,所以我们可以设计一个menu()的函数来实现,因为不需要返回值所以我们建一个void类型的就可以。menu函数

  2. 然后我们继续写main函数,因为我们至少玩一次所以我们选择do-while循环,根据菜单我们要选择一下先建立一个整型input变量,然后用Switch做为开关来设计
    在这里插入图片描述

  3. 做完上面这些,我们就要开始扫雷游戏函数的实现了,这里命名它为game(),根据前面的推理我们先在game.h上利用宏定义ROWS,COLS,ROW,COL,利用这些就可以定义两个数组一个数组用来存放雷的信息,一个数组用来存放展示的信息,因为如果定义数字数组,会与排雷时的数字有冲突所以定义两个字符数组,并在最前面加上game.h
    在这里插入图片描述

    在这里插入图片描述

  4. 然后我们开始初始化棋盘,建立一个初始化棋盘的函数InitializeBoard(char arry[ROWS][COLS], int row, int col, char set)后面的set是为了方便赋予值,建立一个打印棋盘的函数void PrintBoard(char arry[ROW][COL],int row,int col)
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    5. 初始化完棋盘然后我们就可以布置雷了,布置雷我们需要建立一个布置雷的函数void PutMine(char mine[ROW][COL], int row, int col),这里需要用到rand()所以我们先在main函数里面布下随机种子srand并且用到时间戳具体做法请看图片(注意补充头文件stdlib.h和time.h)
    在这里插入图片描述
    然后开始写布置雷的函数
    因为我们不只有一个雷所以要用到while循环(具体做法看图片)
    在这里插入图片描述

然后写排查雷的函数
在这里插入图片描述
还有设置一个获取排查雷周围信息的函数
在这里插入图片描述

代码实现

game.h

#pragma once

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

#define ROW 9
#define COL 9

#define ROWS ROW + 2
#define COLS COL + 2

#define COUNT 10

void InitializeBoard(char arry[ROWS][COLS], int row, int col, char set);//初始化棋盘
void PrintBoard(char arry[ROWS][COLS],int row,int col);//打印棋盘
void PutMine(char board[ROWS][COLS], int row, int col);//布置雷
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);//排查雷


game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"


void InitializeBoard(char arry[ROWS][COLS], int rows, int cols, char set)
{
	int i = 0;
	for (i = 0;i < rows;i++)
	{
		int j = 0;
		
		for (j = 0;j < cols; j++)
		{
			arry[i][j] = set;
		}
	}
}

void PrintBoard(char arry[ROW][COL], 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++)
	{
		int j = 0;
		printf("%d ", i);
		for (j = 1;j <= col;j++)
		{
			printf("%c ", arry[i][j]);
		}
		printf("\n");
	}
}

void PutMine(char board[ROWS][COLS], int row, int col)
{
	int count = COUNT;
    
	while (count)
	{
		int x = rand() % row + 1;
		int y = rand() % col + 1;

		if (board[x][y] == '0')
		{
			board[x][y] = '1';
			count--;
		}
	}

}


int GetMine(char mine[ROWS][COLS], int x, int y)
{
	return mine[x - 1][y] +mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 1][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] - 8 * '0';
}
void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
	int x = 0;
	int y = 0;
	int win = 0;
	while (win < row*col-COUNT)
	{
		printf("请输入坐标-》");
		scanf("%d %d", &x, &y);
		

		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (mine[x][y] == '1')
			{
				printf("很遗憾你被炸死了\n");
				PrintBoard(mine, ROW, COL);
				break;
			}
			else
			{
				int count = GetMine(mine, x, y);
				show[x][y] = count + '0';
				PrintBoard(show, ROW, COL);
				win++;
			}
		}
		else
		{
			printf("坐标非法请重新输入\n");
		}
	}
	if (win == row * col - COUNT)
	{
		printf("恭喜您扫雷成功\n");
		PrintBoard(mine, ROW, COL);
		
	}
}

mine sweeper.c

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include"game.h"


void menu()
{
	printf("*********************\n");
	printf("******  1.play ******\n");
	printf("******  0.exit ******\n");
	printf("*********************\n");

}

void game()
{
	char mine[ROWS][COLS] = { 0 };//雷的信息
	char show[ROWS][COLS] = { 0 };//展示出的信息
	
	//初始化棋盘
	InitializeBoard(mine, ROWS, COLS, '0');
	InitializeBoard(show, ROWS, COLS, '*');
	//打印棋盘
	//PrintBoard(mine, ROW, COL);
	PrintBoard(show, ROW, COL);
	//布置雷
	PutMine(mine, ROW, COL);
	PrintBoard(mine, ROW, COL);
	//排查雷
	FindMine(mine, show, ROW, COL);
}
int main()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	
	do
	{
		menu();
		printf("请选择——》");
		scanf("%d", &input);

		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("选择错误,请重新输入");
			break;
		}


	} while (input);
	return 0;
}

小结

写扫雷这个小项目一开始虽然有点困难,但好在坚持了下来

标签:ROWS,游戏,int,mine,COLS,char,扫雷,数组,printf
From: https://blog.csdn.net/cui211472325/article/details/136914975

相关文章

  • c++小游戏
    #include<bits/stdc++.h>#include<windows.h>usingnamespacestd;inta,b,c;voidOK(){ system("cls"); cout<<"你时不时有饼?\n(1:yes2:NO)\n"; cin>>a; if(a==1){ cout<<"您以通关!"; }else{ system(&q......
  • 代码随想录算法训练营day31 | leetcode 455. 分发饼干、376. 摆动序列、53. 最大子数
    目录贪心理论基础核心:题目链接:455.分发饼干-简单题目链接:376.摆动序列-中等题目链接:53.最大子数组和-中等贪心理论基础核心:由局部推全局最优题目链接:455.分发饼干-简单题目描述:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每......
  • 游戏开发(skynet框架):开服操作接入中央后台
    一个需求:控制游戏单服开服接入中央后台,支持定时(指定时间)、定量(当前已开放最新服的已注册数量)的方式;定时定量开服主要是中央后台功能,游戏服只需要接入控制开服逻辑。那么中央后台怎么通知游戏服;通过http协议;(skynet框架提供了http组件的支持,可以方便快速地搭建起来)对于滚服架构,......
  • 用索引"copyofRange(int[] arr, int from,int to)"复制数组中的数,形成新数组的方法
    publicclasstest2{publicstaticvoidmain(String[]args){//定义原数组int[]arr={1,2,3,4,5,6,7,8,9};//引用copyofRange方法复制元素到新数组中int[]newcopy=copyofRange(arr,3,7);//输出新数组for(inti=......
  • 游戏开发:移植golang共享库 for lua
    一些奇奇怪怪的尝试:)随笔记录下将golang模块导出为共享库供lua使用(一般用于功能模块适配和迁移),这里给出一个借助c语言实现中间层通信的方案(不要问我为什么不使用ffi)。假设使用go实现底层模块core,export相关API(如下例的G_Signature)供外部使用,这里是被C层使用。那么需要将go模块编......
  • mongoDB使用记录:误用数组索引
    版本:mongoDB4.2集群方案:副本+分片一个问题场景:集合内对多个字段建立索引,其中包含数组索引;当执行查询时,业务查询期望命中数组索引,mongodb筛选策略首次给出的执行方案命中了另外的索引key,导致当次慢查询,扫描超过1000w数量的文档,业务出现卡顿;处理&优化方案:mongodb筛选策略命中......
  • 基于ssm+vue.js的游戏销售系统附带文章和源代码设计说明文档ppt
    文章目录前言详细视频演示具体实现截图技术栈后端框架SSM前端框架Vue持久层框架MyBaits系统测试系统测试目的系统功能测试系统测试结论为什么选择我代码参考数据库参考源码获取前言......
  • 游戏开发:服务器部署监控告警
    线上服务器的监控告警,我们暂且从三个层级上分析;业务层:业务相关的日志告警机制。跟业务设计强相关,比如客户端的业务上行请求数据异常之类的告警,业务上定义日志级别(INFO/WARN/ERROR),输出到指定日志文件并通过业务层逻辑抛出,数据分析的埋点、业务行为相关的辅助日志都在这里实现;一套......
  • 程序跑飞原因总结 && 引脚配置&&中断&&while循环&&数组越界 &&硬件原因
    2023.11月开始做了新项目,技术不到家导致程序多次跑飞,现在总结如下一、引脚配置错误错误原因:同一个引脚初始化两次1.硬件原理图变更,引脚功能变动,改动时不仔细2.代码规范不好:对于引脚的宏定义封装不好,除了.h文件还在其他地方出现数字引脚错误现象:1.程序跑飞2.调试时将新增......
  • 数组 题目
    1.2034:【例5.1】反序输出【题目描述】输入n个数,要求程序按输入时的逆序把这n个数打印出来,已知整数不超过100个。也就是说,按输入相反顺序打印这n个数。【输入】输入一行共有n个数,每个数之间用空格隔开。【输出】如题要求:一行,共有n个数,每个数之间用一个空格隔开。......