為什么有這篇文章
面向?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)
}
}