翁恺老师 | 城堡游戏解读
这是我自己对城堡游戏的解读,解读后自己才不会囫囵吞枣地假装自己懂了。
城堡游戏是一个根据目前所处的房间与方向,来指明下一步所处位置与出口的小游戏。 翁恺老师讲课的精妙之处在于,从最简单也最缺乏设计感的代码写起,通过减少代码复制、降低耦合度、封装和可拓展性等编程思想,一步步改造出优雅、简洁且功能齐全的代码。
主要有Room、Handler、Game三个类。
(1)Room的作用是制造城堡最简单的单位,即房间,并建立房间与出口的对应关系。
(2)Handler的作用是把go bye help等动作从Game中分离出来,并成为HandlerGo HandlerBye HandlerHelp的父类,以提高程序的可拓展性。
(3)Game的内容是程序的主体,通过自己创造的createRoom printWelcome goRoom play函数,并调用Room与Handler,来完成程序的主体功能。
Room类
1.String description 属性,用于构造器,在new一个Room时给房间起名字。
2.Hash Map<String, Room>属性(创造的对象叫exits),用于setExit方法,对出口与房间进行匹配,被Game中的createRoom调用。
3.toString方法的重写,是为getExitDes方法服务。
4.getExitDes方法通过遍历exits的键,将其拼接到StringBuffer上,并通过调用toString方法,返回一串出口字符串。
5.getExit方法通过输入exits的键,来得到exits的值,看起来没有存在的必要,却能够保护封装性。
Handler类
1.Handler声明了Game对象game,给HandlerGo使用。而doCmd方法则为每一个子类服务,isBye方法配合HandlerBye使用。
2.HandlerGo重写了doCmd方法,通过继承而来的game调用goRoom方法,而对传进来的每一个direction作出反应。
3.HandlerBye重写了isBye方法,如果实参不是HandlerBye则返回Handler的true,否则返回HandlerBye的false,以退出Game中的无限游戏循环。
4.HandlerHelp重写了doCmd方法,打印出两句提示性语句“你迷路了吗?你可以做的命令右: go bye help”“如: go east”。
Game类
1.Room currentRoom属性,将在构造器调用的createRoom中赋值为outside,即游戏从城堡外开始。
2.HashMap<String, Handler>属性(建立了对象handlers),将在构造器中进行动作与行为对应关系的添加。
3.构造器,在Game对象创建时,初始化handlers命令,初始化各房间。
4.createRoom方法,创建各房间并在Room构造器参数里给出房间描述,调用setExit方法给各房间的出口与出口处的房间描述建立对应关系。
5.printWelcome方法,打印一长串字符串,将在main方法中被调用。
6.showPrompt方法,通过调用Room类的getExitDes方法,来完成对用户的常规提示“你在XX,出口有XX”。
7.goRoom方法完成房间的真实转换,将被HandlerGo调用。其调用了getExit方法得到nextRoom的位置,并将其赋给currentRoom,并在结尾处调用showprompt方法。
8.play方法完成游戏在bye动作之前的循环往复,将被main方法调用。把控制台接收到的用户输入,用空格分割成数组words,用words[0]在handlers中得到对应的操作。如果words[0]不等于bye和help,则对words[2]进行doCmd,即goRoom(words[1])。
public class Room {private String description;private HashMap<String ,Room> exits = new HashMap<>();public Room(String description) {this.description = description;}public void setExit(String dir, Room room){exits.put(dir,room);}@Overridepublic String toString() {return description;}public String getExitDes() {StringBuffer sb = new StringBuffer();for(String dir : exits.keySet()){sb.append(dir);sb.append(" ");}return sb.toString();}public Room getExit(String direction) {return exits.get(direction);}
}public class Handler {protected Game game;public Handler(Game game) {this.game = game;}public void doCmd(String word){}public boolean isBye(){return false;}
}public class HandlerBye extends Handler{public HandlerBye(Game game) {super(game);}public boolean isBye(){return true;}
}public class HandlerGo extends Handler{public HandlerGo(Game game) {super(game);}public void doCmd(String word){game.goRoom(word);}
}public class HandlerHelp extends Handler {public HandlerHelp(Game game) {super(game);}public void doCmd(String word){System.out.println("你迷路了吗?你可以做的命令右: go bye help");System.out.println("如: go east");}
}public class Game {private Room currentRoom;private HashMap<String, Handler> handlers = new HashMap<>();public Game() {handlers.put("bye",new HandlerBye(this));handlers.put("help",new HandlerHelp(this));handlers.put("go",new HandlerGo(this));createRoom();}public void createRoom() {Room outside, lobby, pub, study, bedroom;//制造房间outside = new Room("城堡外");lobby = new Room("大堂");pub = new Room("小清吧");study = new Room("书房");bedroom = new Room("卧室");//初始化房间出口outside.setExit("east", lobby);outside.setExit("south", study);outside.setExit("west", pub);lobby.setExit("west", outside);pub.setExit("east", outside);study.setExit("north", outside);study.setExit("east", bedroom);bedroom.setExit("west", study);currentRoom = outside; //从城堡门外开始}private void printWelcome() {System.out.println();System.out.println("欢迎来到城堡");System.out.println("这是一个超级无聊的游戏");System.out.println("如果需要帮助,请输入‘help’。");System.out.println();showPrompt();System.out.println();}//以下为用户命令public void goRoom(String direction) {Room nextRoom = currentRoom.getExit(direction);if (nextRoom == null) {System.out.println("那里没有门!");} else {currentRoom = nextRoom;showPrompt();}}public void showPrompt() {System.out.println("你在" + currentRoom);System.out.print("出口有:");System.out.println(currentRoom.getExitDes());}public void play() {Scanner scanner = new Scanner(System.in);while (true) {String line = scanner.nextLine();String[] words = line.split(" ");Handler handler = handlers.get(words[0]);String value = "";if(words.length > 1){value = words[1];}if(handler != null){handler.doCmd(value);if(handler.isBye()){break;}}}scanner.close();}public static void main(String[] args) {Game game = new Game();game.printWelcome();game.play();System.out.println("感谢您的光临,下次再见。");}
}
翁恺老师 | 城堡游戏解读相关推荐
- [翁恺老师 城堡游戏(无bug
@[翁恺老师 城堡游戏(无bug) ]( Game.java类 package Castle; /***注意,这里的package 你们自己记得修改import java.util.*;public ...
- 翁恺老师Java进阶城堡游戏源码
刚开始学习Java,在比站发现了翁恺老师的课程,讲的很不错.Castle源码我找了很久都没有找到老师课上自己讲的那个程序,于是我决定做一回搬运工,自己敲了出来,现在也方便一下大家,大家一起学习,一起进 ...
- 浙江大学翁恺老师的城堡游戏源代码
许多小伙伴们可能因为课程关闭无法查看课件了,所以下面我来给出翁恺老师的源代码 Game.java中的: package castle;import java.util.*;public class G ...
- c++基础入门(根据浙大翁恺老师视频整理)
把以前的笔记搬上来一下 根据浙大翁恺老师视频整理 https://www.bilibili.com/video/BV1yQ4y1A7ts?p=2 01第一个c++程序 02什么是对象 通过操作访问数据 ...
- 浙大翁恺pat练习题_单词长度(翁恺老师C语言入门第八周测试题1)
[更新]:写好程序后没在mooc的线上测试系统跑过,有部分格式上的bug,目前已经更新了,线上测试通过. 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本 ...
- 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业
感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 另外: 此答案仅供参考,用于启发没有思路的同学.切勿照搬,自欺欺人. 提交作业 ...
- 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业(续)(5~ 7)
感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 此答案仅供参考. 提交作业时需把 public class Homework_ ...
- 翁恺老师 Python 暑期夏令营开营 | Mo-Tutor全新教学模式上线
(已更新至最新版本) 为了强化大家对Python学习的认识,我们邀请到浙江大学计算机学院的教学名师--"中文慕课第一人"."浙江大学永平杰出教学贡献奖"获得者. ...
- 程序设计入门——C语言(翁恺老师)我的作业
程序设计入门--C语言(翁恺老师)我的作业 第一周 程序设计与C语言 1 输出"Hello World"(5分) 题目内容: 请输出一行,内容为 Hello World 请注意大小 ...
最新文章
- 千千静听4.6.7版发布了
- JQuery Deferred 对象
- QQ空间Python爬虫v2.0--点赞数据分析
- 【存储知识学习】第一章存储系统的前世今生--《大话存储》阅读笔记
- 使用jQuery图表插件Sparklines来开发一个实用的网站PV(page view)实时监控应用
- 【动态规划】叠放箱子问题(ssl 1640)
- java没错泄露_Java内存泄露问题
- 数字电平(一):TTL和CMOS
- 计算机网络物理层之物理层的基本概念
- 如何解决logcat TAG过长时Android studio提示错误的问题
- Linux环境下命令行下载DM8
- 用 pyecharts 制作数据可视化大屏之数据地图
- 3.16√ 火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作
- 集成学习-Bagging和Pasting
- 同期群分析是什么?教你用 SQL 来搞定
- 微信小程序踩坑-Cookie登陆失败
- D3.js v5.0 旭日图
- 【 Arduino 和水流量传感器测量水流量和体积】
- pytest接口自动化测试框架 | 用python代码测试接口
- FPGA编程,verilog实现简易电梯控制系统,某大学数电实验课设
热门文章
- 【图灵学院】JAVA互联网架构【全】
- 使用 Python 制作图片和语音验证码
- C# SendMessage 控制其他进程程序
- 酱香科技不在YYDS了,市盈率50倍的白酒,要回调到25倍的市盈率?泡沫要破灭了
- 三菱FX系列PLC以太网连接昆仑通态MCGS
- oracle sequences优化_Oracle 优化和性能调整
- 驾考科目三考试经验谈
- Cannot resolve method ‘create‘ in ‘String‘
- python中调用julia_Julia引入PyCall报错解决方法
- 干货:饿了么交易系统的重构和实战