翁恺老师的作业,面向对象第五周,城堡游戏

更新:给房间添加了动作,你到一个房间里面之后,可以执行相应的动作
本次只更新了三个房间的动作,你要是有更好玩的做法,欢迎在评论区留下你的博客。
更新方法是用哈市表记录每个房间和对应的动作,另外重构了房间的地图,地图如下:在这里插入图片描述
以下为代码:
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();
		}

	}
}

本次代码不再写注释,只要你能看懂前面的代码,看懂这里的代码也是轻轻松松。如果有其他更好玩的创意,来分享一下啊。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值