更新:给房间添加了动作,你到一个房间里面之后,可以执行相应的动作
本次只更新了三个房间的动作,你要是有更好玩的做法,欢迎在评论区留下你的博客。
更新方法是用哈市表记录每个房间和对应的动作,另外重构了房间的地图,地图如下:
以下为代码:
Game类:
package custome_castle;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;
public class Game {
private HashMap<String, Handler> handlers=new HashMap<String, Handler>();
private ArrayList<Room> rooms=new ArrayList<Room>();
private HashMap<Room, RoomCmd> roomCmds=new HashMap<Room, RoomCmd>();//储存在房间里面的命令
Room currentRoom;
public Game(){
handlers.put("go", new HandlerGo(this));
handlers.put("random", new HandlerRandom(this));
handlers.put("help", new HandlerHelp(this));
handlers.put("bye", new HandlerBye(this));
creatRoom();
roomCmds.put(rooms.get(0), new RoomCmdSleep(this));
roomCmds.put(rooms.get(4), new RoomCmdDrkTea(this));
roomCmds.put(rooms.get(6), new RoomCmdDrkAlc(this));
}
//写房间,画地图,重构城堡结构
public void creatRoom()
{
Room lobby,balcony,study,warehouse,tea,outside,garden,store,pub,bedroom;
lobby=new Room("大堂");
balcony=new Room("阳台");
store=new Room("商店");
study=new Room("书房");
warehouse=new Room("仓库");
outside=new Room("外面");
garden=new Room("花园");
pub=new Room("小酒馆");
tea=new Room("茶室");
bedroom=new Room("卧室");
String[] dir= {"north","east","south","west","north1","south1","up","down"};
lobby.setExit(dir[0], warehouse);
lobby.setExit(dir[4], tea);
lobby.setExit(dir[1], outside);
lobby.setExit(dir[2], balcony);
lobby.setExit(dir[5], study);
lobby.setExit(dir[3], garden);
warehouse.setExit(dir[1], tea);
warehouse.setExit(dir[2], lobby);
tea.setExit(dir[2], lobby);
tea.setExit(dir[3], warehouse);
pub.setExit(dir[2], outside);
outside.setExit(dir[0], pub);
outside.setExit(dir[2], store);
outside.setExit(dir[3], lobby);
store.setExit(dir[0], outside);
balcony.setExit(dir[0], lobby);
balcony.setExit(dir[3], study);
study.setExit(dir[0], lobby);
study.setExit(dir[1], balcony);
study.setExit(dir[6], bedroom);
bedroom.setExit(dir[7], study);
garden.setExit(dir[1], lobby);
currentRoom=outside;
rooms.add(bedroom);
rooms.add(store);
rooms.add(garden);
rooms.add(outside);
rooms.add(tea);
rooms.add(warehouse);
rooms.add(pub);
rooms.add(study);
rooms.add(balcony);
rooms.add(lobby);
}
/*--------------------------辅助函数-------------------------------*/
//输出欢迎界面
private void printWelcome() {
System.out.println();
System.out.println("欢迎来到城堡!");
System.out.println("这是一个超级无聊的游戏。");
System.out.println("如果需要帮助,请输入 'help' 。");
System.out.println();
showPrompt();
}
//输出提示
private void showPrompt() {
System.out.println("你在" + currentRoom);
System.out.print("出口有: ");
System.out.print(currentRoom.getExitDesc());
System.out.println();
}
/*-----------------------返回给Handler子类调用的接口----------------------------*/
public String getHandlers()
{
StringBuffer sb=new StringBuffer();
for(String s:handlers.keySet())
{
sb.append(s);
sb.append(" ");
}
return sb.toString();
}
public void goRoom(String direction)
{
Room nextRoom=currentRoom.getExit(direction);
if(nextRoom==null)
{
System.out.println("那里没有门");
}
else {
currentRoom=nextRoom;
showPrompt();
RoomCmd rc;
if(roomCmds.keySet().contains(currentRoom))
{
rc=roomCmds.get(currentRoom);
rc.doSth();
}
}
}
public void toRandom()
{
int a=(int) (Math.random()*10);//产生随机数0~9
currentRoom = rooms.get(a);//进入任意一个房间
showPrompt();
}
/*------------------------给房间命令的调用接口---------------------*/
public void toStudy()
{
currentRoom=rooms.get(7);
showPrompt();
}
public void goBedroom()
{
currentRoom=rooms.get(0);
showPrompt();
}
/*---------------------play函数,协调其他程序,运行的主体--------------------------*/
public void play()
{
Scanner in=new Scanner(System.in);
while(true) {
String line=in.nextLine();
String[] words=line.split(" ");
Handler cmd=handlers.get(words[0]);
String value=" ";
if(words.length>1)
{
value=words[1];
}
if(cmd!=null)
{
cmd.doCmd(value);
if(cmd.isBye())
{
break;
}
}
}
in.close();
}
public void out() {
System.out.println(rooms);
}
/*---------------------main函数,运行程序-------------------------------------------------*/
public static void main(String[] args) {
Game game=new Game();
game.printWelcome();
game.play();
System.out.println("感谢您的光临。再见!");
// game.out();
}
}
Room类
package custome_castle;
import java.util.HashMap;
public class Room {
private String description;
private 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 s:exits.keySet())
{
sb.append(s);
sb.append(" ");
}
return sb.toString();
}
public Room getExit(String direction)
{
return exits.get(direction);
}
public String toString()
{
return description;
}
}
命令类及其子类:
package custome_castle;
public class Handler {
protected Game game;
public Handler(Game game)
{
this.game=game;
}
public void doCmd(String word) {
}
public boolean isBye()
{
return false;
}
}
package custome_castle;
public class HandlerBye extends Handler {
public HandlerBye(Game game) {
super(game);
// TODO Auto-generated constructor stub
}
@Override
public boolean isBye() {
// TODO Auto-generated method stub
return true;
}
}
package custome_castle;
public class HandlerGo extends Handler {
public HandlerGo(Game game) {
super(game);
}
public void doCmd(String direction) {
game.goRoom(direction);
}
}
package custome_castle;
public class HandlerHelp extends Handler {
public HandlerHelp(Game game) {
super(game);
// TODO Auto-generated constructor stub
}
public void doCmd(String word) {
System.out.println("迷路了吗?你可以做的命令有:"+game.getHandlers()+"");
System.out.println("如:\tgo east\n注意:random不会触发房间事件");
}
}
package custome_castle;
public class HandlerRandom extends Handler {
public HandlerRandom(Game game) {
super(game);
}
public void doCmd(String word)
{
game.toRandom();
}
}
房间命令类及其子类,这是本次更新的要点
package custome_castle;
public class RoomCmd {
protected Game game;
public RoomCmd(Game game) {
this.game = game;
}
public void doSth() {
}
}
在小酒馆里喝酒
package custome_castle;
import java.util.Scanner;
public class RoomCmdDrkAlc extends RoomCmd {
public RoomCmdDrkAlc(Game game) {
super(game);
// TODO Auto-generated constructor stub
}
public void doSth() {
System.out.println("这里是小酒馆,你可以在这里喝酒(喝完之后会被传送到卧室睡觉)");
Scanner in=new Scanner(System.in);
System.out.println("是否喝酒?\n 1:喝茶 0:不喝");
int a=in.nextInt();
if(a==1)
{
System.out.println("30 minutes later");
for(int i=0;i<7;i++)
{
System.out.println("...");
}
System.out.println("你已经喝完酒了,你将会被送去睡觉\n");
game.goBedroom();
}
}
}
在茶室里喝茶:
package custome_castle;
import java.util.Scanner;
public class RoomCmdDrkTea extends RoomCmd {
public RoomCmdDrkTea(Game game) {
super(game);
// TODO Auto-generated constructor stub
}
public void doSth() {
Scanner in=new Scanner(System.in);
System.out.println("这里是茶室,你可以在这里喝茶(喝完之后你会被传送到书房学习)");
System.out.println("是否喝茶?\n 1:喝茶 0:不喝");
int a=in.nextInt();
if(a==1)
{
System.out.print("five minutes later");
for(int i=0;i<3;i++)
{
System.out.println("...");
}
System.out.println("你已经喝完茶了,你将会被送去学习\n");
game.toStudy();
}
}
}
在卧室里睡觉:
package custome_castle;
import java.util.Scanner;
public class RoomCmdSleep extends RoomCmd {
Scanner in=new Scanner(System.in);
public RoomCmdSleep(Game game) {
super(game);
// TODO Auto-generated constructor stub
}
public void goSleep()
{
System.out.println("7 hours later");
for(int i=0;i<15;i++)
{
System.out.println("z z z");
}
}
public void doSth() {
System.out.println("这里是卧室,你将会在这里睡觉");
goSleep();
System.out.println("你已经睡完觉了 是否离开卧室\n 1:离开 0:继续睡觉");
int a=in.nextInt();
if(a==1)
{
game.toStudy();
}
else if(a==0){
goSleep();
}
}
}
本次代码不再写注释,只要你能看懂前面的代码,看懂这里的代码也是轻轻松松。如果有其他更好玩的创意,来分享一下啊。