小游戏:推箱子与推箱子简化版

2023-11-15

  在第一版的代码中,将人在目标点上以及箱子在目标点上另外输出,在后续的获取方向键并处理时,只需减去人和箱子的数字就可以刷新目标点的显示,不会出现“吃”目标点的情况。
  而在第二版的代码中,使用偏移值的改变来简化代码,只需通过方向键的按键活动来改变偏移值,就可实现通过两个嵌套的if语句来进行人、箱子、目标点的改变与刷新。
以下是第一版的推箱子代码:

#include <stdio.h>
#include <getch.h>
#include <stdlib.h>//system  头文件
int main(int argc,const char* argv[])
{
	//定义迷宫地图
	char map[8][8] = {
		{0,0,1,1,1,1,0,0},
		{0,0,1,4,4,1,0,0},
		{0,1,1,0,4,1,1,0},
		{1,1,1,0,3,4,1,0},
		{1,1,0,3,0,0,1,1},
		{1,0,0,1,3,3,0,1},
		{1,0,0,2,0,0,0,1},
		{1,1,1,1,1,1,1,1},
	};
	
	char m_x = 6,m_y = 3;

	int step = 0;
	for(;;)
	{
		int cnt = 0;
		system("clear");
		for(int i =0;i<8;i++)
		{
			for(int j =0;j<8;j++)
			{
				switch(map[i][j])
				{
					case 0:printf("  ");break;	
					case 1:printf("# ");break;	
					case 2:printf("@ ");break;	
					case 3:printf("$ ");break;	
					case 4:printf("0 ");break;	
					case 6:printf("@ ");break;//人在目标点上,显示人	
					case 7:printf("$ ");
							cnt++;
							break;//箱子在目标点上,显示箱子
				}
			}
			printf("\n");
		}
		if(cnt == 4)
		{
			printf("游戏结束,共走了%d步\n",step);
			return 0 ;
		}

		switch(getch())
		{
			case 183:
				if(0 == map[m_x-1][m_y] || 4  == map[m_x-1][m_y])
				{
					map[m_x-1][m_y] += 2;	
					map[m_x][m_y] -= 2;
					m_x--;
					step++;
				}
				else if(3 == map[m_x-1][m_y] || 7 == map[m_x-1][m_y])//箱子有可能在空地 有可能在目标点上
				{	
					if(0 == map[m_x-2][m_y] || 4  == map[m_x-2][m_y])
					{
						map[m_x-2][m_y] += 3;
						map[m_x-1][m_y] -= 1;
						map[m_x][m_y] -= 2;
						m_x--;//更新人的坐标
						step++;
					}
				}
				break;
			case 184:
				if(0 == map[m_x+1][m_y] || 4  == map[m_x+1][m_y])
				{
					map[m_x+1][m_y] += 2;	
					map[m_x][m_y] -= 2;
					m_x++;
					step++;
				}
				else if(3 == map[m_x+1][m_y] || 7 == map[m_x+1][m_y])//箱子有可能在空地 有可能在目标点上
				{	
					if(0 == map[m_x+2][m_y] || 4  == map[m_x+2][m_y])
					{
						map[m_x+2][m_y] += 3;
						map[m_x+1][m_y] -= 1;
						map[m_x][m_y] -= 2;
						m_x++;//更新人的坐标
						step++;
					}
				}
				break;
			case 185:
				if(0 == map[m_x][m_y+1] || 4  == map[m_x][m_y+1])
				{
					map[m_x][m_y+1] += 2;	
					map[m_x][m_y] -= 2;
					m_y++;
					step++;
				}
				else if(3 == map[m_x][m_y+1] || 7 == map[m_x][m_y+1])//箱子有可能在空地 有可能在目标点上
				{	
					if(0 == map[m_x][m_y+2] || 4  == map[m_x][m_y+2])
					{
						map[m_x][m_y+2] += 3;
						map[m_x][m_y+1] -= 1;
						map[m_x][m_y] -= 2;
						m_y++;//更新人的坐标
						step++;
					}
				}
				break;
			case 186:
				if(0 == map[m_x][m_y-1] || 4  == map[m_x][m_y-1])
				{
					map[m_x][m_y-1] += 2;	
					map[m_x][m_y] -= 2;
					m_y--;
					step++;
				}
				else if(3 == map[m_x][m_y-1] || 7 == map[m_x][m_y-1])//箱子有可能在空地 有可能在目标点上
				{	
					if(0 == map[m_x][m_y-2] || 4  == map[m_x][m_y-2])
					{
						map[m_x][m_y-2] += 3;
						map[m_x][m_y-1] -= 1;
						map[m_x][m_y] -= 2;
						m_y--;//更新人的坐标
						step++;
					}
				}
				break;
		}
	}
}

