查看: 6400| 回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

[入门|算法|数据结构] CS61B SP18 Project2 思路分享

全局:
公开课
学校名称: UC Berkeley
Unit号: 5
开课时间: 2018-01-17
课程全名: CS 61B Data Structures
平台: 其他
URL: https://sp18.datastructur.es/

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
花了一周时间,终于把project 2完成了。看到地里对这个project的讨论不多,分享一下自己的思路,顺求大米。看到很多同学说这个项目难,其实做完这个项目会对化繁为简的思维有很深入的理解。只要方法建立的合适,代码写起来还是条理很清晰的。


首先上autograder的结果,style check没过因为不让import的时候用‘.*',以及不让catch exception(saveGame的时候又必须要catch)。


这个project最难的部分就是生成随机的地图,项目说明里面也没有详细的指导所以就完全不知从何入手。这里提供一下我的思路。

首先是class的建立。除了项目已经提供的class之外,我另外建立了三个class,分别是:
Position:变量为x与y坐标值。
比较重要的方法有Position move(int dx, int dy),移动当前点位到新的点位并返回。

Room:变量为Position 左下角坐标,int 宽度,int 高度。
比较重要的方法是画墙,画地面,判断是否与别的房间overlap,判断是否超出World边界等。
需要注意的是hallway其实是宽度为3的房间。

World:最重要变量为TETile[][] world,即我们需要表示在窗口上的内容,以及playWithInputString方法的返回值,给autograder评分使用。其余变量还有doorPosition,playerPosition以及existingRooms。
将TETile[][] world包装起来的好处是可以在World class里面加各种生成地图的方法,这样Game class里面代码读起来也会更清晰。
world里面我放了很多方法,比如:setTileOnPosition,getTileOnPosition,addRoom,addHallway等等,生成random world需要的各种方法都可以放在里面。

下面讲思路:
1、创建方法1,随机添加一个Room到world,因为房间可以由三个变量确定,即左下角Position,width和height,因此我们可以随机生成这三个变量,再将生成的Room保存到List existingRooms里。注意需要判断房间是否越界,以及是否与已有房间重叠。
2、利用方法1,创建方法2,即生成随机数量的不重叠的房间到world里。数量及房间大小应控制在合适的范围。如下图:

3、将已生成房间按x坐标排序,并将相邻房间用hallway连接起来。这一步需要用到以下方法:
(1)用L型hallway连接两个Position,L可以分解为分别画水平hallway和垂直hallway。
(2)从已有房间里随机取一个Position(不能取在wall上)
(3)利用上两个方法实现用hallway连接两个房间。画hallway的时候需要注意,不可以破坏Room已有地面,意思为如果当前Position的tile是floor的话就不覆盖,这点很重要!!
(4)最后在existingRooms里循环,将所有房间前后连接起来。
大功告成!!生成效果如下:


4、在World里再加入两个方法:
随机加门,注意门需要在墙上,并且一边为floor,一边为nothing。
随机player,注意player需要在floor上面。
加完门和player效果:


至此,phase 1的任务就完成了,这个project最难的部分也就完成了。

phase 2 实现起来相就容易很多,具体实现就不详细说了。先完成lab 6再做的话会很有帮助。
需要注意的是,phase 1 和phase 2 的autograder都不认StdDraw,所以提交前需要把所有相关的命令行comment掉。autograder查的就是playWithInputString方法的返回值。

最后附一张游戏赢了后的截图,祝大家都能成功完成!








更多图片 小图 大图
组图打开中,请稍候......

评分

参与人数 5大米 +24 收起 理由
达达万 + 1 赞一个
Benjemin + 1 很有用的信息!
doudouadventure + 1 给你点个赞!
ru04ru8 + 1 很有用的信息!
pikado + 20 欢迎分享你知道的情况,会给更多积分奖励!

查看全部评分


上一篇:有正在学CS50x的小伙伴吗?Lab太难了,一起学啊!
下一篇:cs 61a求队友
🔗
ru04ru8 2021-1-23 19:10:36 | 只看该作者
全局:
谢谢楼主分享。
正要开始做proj2,也是2018 spring的,相信你的分享一定会我的学习有所帮助。

我有个问题想请教你。我發了个问题在这裡,不知道你可以帮我看一下吗?
当初有没有碰到这个问题? 谢谢
https://www.1point3acres.com/bbs/thread-708382-1-1.html
回复

使用道具 举报

全局:
楼主你好 我最近也刚做完这个 但是我点提交的时候 在测试保存和load功能的时候 会提示access denied 想看看你保存的那一块怎么写的 谢谢
回复

使用道具 举报

🔗
Fallenpetals 2022-1-8 16:22:21 | 只看该作者
全局:
您好,依据您的思路已生成不重叠的多个房间,如何实现在两个房间之间用L型走廊连接呢?难点在于两个房间之间的Position是随机的,且对于两个点,L型走廊有两种画法,而且所有的房间都是用L型走廊相连吗?也可能有重叠
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表