MOOC:面向?qū)ο蟪绦蛟O(shè)計(jì)——java語(yǔ)言 第五節(jié)拓展

為什么有這篇文章

面向?qū)ο笤O(shè)計(jì)思想是現(xiàn)代程序設(shè)計(jì)的重要基礎(chǔ)看疗,目前我在MOOC上學(xué)習(xí)翁凱老師的java進(jìn)階,主要就是進(jìn)行面向?qū)ο蟮娜腴T學(xué)習(xí)睦授。

在課程中两芳,第五節(jié)講述了了面向?qū)ο蠛?jiǎn)單實(shí)際應(yīng)用,主要例子是城堡游戲去枷,將其降提供的原始低耦合怖辆,使用類的繼承提高程序的拓展性是复。

編程的學(xué)習(xí)中,實(shí)際的練習(xí)十分重要竖螃,以前總是看視頻進(jìn)行學(xué)習(xí)淑廊,覺得十分簡(jiǎn)單,但實(shí)際操作時(shí)依然困難重重特咆。

所以我就這個(gè) 城堡游戲 的課后討論中提出的 隨機(jī)進(jìn)入房間 進(jìn)行了實(shí)現(xiàn)季惩,并將結(jié)果做一個(gè)備份。

MOOC地址

面向?qū)ο蟪绦蛟O(shè)計(jì)——Java語(yǔ)言
實(shí)踐來(lái)源是其課后討論中的

如何實(shí)現(xiàn)任意門腻格?

如果想要實(shí)現(xiàn)任意門画拾,即在某個(gè)房間,想要從某個(gè)出口出去菜职,結(jié)果每次會(huì)走到不同的房間去青抛。
如果要實(shí)現(xiàn)這樣的任意門,整個(gè)程序的架構(gòu)應(yīng)該是怎樣的酬核?
如果任意門只是在這個(gè)房間的所有的門之間輪轉(zhuǎn)妒蔚,應(yīng)該怎樣實(shí)現(xiàn)原杂?
如果任意門能在整個(gè)城堡的所有的門之間輪轉(zhuǎn)祠锣,應(yīng)該怎樣實(shí)現(xiàn)泞莉?
來(lái)自課件“如何實(shí)現(xiàn)任意門榨崩?

代碼部分

話不多說(shuō)直接放代碼蚁堤,代碼均添加了詳細(xì)的以下文件均在一個(gè)名為castle的package中像吻。

  • 首先是Game.java
package castle;

/*
 * 20181014 by Dreamer
 */
import java.util.HashMap;
import java.util.Scanner;

public class Game {
    private Room currentRoom;// 當(dāng)前房間

    // 操作String與對(duì)應(yīng)handler的HashMap
    // Room名字String與對(duì)應(yīng)Room的HashMap
    private HashMap<String, Handler> handlers = new HashMap<String, Handler>();
    private HashMap<String, Room> rooms = new HashMap<String, Room>();

    // 初始化
    public Game() {
        createRooms();
        currentRoom = rooms.get("outside"); // 從城堡門外開始
        handlers.put("go", new HandlerGo(this));
        handlers.put("bye", new HandlerBye(this));
        handlers.put("help", new HandlerHelp(this));
        handlers.put("random", new HandlerGoRandom(this));
        handlers.put("randomRoom", new HandlerRandomRoom(this));
    }