以下是第二版代码:

#include <stdio.h>
#include <getch.h>
#include <stdlib.h>//system  头文件
int main(int argc,const char* argv[])
{
	//定义迷宫地图
	char map[8][8] = {
		{0,0,1,1,1,1,0,0},
		{0,0,1,4,4,1,0,0},
		{0,1,1,0,4,1,1,0},
		{1,1,1,0,3,4,1,0},
		{1,1,0,3,0,0,1,1},
		{1,0,0,1,3,3,0,1},
		{1,0,0,2,0,0,0,1},
		{1,1,1,1,1,1,1,1},
	};
	
	char m_x = 6,m_y = 3;

	int step = 0;
	for(;;)
	{
		int cnt = 0;
		system("clear");
		for(int i =0;i<8;i++)
		{
			for(int j =0;j<8;j++)
			{
				switch(map[i][j])
				{
					case 0:printf("  ");break;	
					case 1:printf("# ");break;	
					case 2:printf("@ ");break;	
					case 3:printf("$ ");break;	
					case 4:printf("0 ");break;	
					case 6:printf("@ ");break;//人在目标点上,显示人	
					case 7:printf("$ ");
							cnt++;
							break;//箱子在目标点上,显示箱子
				}
			}
			printf("\n");
		}
		if(cnt == 4)
		{
			printf("游戏结束,共走了%d步\n",step);
			return 0 ;
		}
		int x = 0,y = 0;
		switch(getch())
		{
			case 183:
			x = -1;break;
			case 184:
			x = 1;break;
			case 185:
			y = 1;break;
			case 186:
			y = -1;break;
		}
		if(0 == map[m_x+x][m_y+y] || 4  == map[m_x+x][m_y+y])
		{
			map[m_x+x][m_y+y] += 2;	
			map[m_x][m_y] -= 2;
			m_x +=x;m_y +=y;
			step++;
		}
		else if(3 == map[m_x+x][m_y+y] || 7 == map[m_x+x][m_y+y])//箱子有可能在空地 有可能在目标点上
		{	
			if(0 == map[m_x+2*x][m_y+2*y] || 4  == map[m_x+2*x][m_y+2*y])
			{
				map[m_x+2*x][m_y+2*y] += 3;
				map[m_x+x][m_y+y] -= 1;
				map[m_x][m_y] -= 2;
				m_x += x; m_y +=y;//更新人的坐标
				step++;
			}
		}
	}
}

可以看到,代码量减少了将近一半。

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

小游戏:推箱子与推箱子简化版 的相关文章

