对“推箱子”小游戏代码的改进

news/2025/2/27 19:23:47/文章来源:https://www.cnblogs.com/lhh2352823/p/18741192

一.代码来源
https://www.cnblogs.com/heyu123/p/14844284.html

二.运行环境
DEV--C++

三.原代码及其运行结果
原代码:

int map[8][8]={{1,1,1,1,1,1,1,1},//0 空地 {1,0,0,0,1,0,0,1},//1 墙 {1,0,1,0,1,4,3,1},//3 目的地 {1,0,0,0,0,4,3,1},//4 箱子 {1,0,1,0,1,4,3,1},//5 人 {1,0,0,0,1,0,0,1},//7 箱子和目的地重合 {1,1,1,1,1,5,0,1},//8 人和目的地 {0,0,0,0,1,1,1,1}};void GamePaint()
{//输出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 3:printf("☆");break;case 4:printf("□");break;case 5:printf("♀");break;case 7:printf("★");break;case 8:printf("♀");break;} }cout<<endl; } 
}void GamePlay()
{int r,c;//人的下标int flag=0;for(r=0;r<8;r++){for(c=0;c<8;c++){if(map[r][c]==5||map[r][c]==8){flag=1;break;}}if(flag)break;}cout<<"人的下标:"<<r<<" "<<c;char key;key=getch();switch(key){case 'w': if(map[r-1][c]==0||map[r-1][c]==3)//人的前面是空地或目的地 { map[r-1][c]+=5; //人来+5map[r][c]-=5;//人走-5 }  else if(map[r-1][c]==4||map[r-1][c]==7)//人前面是箱子或箱子加目的地{if(map[r-2][c]==0||map[r-2][c]==3)//人前面的前面是空地或目的地 {map[r-2][c]+=4;map[r-1][c]+=1;map[r][c]-=5;} }         break;case 's':if(map[r+1][c]==0||map[r+1][c]==3)//人的后面是空地或目的地 { map[r+1][c]+=5; //人来+5map[r][c]-=5;//人走-5 }  else if(map[r+1][c]==4||map[r+1][c]==7)//人后面是箱子或箱子加目的地{if(map[r+2][c]==0||map[r+2][c]==3)//人后面的前面是空地或目的地 {map[r+2][c]+=4;map[r+1][c]+=1;map[r][c]-=5;} }         break;case 'a':if(map[r][c-1]==0||map[r][c-1]==3)//人的左面是空地或目的地 { map[r][c-1]+=5; //人来+5map[r][c]-=5;//人走-5 }  else if(map[r][c-1]==4||map[r][c-1]==7)//人左面是箱子或箱子加目的地{if(map[r][c-2]==0||map[r][c-2]==3)//人左面的左面是空地或目的地 {map[r][c-2]+=4;map[r][c-1]+=1;map[r][c]-=5;} } break;case 'd': if(map[r][c+1]==0||map[r][c+1]==3)//人的右面是空地或目的地 { map[r][c+1]+=5; //人来+5map[r][c]-=5;//人走-5 }  else if(map[r][c+1]==4||map[r][c+1]==7)//人右面是箱子或箱子加目的地{if(map[r][c+2]==0||map[r][c+2]==3)//人右面的右面是空地或目的地 {map[r][c+2]+=4;map[r][c+1]+=1;map[r][c]-=5;} }      break;}
}int main()
{   while(1)//让下面语句不断运行{system("cls");//清屏函数GamePaint();GamePlay();}return 0;
}

运行结果:

四.原代码问题以及改进方案
问题:
1.从原代码和运行结果可以明显看出这个小游戏没有‘开始界面’和完成游戏后的‘结束界面’,导致使用体验不佳。
2.在不同的电脑上运行该程序,会发现输出特殊字符时会发生错位现象,这就导致用户体验极差。
3.在原代码里,为了保证游戏页面干净,在主函数内写上'while(1)',这样就导致游戏无法正常结束。
错位现象:

解决方案:
1.我在原代码的基础上,为其添加上‘开始界面’和‘胜利界面’的代码。在开始界面,按‘a’进入游戏。在胜利结算界面,按‘a’退出游戏。
2.经过一番尝试,我还是放弃了用特殊符号来表示各个元素的想法,改用汉字。
3.我设置了一个全局变量int flag=0;顶替原来的'1',用来判断游戏是否正在进行。当falg=0时就是游戏结束,flag=1就是游戏仍在进行。
“开始界面”代码:

void Start(){printf("============================\n");printf("==                        ==\n");printf("==        欢迎来到        ==\n");printf("==       推箱子游戏       ==\n");printf("==     !!!!!!!     ==\n");printf("==     (按'a'进入游戏)    ==\n");printf("==                        ==\n");printf("============================\n");char key;key=getch();if(key=='a'){flag=1;}
}

“胜利结算界面”代码:

void GameJudge()
{int z=0;for(int i=0;i<8;i++){for(int j=0;j<8;j++){if(map[i][j]==7) z++;}}if(z==3){system("cls");printf("============================\n");printf("==                        ==\n");printf("==        恭喜通关        ==\n");printf("==      !!!!!!!    ==\n");printf("==                        ==\n");printf("==     (按'a'退出游戏)    ==\n");printf("==                        ==\n");printf("============================\n");char key;key=getch();if(key=='a'){flag=0;}}
}

修改后的各元素的表示的代码:

void GamePaint()
{//输出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 3:printf("洞");break;case 4:printf("箱");break;case 5:printf("人");break;case 7:printf("星");break;case 8:printf("人");break;} }cout<<endl; } 
}

五.修改后的运行结果

开始界面

游戏内初始画面

游戏进行时画面

胜利结算界面

六.实验总结与体会
经过这次实验,我认识到逆向软件工程是一件麻烦的事情,尤其是在原代码缺少注释、变量名起的随心所欲、有大量无意义的变量时,代码的可读性大幅度下降,导致我对一些有趣的项目丧失了想法,完全不想去读那些难以明辨的代码。在修改推箱子小游戏的代码时,我发现作为一个益智小游戏缺少一个重要的功能——悔棋,但是很遗憾,我才疏学浅,无法再短时间内完成。我想这个项目肯定还能进步,我会在之后不久将其完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/890774.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件开发与创新课程设计作业——软件逆向设计

一、来源:软件工程2班李鹏飞去年的大作业`点击查看代码 #include <iostream> #include <string> #include <fstream> using namespace std;//定义客户类型 enum eGuestType // 在高版本VS中,需要用enum class,在低版本的vs中,直接用enum也可以 {e_member…

LVI_SAM 虚拟机安装复现(一)

0. 前言 高能警告:LVI_SAM 的安装步骤是繁琐的,一个坑接着一个坑,请预留48+小时的安装时间,和80%以上的san值。非战斗人员请尽快撤离。 预备知识:虚拟机安装步骤,ROS基本概念,Makefile工作原理 没有预备知识的话,也没关系,本文也不会给你解释的( 本文是第一大步骤,即…

大模型--三种三种检索方式-Dense retrieval / Lexical Retrieval / Multi-Vector Retrieval- 44

1. 参考 M3-Embedding https://github.com/FlagOpen/FlagEmbedding https://arxiv.org/pdf/2402.03216 https://huggingface.co/BAAI/bge-m3 2. Dense retrievalimport torch import torch.nn as nnclass DenseRetrieval(nn.Module):def __init__(self, embedding_dim):super(D…

从拉新到留存,用户生命周期分析全流程

已收藏分享从拉新到留存,用户生命周期分析全流程 2025-02-17 17:02人人都是产品经理在当今竞争激烈的市场环境中,理解并管理用户生命周期是实现用户增长和留存的关键。本文将深入剖析用户生命周期的全流程管理,从拉新到留存,详细解读不同业务类型(如消费品、耐用品、平台型…

朴素贝叶斯其实并不朴素

朴素贝叶斯英文名称NaiveBayes,朴素贝叶斯确实nave,但是并不朴素,而是简单,并不是逻辑上面的简单,而是假设上面的简单。 1.贝叶斯公式 ​ 其中: P(C|X)是类C在给定特征X下的后验概率。 P(X|C)是特征X在给定类C下的条件概率,也叫做似然。 P(C)是类C的先验概率。 P(X)是特…

NocoBase 本周更新汇总:新增路由管理

本周更新包括:支持为页面标签页配置权限,新增路由管理页面等。汇总一周产品更新日志,最新发布可以前往我们的博客查看。 NocoBase 目前更新包括的版本更新包括三个分支:main ,next和 develop。main :截止目前最稳定的版本,推荐安装此版本。 next:包含即将发布的新功能,…

AI安全-模型用户输入注入

顾名思义,在调用AI大模型时,根据用户传入的数据,进行AI处理,调用插件,但模型后端需要调用API,API需要传入的username一个小场景,企业微信对话调用AI去修改当前密码 假设开发者设计如下: 用户输入-> AI -> 调用插件修改密码 修改密码插件实现:a.com/change_passw…

基于Microsoft.Extensions.VectorData实现语义搜索

本文介绍了Microsoft.Extensions.Vector的基本概念 和 基本使用,结合Embedding Model(如all-minilm) 和 VectorStore(如Qdrant),我们可以快速实现语义搜索,而不仅仅是关键字匹配。如果你也是.NET程序员希望参与AI应用的开发,那就快快了解和使用基于Microsoft.Extensioi…

KubeSphere 企业版 v4.1.3 发布!可观测性深度优化,管理策略更灵活更安全

KubeSphere 企业版始终致力于为企业提供安全、稳定、高效的云原生全栈管理能力。在 4.1.3 版本中,KubeSphere 聚焦可观测性深度优化、策略管理灵活升级与安全隔离能力增强,推出多项新特性与优化,进一步释放企业云原生基础设施的潜力,助力业务高效运行与智能管理! 核心升级…

[MoE] Deepseek的All-to-all通信: DeepEP代码解读

[MoE] Deepseek的All-to-all通信: DeepEP代码解读 前言 最近,Deepseek开源了一系列MoE的优化技术,让我们看到了AI infra的强大之处。其中,第二天发布的DeepEP则是针对MoE中EP的all-to-all通信进行了优化。 我最近也在关注MoE和all-to-all,之前的MoE普遍使用NCCL的p2p通信进…

Java泛型上下界

有如下类的继承关系 // okFruit apple = new Apple(); List<Fruit> plate = new ArrayList<Apple>(); 它会在Idea里报红线,运行会报错:java: 不兼容的类型: java.util.ArrayList<Apple>无法转换为java.util.List<Fruit>,显然在集合间不存在继承引用…