C语言小游戏——推箱子(一次性版本)

2023-10-26

目录

思路:

1.游戏的开始和地图设定

2.地图场景设置和人物的四项移动 

3 .分析人物的移动:

4 .判断结束条件:


思路:

l.分析
编写代码实现:
控制游戏角色,在地图上,避开障碍物,将箱子推到目标点

游戏元素:
角色(控制移动)
地图(游戏场所)(空地,墙壁,箱子,目标点)
2.代码分析
图形 ——>数据  图形数据化
            操作数据
数据 ——>图形  数据图形化

3.写成函数
函数:干活
功能——>函数

4.控制移动
从键盘获取指令,执行相应的函数
指令:wsad WSAD

1.游戏的开始和地图设定

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
#include<conio.h>
/*
l.分析
编写代码实现:
控制游戏角色,在地图上,避开障碍物,将箱子推到目标点

游戏元素:
角色(控制移动)
地图(游戏场所)(空地,墙壁,箱子,目标点)


2.代码分析
图形 ——>数据  图形数据化
			操作数据
数据 ——>图形  数据图形化

3.写成函数
函数:干活
功能——>函数

4.控制移动
从键盘获取指令,执行相应的函数
指令:wsad WSAD
*/
#define		MAP_ROW		8		//地图行数
#define		MAP_CLO		8		//地图列数

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

typedef enum 
{
	map_land=0,	//空地
	map_wall,	//墙
	map_hero,	//人
	map__box,	//箱子
	map__end,	//目标点
	map_null	//黑的地方
}MapEle;

MapEle mapArr[MAP_ROW][MAP_CLO] = {
	{map_null,map_null,map_wall,map_wall,map_wall,map_null,map_null,map_null},
	{map_null,map_null,map_wall,map__end,map_wall,map_null,map_null,map_null},
	{map_null,map_null,map_wall,map_land,map_wall,map_wall,map_wall,map_wall},
	{map_wall,map_wall,map_wall,map__box,map_land,map__box,map__end,map_wall},
	{map_wall,map__end,map_land,map__box,map_hero,map_wall,map_wall,map_wall},
	{map_wall,map_wall,map_wall,map_wall,map__box,map_wall,map_null,map_null},
	{map_null,map_null,map_null,map_wall,map__end,map_wall,map_null,map_null},
	{map_null,map_null,map_null,map_wall,map_wall,map_wall,map_null,map_null}


};

//函数声明
void initGameData();
void drawMap();
void playGame();
void isEndGame();
void heroMove(int off_X,int off_Y);


void WanYX()
{
	while (1)
	{
		playGame();		//进行游戏
		isEndGame();	//结束条件	
	}
}
void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			WanYX();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
}


int main()
{
	here:
	while (1)
	{
		test();
	}
	//游戏初始化数据
	initGameData();
	//游戏主循环
	return 0;
}

2.地图场景设置和人物的四项移动 

void drawMap()
{
	system("cls");
	for (int i = 0; i < MAP_ROW; i++)
	{
		for (int j = 0; j < MAP_CLO; j++)
		{

			switch (mapArr[i][j])
			{
			case map_land:
				printf("  ");//空地
				break;
			case map_wall:
				printf("■");//墙
				break;
			case map_hero:
				printf("♂");//人物
				break;
			case map__box:
				printf("●");//箱子
				break;
			case map__end:
				printf("☆");//目标点
				break;
			case map__box+map__end:
				printf("★");    //箱子推到目标点上
				break;
			case map_hero + map__end:
				printf("♀");    //人物站在目标点上
				break;
			case map_null:
				printf("  ");    //黑色区域 
				break;
			default:
				break;
			}
		}
		printf("\n");
	}
	printf("\n");
}
void playGame()
{
	drawMap();
	switch (getch())
	{
		break;
	case'w':
	case'W':
		heroMove(-1,0);
		break;
	case's':
	case'S':
		heroMove(1, 0);
		break;
	case'A':
	case'a':
		heroMove(0, -1);
		break;
	case'D':
	case'd':
		heroMove( 0,1);
		break;
	default:
		break;
	}
}

3 .分析人物的移动:

