提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
项目背景
此项目是伯克利神课2020 年CS61B Data Structure 建立我的世界游戏项目。项目介绍请看这里。 由伯克利最受欢迎的老师Josh Hug教授。此项目分为两个部分,第一部分是随机生成地图,第二部分是人机交互。此文主要解决第一部分地图自动生成。
前言
这是一个大的project,前前后后我断断续续做了一个月。真正自己的从无到有设计的迷宫出来的时候是很兴奋的。这个project老师给出的start code很少,不像BearMap骨架很清晰,自己思考怎样算法实现就是了。Project3 更倾向于让你从头到尾设计一个自己的小世界,不局限什么方法,也不限制方法的复杂度。这里没有正确和错误的答案,只有符合要求的答案即可以。这个过程中要不断的问自己,我需要什么类?我需要什么方法?再问自己怎么实现?做这个project我感受最多的感觉是无从下手的惶恐。所以这里将我的设计心路历程贴出来,给无从下手的小伙伴一个参考。
这篇博文着重分析题目要求,思考怎样建立地图,解析项目步骤,使用的是最简单的包里生成方法,没有任何技巧和算法。如果想要更美一些地图,可以看这篇BPS地图生成。
目录
一、项目要求
第一部分:生成随机的世界
要求:
- 2D
- 伪随机生成,只要seed是确定的世界就是确定的
- 至少包括room and hallway
- 房间可以使正方形长方形
- 房间,走廊,大小和位置都是随机的
- 房间和走廊要连接
无从下手的小伙伴可以从lab12做起, lab12 是一个熟悉tile render engine的过程。作为generate world的开胃菜,让你通过一个lab深入了解Tile Engine Package的内容。熟悉怎样在画布上画出自己想要的东西。
第二部分:人机交互
包括在电脑上输入随机种子,键盘控制。
二、start code 分析
1.Package Core
这是我们主要工作的包,这里提供的类有:
1)Main.java 用来调用Engine.java中的两种方法,启动游戏。一种是在args输入字符串,worldState接收后生成TETile世界,在做phase1时,不需要用到人机交互。
2)Engine.java 将一个包含种子的input String 生成 一个 TETile[][] WorldFrame。比如输入字符串: "n123sswwdasdassadwas", "n123sss:q", "lwww". 之后,Engine.java 应该返回一个2D TETile[][] 数组。在这里,定义了世界的长和宽。
3)RandomUtils 给我们提供了不同的分布方式产生伪随机数字的方法还有shuffle()的方法给我们使用。当然我们也可以使用Java自带的Random,不过这个更加方便。
Random对象是一个“伪随机数”生成器,它可以产生一串无穷的看起来是随机数的数字序列,调用nextInt方法获取序列中的每一个数字。它之所以叫“伪随机数”是因为它产生的序列并不是真正随机的。我们获取不同的序列的方式是向Random的构造器中传入一个数字,这个数字被称为“seed”,如果我们用相同的seed构造Random,那么我们一定会获得完全相同的序列。这里提供了产生随机数的方法uniform(), 重新排列数组 shuffle(), 和返回数字内或一定范围数字内的全排列Permutation()三个方法。
2. package TileEngine
1)Tileset.java 提供了不同类型的tile选择。有墙,地板,们,玩家等等。也可以自己填写自己喜欢的tile类型在这里面。
2)TETile.java 定义了一个tile,由字符,字符颜色和背景颜色。你也可以加入自己喜欢的tile图片的路径,不过不添加路径,filepath默认为null。会画出开始定义的字符。
3)TERender.java 用来提交tile的类。输入四个变量画布的长和宽,和开始画的点(xOffset,yOffset).有2个方法。
a.initialize()初始化画布,b.renderFrame(TETile[][] world)初始化所有的tile,提交2D数组给屏幕,
tile画的开始点是 xOffset, yOffset.
3. Package inputDemo
这个包中并不需要我们修改,主要提供给我们测试的数据。
三、思路分析
当我们无从下手的时候,这里采用的是由大到小的思考方式,有点像algorithm中讲的 divide and conquer。
我们分析老师给出的Skeleton知道了我们Phase1的目的是给Engine.java中提供一个生成二维数组TETile[][] world的方法。所以我们先建立一个类叫GeneratorWorld() 这个类input是一串种子seed,输出的是随机生成的TETile[][] world二维数组。即完成 interactWithInputString(String input)这个方法。在Phase2 中,我们再完成interactWithKeyboard()这个方法。
GeneratorWorld()中需要干什么呢?
我们将大问题拆成小问题,剥洋葱一样,一层一层的拆开。
我们这个项目是没有标准答案的,大家设计的地图肯定都不太一样。最重要的是通过这个项目学会怎样将自己的逻辑转变伪代码实现。初次写的时候我的个人感觉是不要在乎你的代码是否不精简,是否效率低。代码多几行,多即使行都没关系。最重要的是清晰,让人一眼能看懂你的逻辑。代码写的清晰最重要的是你的逻辑清晰,我建议在写代码前要把整个逻辑想清楚,在做这个大项目的过程中,深深的感觉得最难debug的错误就是逻辑错误了。
这里介绍几个想到的不同的思路:
思路零:开始面对这个项目时候,没有任何思路。我想我先用最简单的方法将其实现在考虑优化的事情。先画出随机房间,再连接房间的思路。随机房间生成用Random 随机产生poision, width,height这三个变量。再将随机产生的房间存入到List&l

本文介绍了伯克利大学CS61B课程的一个项目,涉及构建一个类似我的世界的游戏地图生成。项目要求包括2D伪随机地图生成,至少包含房间和走廊,并要求随机性与可重复性。作者分享了他们的实现思路,包括随机生成房间、连接房间以及打印地图的步骤,同时提到了不同的地图生成方法,如BPS地图生成。文章还分析了项目提供的start code,探讨了如何使用随机数生成器、TileEngine包和inputDemo包。最后,作者强调了清晰的逻辑思考和断点检查在解决问题中的重要性。
最低0.47元/天 解锁文章
1136

被折叠的 条评论
为什么被折叠?



