这是我自己对城堡游戏的解读,解读后自己才不会囫囵吞枣地假装自己懂了。

城堡游戏是一个根据目前所处的房间与方向,来指明下一步所处位置与出口的小游戏。 翁恺老师讲课的精妙之处在于,从最简单也最缺乏设计感的代码写起,通过减少代码复制、降低耦合度、封装和可拓展性等编程思想,一步步改造出优雅、简洁且功能齐全的代码。

主要有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("感谢您的光临,下次再见。");}
}

翁恺老师 | 城堡游戏解读相关推荐

  1. [翁恺老师 城堡游戏(无bug

    @[翁恺老师 城堡游戏(无bug) ]( Game.java类 package Castle; /***注意,这里的package 你们自己记得修改import java.util.*;public ...

  2. 翁恺老师Java进阶城堡游戏源码

    刚开始学习Java,在比站发现了翁恺老师的课程,讲的很不错.Castle源码我找了很久都没有找到老师课上自己讲的那个程序,于是我决定做一回搬运工,自己敲了出来,现在也方便一下大家,大家一起学习,一起进 ...

  3. 浙江大学翁恺老师的城堡游戏源代码

    许多小伙伴们可能因为课程关闭无法查看课件了,所以下面我来给出翁恺老师的源代码 Game.java中的: package castle;import java.util.*;public class G ...

  4. c++基础入门(根据浙大翁恺老师视频整理)

    把以前的笔记搬上来一下 根据浙大翁恺老师视频整理 https://www.bilibili.com/video/BV1yQ4y1A7ts?p=2 01第一个c++程序 02什么是对象 通过操作访问数据 ...

  5. 浙大翁恺pat练习题_单词长度(翁恺老师C语言入门第八周测试题1)

    [更新]:写好程序后没在mooc的线上测试系统跑过,有部分格式上的bug,目前已经更新了,线上测试通过. 题目内容: 你的程序要读入一行文本,其中以空格分隔为若干个单词,以'.'结束.你要输出这行文本 ...

  6. 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业

    感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 另外: 此答案仅供参考,用于启发没有思路的同学.切勿照搬,自欺欺人. 提交作业 ...

  7. 中国大学Mooc浙大翁恺老师《零基础学Java语言》编程作业(续)(5~ 7)

    感谢中国大学Mooc平台给我学习的机会,感谢翁恺老师深入浅出的讲解. 写此文为纪念我从无到有的学习和成长.便于以后回顾. 此答案仅供参考. 提交作业时需把 public class Homework_ ...

  8. 翁恺老师 Python 暑期夏令营开营 | Mo-Tutor全新教学模式上线

    (已更新至最新版本) 为了强化大家对Python学习的认识,我们邀请到浙江大学计算机学院的教学名师--"中文慕课第一人"."浙江大学永平杰出教学贡献奖"获得者. ...

  9. 程序设计入门——C语言(翁恺老师)我的作业

    程序设计入门--C语言(翁恺老师)我的作业 第一周 程序设计与C语言 1 输出"Hello World"(5分) 题目内容: 请输出一行,内容为 Hello World 请注意大小 ...

最新文章

  1. 千千静听4.6.7版发布了
  2. JQuery Deferred 对象
  3. QQ空间Python爬虫v2.0--点赞数据分析
  4. 【存储知识学习】第一章存储系统的前世今生--《大话存储》阅读笔记
  5. 使用jQuery图表插件Sparklines来开发一个实用的网站PV(page view)实时监控应用
  6. 【动态规划】叠放箱子问题(ssl 1640)
  7. java没错泄露_Java内存泄露问题
  8. 数字电平(一):TTL和CMOS
  9. 计算机网络物理层之物理层的基本概念
  10. 如何解决logcat TAG过长时Android studio提示错误的问题
  11. Linux环境下命令行下载DM8
  12. 用 pyecharts 制作数据可视化大屏之数据地图
  13. 3.16√ 火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作
  14. 集成学习-Bagging和Pasting
  15. 同期群分析是什么?教你用 SQL 来搞定
  16. 微信小程序踩坑-Cookie登陆失败
  17. D3.js v5.0 旭日图
  18. 【 Arduino 和水流量传感器测量水流量和体积】
  19. pytest接口自动化测试框架 | 用python代码测试接口
  20. FPGA编程,verilog实现简易电梯控制系统,某大学数电实验课设

热门文章

  1. 【图灵学院】JAVA互联网架构【全】
  2. 使用 Python 制作图片和语音验证码
  3. C# SendMessage 控制其他进程程序
  4. 酱香科技不在YYDS了,市盈率50倍的白酒,要回调到25倍的市盈率?泡沫要破灭了
  5. 三菱FX系列PLC以太网连接昆仑通态MCGS
  6. oracle sequences优化_Oracle 优化和性能调整
  7. 驾考科目三考试经验谈
  8. Cannot resolve method ‘create‘ in ‘String‘
  9. python中调用julia_Julia引入PyCall报错解决方法
  10. 干货:饿了么交易系统的重构和实战