美文网首页
6.城堡游戏

6.城堡游戏

作者: Joypang | 来源:发表于2018-11-13 16:33 被阅读6次
ackage castle;
 
import java.util.HashMap;
public class Room {
    
    private String description;
    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);
    }
    
    public String getExitdesc() {
        StringBuffer sb = new StringBuffer();
        for(String dir :exits.keySet()) {
            sb.append(dir);
            sb.append(" ");
        }
        return sb.toString();
    }
    public Room getExit(String dir) {
        return exits.get(dir);
    }
    public String toString() {
        return ""+description;
    }
}
package castle;
 
import java.util.Scanner;
 
public class Game {
    private Room currentRoom;
        
    public Game() 
    {
        createRooms();
    }
 
    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("east", outside);
        study.setExit("north",outside);
        study.setExit("south",bedroom);
        bedroom.setExit("west",study);
        pub.setExit("down",lobby);
        currentRoom = outside;  //  从城堡门外开始
    }
 
    private void printWelcome() {
        System.out.println();
        System.out.println("欢迎来到城堡!");
        System.out.println("这是一个超级无聊的游戏。");
        System.out.println("如果需要帮助,请输入 'help' 。");
        System.out.println();
        System.out.println("现在你在" + currentRoom);
        System.out.print("出口有:");
        System.out.print(currentRoom.getExitdesc());
    }
 
    // 以下为用户命令
 
    private void printHelp() 
    {
        System.out.print("迷路了吗?你可以做的命令有:go bye help");
        System.out.println("如:\tgo east");
    }
 
    private void goRoom(String direction) 
    {
        Room nextRoom = null;
        if(direction.equals("north")) {
            nextRoom = currentRoom.getExit("north");
        }
        if(direction.equals("east")) {
            nextRoom = currentRoom.getExit("east");
        }
        if(direction.equals("south")) {
            nextRoom = currentRoom.getExit("south");
        }
        if(direction.equals("west")) {
            nextRoom = currentRoom.getExit("west");
        }
 
        if (nextRoom == null) {
            System.out.println("那里没有门!");
        }
        else {
            currentRoom = nextRoom;
            System.out.println("你在" + currentRoom);
            System.out.print("出口有: ");
            System.out.print(currentRoom.getExitdesc());
            System.out.println();
        }
    }
    //public void showPrompt(){
//
//
//
//
//
//

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        Game game = new Game();
        game.printWelcome();
 
        while ( true ) {
                String line = in.nextLine();
                String[] words = line.split(" ");
                if ( words[0].equals("help") ) {
                    game.printHelp();
                } else if (words[0].equals("go") ) {
                    game.goRoom(words[1]);
                } else if ( words[0].equals("bye") ) {
                    break;
                }
        }
        
        System.out.println("感谢您的光临。再见!");
        in.close();
    }
 
}
消除代码复制
  • 代码复制是不良设计的一种表现
封装

适用于将来的需要(可以在将来使用)

  • 可以运行的代码!=良好的代码
  • 对代码做维护的时候最能看出代码的质量
  • 如果想要增加一个方向,如down或up
用封装来降低耦合
  • Room类和Game类都有大量的代码和出口有相关
  • 尤其是Game类中大量的使用了Room类的成员变量
  • 类和类之间的关系称作耦合
  • 耦合越低越好,保持距离是形成良好的代码的关键

可扩展性

用借口来实现聚合
  • 给Room类实现的新方法,吧方向的细节彻底隐藏在Room类内部了

  • 今后的方向如何实现就和外部无关的了

  • Room 的方向是用成员变量表示的,增加或减少方向就要改变代码

  • 如果用Hash表来表示,那么方向就不是“硬编码”的了

框架加数据

以框架+数据来提高可扩展性

  • 命令的解析是否可以脱离if-else
  • 定义了一个handler 来处理命令
  • 用hash表来保存命令和Handler之间的关系

相关文章

网友评论

      本文标题:6.城堡游戏

      本文链接:https://www.haomeiwen.com/subject/dhflfqtx.html