    // 制造及設(shè)置Room的HashMap
    private void createRooms() {

        // 制造Room
        rooms.put("outside", new Room("城堡外"));
        rooms.put("lobby", new Room("大堂"));
        rooms.put("pub", new Room("小酒吧"));
        rooms.put("study", new Room("書房"));
        rooms.put("bedroom", new Room("臥室"));
        rooms.put("heiwu", new Room("小黑屋"));

        // 初始化Room的出口
        addRoom("outside", "south", "lobby");
        addRoom("outside", "east", "study");
        addRoom("outside", "west", "pub");
        addRoom("lobby", "north", "outside");
        addRoom("pub", "east", "outside");
        addRoom("study", "west", "outside");
        addRoom("study", "south", "bedroom");
        addRoom("bedroom", "north", "study");
        addRoom("bedroom", "up", "heiwu");
        addRoom("heiwu", "down", "bedroom");
    }

//    設(shè)置Room出口的方法
    private void addRoom(String room, String direction, String nextRoom) {
        rooms.get(room).setExit(direction, rooms.get(nextRoom));
    }

//    歡迎
    private void printWelcome() {
        System.out.println();
        System.out.println("歡迎來(lái)到城堡厚者!");
        System.out.println("這是一個(gè)超級(jí)無(wú)聊的游戲罪帖。");
        System.out.println("如果需要幫助促煮,請(qǐng)輸入 'help' 。");
        System.out.println();
        System.out.println("現(xiàn)在你在" + currentRoom);
        System.out.print("出口有:");
        System.out.println(currentRoom.getExitDesc());

    }

//    返回Room的數(shù)量
    public int getSize() {
        int size = 0;
        size = rooms.size();
        return size;
    }

//    接受Room的名字String
//    返回對(duì)應(yīng)的Room
    public Room getRoom(String roomKey) {
        return rooms.get(roomKey);
    }

//    返回當(dāng)前所在的Room
    public Room getRoomNow() {
        return currentRoom;
    }

//    返回所有Room名字的String[]
    public String[] getMapKey() {
        String[] mapKeyList = rooms.keySet().toArray(new String[getSize()]);
        return mapKeyList;
    }

//    接受方向String
//    返回對(duì)應(yīng)的Room
    public void goRoom(String direction) {
        Room nextRoom = null;
        nextRoom = currentRoom.goRoom(direction);

        if (nextRoom == null) {
            System.out.println("那里沒有門整袁!");
        } else {
            currentRoom = nextRoom;
            System.out.println("你在" + currentRoom);
            System.out.print("出口有:");
            System.out.println(currentRoom.getExitDesc());
        }
    }

//    接受一個(gè)Room
//    將此Room設(shè)為當(dāng)前Room
    public void resetRoom(Room room) {
        currentRoom = room;
        System.out.println("你在" + currentRoom);
        System.out.print("出口有:");
        System.out.println(currentRoom.getExitDesc());
    }

//    運(yùn)行游戲
    public void play() {
        Scanner in = new Scanner(System.in);

        while (true) {
            String line = in.nextLine();// 讀取輸入
            String[] words = line.split(" ");// 以“ ”為分隔轉(zhuǎn)為String[]
            Handler handler = handlers.get(words[0]);// 第0個(gè)string是操作
            String value = words[0];// 默認(rèn)value設(shè)為第0個(gè)string

            // 如果有不止一個(gè)輸入菠齿,則將value設(shè)為第1個(gè)string作為參數(shù)
            if (words.length > 1) {
                value = words[1];
            }
            // 如果有這個(gè)操作的話就把參數(shù)傳入做handler.doCmd(value)
            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;

/*
 * 20181014 by Dreamer
 */
import java.util.HashMap;

public class Room {
    private String description;// 房間描述

    // 出口String及對(duì)應(yīng)Room的HashMap
    private HashMap<String, Room> room = new HashMap<String, Room>();

    // 初始化绳匀,給房間描述
    public Room(String getdescription) {
        description = getdescription;
    }

    // 設(shè)置Room的出口String及對(duì)應(yīng)的Room
    public void setExit(String direction, Room nextroom) {
        room.put(direction, nextroom);
    }

    // 返回將出口String加空格
    public String getExitDesc() {
        StringBuffer sb = new StringBuffer();
        for (String a : room.keySet()) {
            sb.append(a + " ");
        }
        return sb.toString();

    }

    // 返回出口string的HashMap大小
    public int getSize() {
        int size = 0;
        size = room.size();
        return size;
    }

    // 返回出口String的list
    public String[] getMapKey() {
        String[] mapKeyList = room.keySet().toArray(new String[getSize()]);
        return mapKeyList;
    }

    // 返回對(duì)應(yīng)String的Room
    public Room goRoom(String direction) {
        return room.get(direction);
    }

    // 重構(gòu)toString()
    @Override
    public String toString() {
        return description;
    }

}
  • HandlerBye.java
package castle;
/*
 * 20181014 by Dreamer
 * 1退出
 */

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

    // 返回isBye的true
    public boolean isBye() {
        return true;
    }
}
  • HandlerGo.java
package castle;
/*
 * 20181014 by Dreamer
 * 1去一個(gè)指定的room
 */

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

    // 接收string去所指的room
    public void doCmd(String word) {
        game.goRoom(word);
    }
}
  • HandlerGoRandom.java
package castle;
/*
 * 20181014 by Dreamer
 * 1隨機(jī)到一個(gè)緊鄰當(dāng)前room的room
 */

public class HandlerGoRandom extends Handler {

