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之間的關係
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章