void heroMove(int off_X, int off_Y)
{
	int heroPos_X = 0;
	int heroPos_Y = 0;
	/*
		****向上走****

		一、找人
		遍历当前关卡数组,记住下标
		二、控制
		判断不同的情况,决定移动逻辑(修改数组元素的值)
		*/
	for (int i = 0; i < MAP_ROW; i++)
	{
		for (int j = 0; j < MAP_CLO; j++)
		{
			if (map_hero == mapArr[i][j] ||
				map_hero + map_land == mapArr[i][j] ||
				map_hero + map__end == mapArr[i][j])
			{
				heroPos_X = i;
				heroPos_Y = j;
			}
		}
	}
	//	人现在的坐标:mapArr[heroPos_X][heroPos_Y]
	//	人上面的坐标:mapArr[heroPos_X-1][heroPos_Y]
	//	人下面的坐标:mapArr[heroPos_X+1][heroPos_Y]
	//	人左面的坐标:mapArr[heroPos_X][heroPos_Y-1]
	//	人右面的坐标:mapArr[heroPos_X][heroPos_Y+1]
	//	人接下来的坐标:mapArr[heroPos_X+off_X][heroPos_Y+off_Y]

	//上面是空地或者目标点
	if (map_land == mapArr[heroPos_X + off_X][heroPos_Y + off_Y] ||
		map__end == mapArr[heroPos_X + off_X][heroPos_Y + off_Y])
	{
		//人走上去(当前位置,人离开 上面位置,人过来)
		mapArr[heroPos_X][heroPos_Y] -= map_hero;
		mapArr[heroPos_X + off_X][heroPos_Y + off_Y] += map_hero;
	}
	//上面是箱子或者箱子在点上
	else if (map__box == mapArr[heroPos_X + off_X][heroPos_Y + off_Y] ||
		map__end + map__box == mapArr[heroPos_X - 1][heroPos_Y])
	{
		//上面的上面:只有是空地或者目标点才能推动
		if (map_land==mapArr[heroPos_X + off_X*2][heroPos_Y + off_Y*2] ||
			map__end==mapArr[heroPos_X + off_X*2][heroPos_Y + off_Y*2])
		{
			//推动箱子
			//当前位置,人离开 
			mapArr[heroPos_X][heroPos_Y] -= map_hero;
			//上面位置,人过来
			mapArr[heroPos_X + off_X][heroPos_Y + off_Y] += map_hero;
			//上面位置,箱子离开 
			mapArr[heroPos_X + off_X][heroPos_Y + off_Y] -= map__box;
			//上面的上面,箱子过来
			mapArr[heroPos_X + off_X*2][heroPos_Y + off_Y*2] += map__box;
		}
	}
}

4 .判断结束条件:


void isEndGame()
{
	int isEnd = 1;
	for (int i = 0; i < MAP_ROW; i++)
	{
		for (int j = 0; j < MAP_CLO; j++)
		{
			if (map__box==mapArr[i][j]||
				map__box +	map_land == mapArr[i][j])
			{
				isEnd = 0;
			}
		}
	}
	if(isEnd)
	{		
			drawMap();
			exit(0);

	}
}

我是Try_harder,正在磕磕绊绊中成长~

会结束之后重新开始游戏的小伙伴,留言一下咱们私聊一下。

看到最后不要忘记点赞哦!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言小游戏——推箱子(一次性版本) 的相关文章

  • 前端 echarts 导出图片到excel中

    这里演示的demo是基于react的 yarn add exceljs file saver echarts 首先安装以上三个包 直接使用下列代码即可 import React Component from react import App
  • FISCO BCOS(二十一)——— 实现对byte32[]数组类型的输入

    如果对一个byte32 类型的数组进行传参 我们先看一下一个string类型转成16进制是什么样的 字符串与进制转换http www ku51 net ox2str 在区块链中地址一般是0x开头 也就是16进制标识 比特币不是 所以在这里要
  • c++的可视化计算器

    学生党的一个课程设计 希望可以对有些人有些帮助 第一次发 不好的话请多多原谅 c 一 题目要求 设计一个可视化的计算器 可以执行 等操作 要求使用API来编写程序 我的计算器输入的时候是以 号开始 二 需求分析 1 问题描述 用api来编写
  • 解决easyUI 1.2.6 + datagrid在 IE浏览器下无法重新加载、查询

    I easyUI 1 2 6 datagrid在 IE浏览器目前存在的问题 1 无法重新加载 查询 var row dg user table datagrid getSelected dg userPri table datagrid m