    public HandlerGoRandom(Game game) {
        super(game);
    }

    public void doCmd(String word) {
        Room room = game.getRoom(word);
        if (room == null) {
            room = game.getRoomNow();
        }

        int num = room.getSize();

        int rand = (int) (Math.random() * num);
        String[] keyMap = room.getMapKey();
        word = keyMap[rand];
        game.goRoom(word);
    }
}
  • HandlerHelp.java
package castle;
/*
 * 20181014 by Dreamer
 * 1退出
 */

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("如:\tgo east");
    }

}
  • HandlerRandomRoom.java
package castle;
/*
 * 20181014 by Dreamer
 * 1退出
 */

public class HandlerRandomRoom extends Handler {

    public HandlerRandomRoom(Game game) {
        super(game);
    }

    public void doCmd(String word) {
        String room = game.getRoomNow().toString();// 得到當(dāng)前Room的描述賦給room

        do {
            int num = game.getSize();// 得到game的Room數(shù)量
            int rand = (int) (Math.random() * num);// 在數(shù)量?jī)?nèi)隨機(jī)一個(gè)數(shù)
            String[] keyMap = game.getMapKey();// 得到game里所有房間的String[]
            word = keyMap[rand];// 用隨機(jī)數(shù)rand取一個(gè)room
            game.resetRoom(game.getRoom(word));
            ;// 把取來(lái)的room設(shè)為當(dāng)前room
        } while (room.equals(game.getRoom(word).toString()));// 如果隨機(jī)完了的room和隨機(jī)前一樣炸客,就重來(lái)
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末疾棵,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痹仙,更是在濱河造成了極大的恐慌是尔,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件开仰,死亡現(xiàn)場(chǎng)離奇詭異拟枚,居然都是意外死亡薪铜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門恩溅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)隔箍,“玉大人,你說(shuō)我怎么就攤上這事脚乡⊙烟玻” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵每窖,是天一觀的道長(zhǎng)帮掉。 經(jīng)常有香客問我,道長(zhǎng)窒典,這世上最難降的妖魔是什么蟆炊? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮瀑志,結(jié)果婚禮上涩搓,老公的妹妹穿的比我還像新娘。我一直安慰自己劈猪,他們只是感情好昧甘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著战得,像睡著了一般充边。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上常侦,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天浇冰,我揣著相機(jī)與錄音,去河邊找鬼聋亡。 笑死肘习,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坡倔。 我是一名探鬼主播漂佩,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼罪塔!你這毒婦竟也來(lái)了投蝉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤征堪,失蹤者是張志新(化名)和其女友劉穎墓拜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體请契,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡咳榜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年夏醉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涌韩。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畔柔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出臣樱,到底是詐尸還是另有隱情靶擦,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布雇毫,位于F島的核電站玄捕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棚放。R本人自食惡果不足惜枚粘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望飘蚯。 院中可真熱鬧馍迄,春花似錦、人聲如沸局骤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)峦甩。三九已至赘来,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凯傲,已是汗流浹背犬辰。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泣洞,地道東北人忧风。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓默色,卻偏偏與公主長(zhǎng)得像球凰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腿宰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容