面向對象程序設計-java語言第五週學習總結——城堡遊戲(進階)

實現了隱形耦合,help輸出內容與help的輸出函數無關,使得新的命令加入的時候,help能自動輸出新的內容。
添加了新元素:添加了簡單的故事場景。
城堡遊戲演示:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

代碼如下:

Game.java

城堡遊戲的主函數

package castle;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class Game {
    private Room currentRoom;
    private HashMap<String, Handler> handlers = new HashMap<String, Handler>();
    protected ArrayList<String> cmds = new ArrayList<String>();
    public Game() 
    {
//    	handlers.put("go", new HandlerGo());
    	handlers.put("bye", new HandlerBye(this));
    	handlers.put("help", new HandlerHelp(this));
    	handlers.put("go", new HandlerGo(this));
    	for (String cmd : handlers.keySet()) {
    		cmds.add(cmd);
    	}
        createRooms();
    }

    private void createRooms()
    {
        Room outside, lobby, pub, study, bedroom, inside, bedroomup;
      
        //	製造房間
        
        outside = new Room("城堡外");
        inside = new Room("城堡內");
        lobby = new Room("大堂");
        pub = new Room("小酒吧");
        study = new Room("書房");
        bedroom = new Room("臥室");
        bedroomup = new Room("臥室二樓");
//        hoteldown = new Room("賓館一樓");
//        hotelup = new Room("賓館二樓");
        // 設置房間故事
        outside.setNarration("城堡外","恭喜你逃出了城堡");
        inside.setNarration("城堡內", "你現在在城堡的一個恐怖黑暗的廣場上");
        lobby.setNarration("大堂", "你來到了城堡的大堂,大堂裏面有着恐怖的石像");
        pub.setNarration("小酒吧", "這是一間幽深的酒吧,傍邊到處是黑色的酒瓶,還有這恐怖的音樂在播放着");
        study.setNarration("書房", "這是城堡的書房,裏面記載着這個城堡的過去");
        bedroom.setNarration("臥室", "你來到了城堡主人的臥室,這裏是最黑暗的地方,你的心跳跳的越來越快,快點離開這裏吧!");
        bedroomup.setNarration("臥室二樓", "恭喜你來到了城堡主人的臥室二樓,並且發現了一個箱子,你打開箱子後找到了鑰匙,請拿着鑰匙快速逃出城堡吧!");
        
        //	初始化房間的出口
        outside.setExit("south", inside);
        inside.setExit("north", outside);
        inside.setExit("east", lobby);
        inside.setExit("south", study);
        inside.setExit("west", pub); 
        lobby.setExit("west", inside);
        pub.setExit("east", inside);
        study.setExit("north", inside);
        study.setExit("east", bedroom);
        bedroom.setExit("west", study);
        bedroom.setExit("up", bedroomup);
        bedroomup.setExit("down", bedroom);
        
        currentRoom = inside;  //	從城堡門外開始
    }
    private void printWelcome() {
        System.out.println();
        System.out.println("歡迎來到城堡!");
        System.out.println("這是一個超級無聊的遊戲。任務:你需要在城堡內找到寶箱鑰匙並帶到城堡外去。");
        System.out.println("如果需要幫助,請輸入 'help' 。");
        System.out.println();
        showPrompt();
    }

    // 以下爲用戶命令


    public void goRoom(String direction) 
    {
        Room nextRoom = currentRoom.getExit(direction);
        
        if (nextRoom == null) {
            System.out.println("那裏沒有門!");
        }
        else {
            currentRoom = nextRoom;
            showPrompt();
        }
    }
	public void showPrompt() {
		 String currentnarration = currentRoom.getNarration(currentRoom.toString());
		 System.out.println("你在" + currentRoom + "\n場景描述:" + currentnarration);
         System.out.print("出口有: ");
         System.out.print(currentRoom.getExitDesc());
         System.out.println();
	}
	public void play() {
		Scanner in = new Scanner(System.in);
		while ( true ) {
	 		String line = in.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;
	 			}
	 		}
		}
		in.close();
	}
	public static void main(String[] args) {
		Game game = new Game();
		game.printWelcome();
		game.play();
        System.out.println("感謝您的光臨。再見!");
	}

}

Room.java

城堡遊戲中的房間模塊

package castle;

import java.util.HashMap;

public class Room {
    private String description;
    private HashMap<String, Room> exits = new HashMap<String, Room>();
    private HashMap<String, String> narration = new HashMap<String, String>();
    
    public Room(String description) 
    {
        this.description = description;
    }
    public void setExit(String dir, Room room) {
    	exits.put(dir, room);
    }
    public void setNarration(String room, String narr) {
    	narration.put(room, narr);
    }
    @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);
    }
    public String getNarration(String direction) {
    	return narration.get(direction);
    }
}

Handler.java

城堡遊戲中的添加各種功能的父類模塊

package castle;

public class Handler {
	protected Game game;
	
	public Handler(Game game) {
		this.game = game;
	}
	public void doCmd(String word) {}
	public boolean isBye() {return false;}
}

HandlerBye.java

功能模塊的子類實現結束功能

package castle;

public class HandlerBye extends Handler{
	public HandlerBye(Game game) {
		super(game);
	}
	@Override
	public boolean isBye() {
		return true;
	}
}

HandlerHelp.java

功能模塊的子類實現幫助功能

package castle;

public class HandlerHelp extends Handler {
	public HandlerHelp(Game game) {
		super(game);
	}

	@Override
	public void doCmd(String word) {
		System.out.println("迷路了嗎?你可以做的命令有:" + game.cmds);
		
        System.out.println("如:\tgo east");
	}
	
}

HandlerGo.java

功能模塊的子類實現go功能

package castle;

public class HandlerGo extends Handler {
	public HandlerGo(Game game) {
		super(game);
	}
	@Override
	public void doCmd(String word) {
		game.goRoom(word);
	}

}


學習心得:

  • 消除代碼複製

    • 提取出來,改爲函數。
  • 增加可擴展性

    • 可以運行的代碼 != 良好的代碼
    • 對代碼做維護的時候最能看出代碼的質量
  • 用封裝來降低耦合

  • Sring每次都String做+時,都會產生新的對象,系統開銷較大。

  • StringBuffer是可以不斷修改的對象。

    • StringBuffer sb = new StringBuffer();
    • sb.append(“haha”);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章