代码实现效果为:
(黄色框为输入的内容)
文章目录
- 一,整体框架
- 1.需要实现的操作
- 2.框架流程图
- 二,部分拆解
- 1.构造Game方法
- Room的介绍
- 2.显示初操作
- 3.输入操作
- 三,细节补充
- 1.这里需要的三个class所需要的具体要求为:
- 2.低耦合!
一,整体框架
1.需要实现的操作
多次输入操作指示,判断需要进行的动作,系统做出反应。
因此我们可以根据需要创建HandlerGo() HandlerBye() HandlerHelp() 三个.class
- ① 构建三种可能 go bye help;
- ② 搭好路线 即:具体位置、可以走的方向、走向的联系;
- ③ 具体实现
2.框架流程图
该图仅包含部分函数
二,部分拆解
1.构造Game方法
首先我们需要一个HashMap,这个表格可以以便于对应每个不同操作的class 即:
private HashMap<String,Handler> handlers = new HashMap<String,Handler>();
这里Hander我们引用了一个class使得到的数据能够在handler中存储得以判断
而Hander.class中的内容为:
public class Handler {
protected Game game;
public Handler(Game game)
{
this.game=game;//接收数据
}
public boolean isBye()
{
return false;
}
public void doCmd(String value) {//进行操作
}
}
开始构造
public Game()
{
handlers.put("go", new HandlerGo(this));
handlers.put("bye", new HandlerBye(this));
handlers.put("help", new HandlerHelp(this));
createRooms();
}
- 这里的this还未使用,需要在后面输入时才填入,这里只是为了区分构造不同的操作进入的不同class。
- 而这里也把不同的情况存入handlers里面,以便后面输入时能够方便操作。
在构造时,先把操作类构造,再对具体房间进一步构造:
private void createRooms()
{
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);
lobby.setExit("up", pub);
pub.setExit("down", lobby);
currentRoom = outside; // 从城堡门外开始
}
向这里的Room主要是为了“搭桥”,把所有的场景和场景之间的联系构造出来
Room的介绍
在Room里面我们需要做什么?
- 存储各个场景之间的联系
- 获取在某场景中可以走的方位
- 获取此刻的位置
package dome_1;
import java.util.HashMap;
public class Room {
private String description;
private HashMap<String,Room> exits = new HashMap<String,Room>();
public Room(String description)
{
this.description = description;
}
public void setExit(String dir,Room room)//存储各个场景之间的联系
{
exits.put(dir, room);
}
@Override
public String toString()
{
return description;
}
public String getExitDesc()// 获取在某场景中可以走的方位
{
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));
}
}
2.显示初操作
private Room currentRoom;//对应Room里面的description
private void printWelcome() {
System.out.println();
System.out.println("欢迎来到城堡!");
System.out.println("这是一个超级无聊的游戏。");
System.out.println("如果需要帮助,请输入 'help' 。");
System.out.println();
showPrompt();
}
public void showPrompt(){
System.out.println("你在" + currentRoom);
System.out.print("出口有: ");
System.out.print(currentRoom.getExitDesc());
System.out.println();
}
3.输入操作
public void play()
{
Scanner in = new Scanner(System.in);
while ( true ) {
String line = in.nextLine();
String[] words = line.split(" ");//如果是输入走向则有两个输入 go(空格)方向,因此需要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;
}
}
}
in.close();
}
三,细节补充
1.这里需要的三个class所需要的具体要求为:
- HandlerHelp
- 纯输出
public class HandlerHelp extends Handler{
public HandlerHelp(Game game) {
super(game);
//TODO Auto-generated constructor stub
}
public void doCmd(String word) {
System.out.print("迷路了吗?你可以做的命令有:go bye help");
System.out.println("如:\tgo east");
}
}
- HandlerGo
- 进入goRoom方法
- 判断输入的方向是否正确
- 若存在该方向则转入该场景
public class HandlerGo extends Handler{
public HandlerGo(Game game) {
super(game);
//TODO Auto-generated constructor stub
}
public void doCmd(String word)
{
game.goRoom(word);
}
}
public void goRoom(String direction)
{
Room nextRoom = currentRoom.getExit(direction);
if (nextRoom == null) {
System.out.println("那里没有门!");
}
else {
currentRoom = nextRoom;
showPrompt();
}
}
- HandlerBye
- 结束程序,返回true
public class HandlerBye extends Handler{
public HandlerBye(Game game) {
super(game);
//TODO Auto-generated constructor stub
}
@Override
public boolean isBye()
{
return true;
}
}
2.低耦合!
该代码由于为了考虑未来延展性,故封入了许多class,低耦合也能为未来修缮,添入新性能减少不必要的麻烦