随机推荐

  • C++写的encodeURIComponent

    最近在用c 找了几个库没有找到与javascript的URI编码相对应的函数 自己写一个 只写了编码 测试可以在javascript里用decodeURIComponent正常解码 uri编码字符串 param in 必须是utf 8编码的
  • 彻底解决电脑自动更新问题

    是不是隔几天电脑关机 重启的时候那会出现更新后再关机或者更新后再重启 没有立刻关机或重启是不是很烦 去设置那里的更新只能是短暂的暂停更新七天而已 这种方法没什么用的 治表不治本 只能推迟而已 如果windows推送一下小升级七天后你又得更新
  • 什么是JWT?(细致讲解)

    什么是JWT 转自 java技术爱好者 链接 https www zhihu com question 485758060 answer 2257869896 来源 知乎 起源 需要了解一门技术 首先从为什么产生开始说起是最好的 JWT 主
  • 状态设计模式

    目录 前言 状态机原理 状态机的实现方式一 分支逻辑法 状态机实现方式二 查表法 状态机实现方式三 状态模式 总结 参考资料 前言 在实际的软件开发中 状态模式并不是很常见 但是在能够用到的场景里 可以发挥比较大的作用 状态模式一般用来实现
  • HTTPSHandler & SSL Error

    我在服务器ubuntu中 尝试使用pip3 但是出现下面的报错 ImportError cannot import name HTTPSHandler 通过查询资料 发现报错的原因是 该pip3 5中没有安装好openssl 我尝试在pyt
  • python的安装过程

    python的安装 进入官网 点击进入官方链接 点击官方后 进入该页面 可以英译中 点击 Downloads即下载 选择适合自己的系统 windows系统即选择windows 苹果系统即选择macOS 进入下载页面后 选择python的版本
  • 2023面试自动化测试面试题【含答案】

    1 你做了几年的测试 自动化测试 说一下 selenium 的原理是什么 我做了五年的测试 1年的自动化测试 selenium 它是用 http 协议来连接 webdriver 客户端可以使用 Java 或者 Python 各种编程语言来实
  • flask中的Flask、request、render_temple、redirect和url_for

    学flask也有一个多星期了 对这个web框架也有了一点的了解 梳理一些基础的知识点 还是小白一只 代码写得比较low 若文章有错误的地方欢迎大佬随时指正 代码中被注释掉的代码是关于预防csrf 无视即可 主程序脚本 1 from flas
  • 01.Vuepress2.x 创建自己的技术文档站

    目录 一 简介 二 安装 三 配置 四 启动 五 效果图 六 编译 一 简介 Vuepress2 x 英文官网 Vuepress2 x 中文官网 二 安装 参考 步骤1 新建一个文件夹 如 Doc2 0 步骤2 进入文件夹目录 新建 pac
  • Anaconda对python环境管理常用命令

    创建环境 n 为指定环境名称 python 未指定python的版本 conda create n env name python 3 6 删除环境 conda remove n env name all 删除环境的包 conda remo
  • LordOfTheRoot_1.0.1靶机入侵

    LordOfTheRoot 1 0 1靶机入侵 1 环境搭建 下载地址 https www vulnhub com entry lord of the root 101 129 下载后用 VMware 或者 VirtualBox 打开 并配
  • ocr文字识别环境部署

    一 Linux环境下部署1 环境要求操作系统 CenterOS7 主要软件环境 python3 9X64 opencv4 5 5 PaddleOCR2 5 paddlepaddle2 2 1 python运行环境建议3 6 3 91 环境安
  • 初级学习01

    打开cmd的方式 1 管理员方式进行 2 Win R 输入cmd 3 在任意文件夹下面 shift 鼠标右键 4 资源管理器的地址栏前 cmd路径 常用的Dos命令 1 盘符切换 C D F 2 查看当前目录下的所有文件 dir 3 切换目
  • ionic2 打包android包时报'C:\Users\Administrator\AppData\Local\Android\sdk' does not exist.

    写在前面 为了能及时的将自己踩到的前端坑 包括ionic angular ReactNative 小程序 APICloud 分享给大家 以后会逐渐将文章转移到微信公众号 前端e家 front e family 可直接扫码关注 公众号会不定期
  • 解析@EnableWebMvc 、WebMvcConfigurationSupport和WebMvcConfigurationAdapter

    在spring boot spring mvc 的项目中 有些时候我们需要自己配置一些项目的设置 就会涉及到这三个 那么 他们之间有什么关系呢 首先 EnableWebMvc WebMvcConfigurationSupport 使用了 E
  • 设置button的边框颜色和宽度

    UIButton button UIButton buttonWithType UIButtonTypeCustom button frame CGRectMake 100 100 100 100 button layer cornerRa
  • Flutter图片选择 image_picker(官方)插件使用详解

    Flutter图片选择 image picker 官方 插件使用详解 IOS自测 image picker GitHub最新版本查看 https github com flutter plugins 下滑找到image picker可以看到
  • apipost-一键压测

    apipost新功能可实现一键压测 接口压测实践 使用场景 对指定接口进行性能测试 实现方式 为实现高性能的并发需求 使用自研的压测引擎 可以实现一万以上并发 项目已经开源 github地址 https github com Apipost
  • STM32 GPIO: pull up, pull down, no pull

    gpio 有3种状态 上拉 下拉 不拉 首先 确定GPIO口的输入和输出 当GPIO处于output模式 一般选择no pull 引脚能够正确地输出目标值 当GPIO处于input模式 需要根据默认的输入值来确定配置模式 如果默认输入的值为
  • C语言小游戏——推箱子(一次性版本)

    目录 思路 1 游戏的开始和地图设定 2 地图场景设置和人物的四项移动 3 分析人物的移动 4 判断结束条件 思路 l 分析 编写代码实现 控制游戏角色 在地图上 避开障碍物 将箱子推到目标点 游戏元素 角色 控制移动 地图 游戏场所 空地