随机推荐

  • 操作系统内存管理——分区、页式、段式管理

    http blog csdn net hguisu article details 5713164 t0
  • python中re模块的group()和groups()

    group和groups是两个不同的函数 一般 m group N 返回第N组括号匹配的字符 而m group m group 0 所有匹配的字符 与括号无关 这个是API规定的 m groups 返回所有括号匹配的字符 以tuple格式
  • JMM概述

    文章目录 简介 什么是JMM JSR 133规范 JMM结构规范 主内存和本地内存结构 JMM的三个特征 原子性 Atomicity 可见性 有序性 关键词synchronized与volatile总结 重排序 处理器重排序与内存屏障指令
  • Angular4 数据请求 POST、GET

    创建项目 ng new OBJECT NAME 创建一个名为 httpRequest 的服务 ng generate service httpRequest 在app module ts 里面添加 providers HttpRequest
  • JAVA 正则表达式 (超详细) .

    在Sun的Java JDK 1 40版本中 Java自带了支持正则表达式的包 本文就抛砖引玉地介绍了如何使用java util regex包 可粗略估计一下 除了偶尔用Linux的外 其他Linu x用户都会遇到正则表达式 正则表达式是个极
  • java 交流学习微信群

    专注Java相关技术 SSM Spring全家桶 微服务 MySQL 集群 dubbo 分布式 中间件 Linux 网络 多线程 Jenkins Nexus Docker ELK等等 相关开发的兼职信息等 微信 18210730150 由于
  • SQL server基本的代码操作

    一 数据库相关操作 1 创建数据库 创建一个具有2个文件组的数据库test1 要求 1 主文件组包括文件test1 dat1 文件初始大小为20 MB 最大为60 MB 按5 MB增长 2 文件组test1 Group1包括文件test1
  • 智力题:砝码称重问题

    第一题 假设有280g食盐 有一架天平 有两个砝码 分别是14g 4g 请问能否在3次内将280g食盐分为100g和180g两堆 请详细描述你的解决方法 解法一 第一次 平分280g的食盐 140g 140g 目前重物 食盐 140g 14
  • java中的数组初始化赋初值

    方法一 int vis1 声明未初始化 vis1 new int 100 定义占用空间大小 100个int for int i 1 i lt 5 i vis1 i i 进行赋值 for int i 1 i lt 100 i System o
  • Ogre粒子编辑器ParticleUniverse

    最近需要使用粒子系统制作一些特效 由于没有美术人员的帮助 制作难度可想而知 在苦闷中 找到了ParticleUniverse 这也是Torchlight采用的粒子系统 ParticleUniverse包括Particle Universe
  • 配置跳转指定_http自动跳转https的配置方法

    这篇文章主要介绍了http自动跳转https的配置方法 需要的朋友可以参考下 IIs中实现Http自动转换到Https方法介绍 403跳转对SEO有一定影响 1 下载安装URL重写模块 Microsoft URL Rewrite Modul
  • Llama-1|Alpaca-LoRA 微调模型下载以及安装推理教程

    Llama 1 Alpaca LoRA 微调模型下载以及安装推理教程 经常玩AI的人应该对LoRA这一词并不陌生 尤其是在SD绘画领域 各种角色的LoRA模型层出不穷 那么语言领域是否存在LoRA呢 存在 且繁荣 LoRA你可以理解为语言模
  • c++随机数加随机种子(用时间为随机种子)随机每次运行都不同

    srand 功能 初始化随机数发生器 用法 srand unsigned int seed 需要头文件 stdlib h 返回值 void无返回值 rand 产生的随机数在每次运行的时候都是与上一次相同的 若要不同 用函数 srand 初始
  • [软考笔记]存储管理——页式,段式,段页式

    页式存储 4kb为1页 考点 逻辑地址和物理地址之间的转换 1 先区分逻辑地址哪一部分是页号 哪一部分是页内地址 2 根据页内地址确定物理地址 后面那块 3 再根据页号查找块号 4 拼接起来就是物理地址 解题过程 1 将页面大小转化为二进制
  • 网络工程师课程---7、网络通信综合实验(做网络基础综合实验 用什么软件)...

    网络工程师课程 7 网络通信综合实验 做网络基础综合实验 用什么软件 一 总结 一句话总结 cisco packet p k t tracer tre s packet 英 p k t 美 p k t n 数据包 信息包 小包 小捆 vt
  • 【区块链】万向区块链罗荣阁:为什么区块链是解决汽车供应链金融痛点最优雅的方案?

    本文整理自万向区块链CTO罗荣阁在万向区块链实验室主办的第三届区块链全球峰会 2017 9 14 16 上的演讲速记稿 点击阅读原文可观看完整演讲视频 罗荣阁在第三届区块链全球峰会演讲 区块链是一个伟大的创新 能够解决一些传统技术难以解决的
  • 【转载】【stm32】一键下载电路

    原创Nerute 2018 11 18 01 11 10 2361 首先感谢正点原子的开源资料 下面贴上正点原子一键下载电路的原理图 很显然 核心是一块CH340芯片 什么是CH 请看手册 再来就是引脚说明 了解一键之前 我们还得知道 st
  • BERT论文阅读笔记

    文章题目 BERT Pre training of Deep Bidirectional Transformers for Language Understanding Pre training指的是在一个数据集上训练好一个模型 然后这个模
  • 字符串分割

    题目描述 给定一个非空字符串S 其被N个 分隔成N 1的子串 给定正整数K 要求除第一个子串外 其余的子串每K个字符组成新的子串 并用 分隔 对于新组成的每一个子串 如果它含有的小写字母比大写字母多 则将这个子串的所有大写字母转换为小写字母
  • 小游戏:推箱子与推箱子简化版

    在第一版的代码中 将人在目标点上以及箱子在目标点上另外输出 在后续的获取方向键并处理时 只需减去人和箱子的数字就可以刷新目标点的显示 不会出现 吃 目标点的情况 而在第二版的代码中 使用偏移值的改变来简化代码 只需通过方向键的按键活动来改变