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 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 扫雷小游戏 -> 正文阅读

[游戏开发]扫雷小游戏

做一个简单的小游戏(愉悦一下身心)

思路:

1.两个字符数组,一个用以存原图的雷数据。一个用以扫后展示的数据。

2.dfs来扫过多的冗余状态。

3.还有计时功能和插flag功能要完善。目前判win是通过剩下的不能填的都是雷来判定的。

#pragma once
#include "game.h"

int vis[N][M];///保存访问信息
int dx[8] = { -1,-1,0,1,1,1,0,-1 };
int dy[8] = { 0,1,1,1,0,-1,-1,-1 };

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

void play(int op) {
	int n = 9; int m = 9; int mine = 20;
	char ma1[N][M];///原图
	char ma2[N][M];///输出信息图

	init(ma1, n, m, '0');
	init(ma2, n, m, '*');

	arrangemine(ma1, n, m , mine);

	display(ma1,ma2,n,m,op);

	int result=modify(ma1,ma2, n, m , mine ,op);
	
	if (result == 0)
	{
		printf("扫雷失败!!!\n\n");
	}
	else {
		printf("扫雷成功!!!\n\n");
	}
	return;
}

void init(char str[N][M], int n, int m,char op)
{
	
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			str[i][j] = op;
		}
	}
}

void display(char str1[N][M], char str2[N][M], int n, int m,int op)
{
	
	for (int i = 0; i <= n; i++)
	{
		for (int j = 0; j <= m; j++)
		{
			if (i == 0)	printf("%c ",'0'+j);
			else if (j == 0) printf("%c ", '0'+i);
			else  printf("%c ", str2[i][j]);
		}
		printf("\n");
	}printf("\n");

	if (0 == op)
	{
		for (int i = 0; i <= n; i++)
		{
			for (int j = 0; j <= m; j++)
			{
				if (i == 0)	printf("%c ", '0' + j);
				else if (j == 0) printf("%c ", '0' + i);
				else  printf("%c ", str1[i][j]);
			}
			printf("\n");
		}printf("\n");
	}
}

void arrangemine(char str[N][M], int n, int m , int mine) {
	srand((unsigned)time(NULL));
	while (mine)
	{
		int x = rand() % 9 + 1;
		int y = rand() % 9 + 1;

		if (str[x][y] != '1')
		{
			str[x][y] = '1';
			mine--;
		}
	}
}

int modify(char str1[N][M], char str2[N][M], int n, int m, int mine, int op){

	while (1)
	{
		int x, y;
		printf("输入你的坐标:\n\n");
		while ( ~scanf_s("%d%d",&x,&y) )
		{
			if (x<1 || x>n || y<1 || y>m || str2[x][y] != '*' )
			{
				printf("输入不合法\n\n");
			}
			else
			{
				if (str1[x][y] == '1') return 0;
		

				int cnt = 0;
				for (int k = 0; k < 8; k++)
				{
					int nx = x + dx[k];
					int ny = y + dy[k];

					if (nx<1 || nx>n || ny<1 || ny>m) continue;

					if (str1[nx][ny] == '1') cnt++;
				}
				str2[x][y] = '0'+cnt;

				if( 0==cnt ) cal( str1 ,str2, n , m , x , y ); ///dfs一并修改周围的8个没炸弹的

				if (check(str1, str2, n, m, mine) == true) return 1;
			}
			display(str1,str2, n, m,op);
			printf("输入你的坐标:\n\n");
		}
	}
	return 1;
}
void cal(char str1[N][M], char str2[N][M], int n, int m, int x, int y) {
			
	int cnt = 0;
	for (int k = 0; k < 8; k++)
	{
		int nx = x + dx[k];
		int ny = y + dy[k];

		if (nx<1 || nx>n || ny<1 || ny>m) continue;

		if (str1[nx][ny] == '1') cnt++;
	}
	
	if (cnt == 0)
	{
		str2[x][y] = '0';
		vis[x][y] = true;
	}
	else return;
	
	for (int k = 0; k < 8; k++)
	{
		int nx = x + dx[k];
		int ny = y + dy[k];

		if (vis[nx][ny] || nx<1 || nx>n || ny<1 || ny>m) continue;
		
		cal(str1, str2, n, m, nx, ny);
	
	}

}
bool check(char str1[N][M],char str2[N][M], int n, int m ,int std)
{
	int cnt = 0;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= m; j++)
		{
			if (str2[i][j] == '*') cnt++;
		}
	}
	if (cnt == std) return true;
	else return false;
}
#pragma once
#include<stdio.h>
#include<random>
#include<time.h>
#include<stdlib.h>
#define N 20
#define M 20

void menu();


void play(int op);

void init(char str[N][M], int n, int m,char op);

void display(char str1[N][M],char str2[N][M], int n, int m,int op);

void arrangemine(char str[N][M], int n, int m , int mine);

int modify(char str1[N][M],char str2[N][M], int n, int m ,int wins,int op);

void cal(char str[N][M],char str2[N][M] , int n, int m, int x, int y);

bool check(char str1[N][M],char str2[N][M], int n, int m, int std);
#pragma once
#include "game.h"



int main()
{
	menu();
	printf("请输入:\n");
	int input;
	while ( scanf_s("%d", &input) != EOF)
	{
		bool flag = 1;
		switch (input)
		{
		case 1:
			printf("选择上帝模式(0)or正常模式(1)\n");
			int input2;
			while (scanf_s("%d", &input2) != EOF) {
				bool ok = 1;
				switch (input2)
				{
				case 0:
					ok = 0;
					play(0);
					break;
				case 1:
					ok = 0;
					play(1);
					break;
				default:
					printf("输入不合法\n");
					break;
				}
				if (!ok) break;
			}
			break;
		case 2:
			flag = 0;
			break;
		default:
			printf("输入不合法\n");
			break;
		}

		if (!flag)
		{
			break;
		}
		printf("请输入:\n");
		menu();
	}
}

  游戏开发 最新文章
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-27 12:12:28  更:2021-08-27 12:13:24 
 
开发: 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/3 18:20:49-

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