代码实现效果为:

JAVA开发的彩虹雨 java游戏彩虹城堡_System


(黄色框为输入的内容)



文章目录

  • 一,整体框架
  • 1.需要实现的操作
  • 2.框架流程图
  • 二,部分拆解
  • 1.构造Game方法
  • Room的介绍
  • 2.显示初操作
  • 3.输入操作
  • 三,细节补充
  • 1.这里需要的三个class所需要的具体要求为:
  • 2.低耦合!



一,整体框架

1.需要实现的操作

   多次输入操作指示,判断需要进行的动作,系统做出反应。
  因此我们可以根据需要创建HandlerGo() HandlerBye() HandlerHelp() 三个.class

  • ① 构建三种可能 go bye help;
  • ② 搭好路线 即:具体位置、可以走的方向、走向的联系;
  • ③ 具体实现

2.框架流程图

JAVA开发的彩虹雨 java游戏彩虹城堡_ide_02

该图仅包含部分函数


二,部分拆解



1.构造Game方法

   首先我们需要一个HashMap,这个表格可以以便于对应每个不同操作的class 即:

private HashMap<String,Handler> handlers = new HashMap<String,Handler>();

这里Hander我们引用了一个class使得到的数据能够在handler中存储得以判断
而Hander.class中的内容为:

public class Handler {
    protected  Game game;

    public Handler(Game game)
    {
        this.game=game;//接收数据
    }
    public boolean isBye() 
    {
        return false;
    }
    public void doCmd(String value) {//进行操作
    }
}

开始构造

public Game() 
    {
        handlers.put("go", new HandlerGo(this));
        handlers.put("bye", new HandlerBye(this));
        handlers.put("help", new HandlerHelp(this));
        createRooms();
    }
  • 这里的this还未使用,需要在后面输入时才填入,这里只是为了区分构造不同的操作进入的不同class。
  • 而这里也把不同的情况存入handlers里面,以便后面输入时能够方便操作。



在构造时,先把操作类构造,再对具体房间进一步构造:

private void createRooms()
    {
        Room outside, lobby, pub, study, bedroom;
      
        //	制造房间
        outside = new Room("城堡外");
        lobby = new Room("大堂");
        pub = new Room("小酒吧");
        study = new Room("书房");
        bedroom = new Room("卧室");
        
        //	初始化房间的出口

        outside.setExit("east",lobby);
        outside.setExit("south",study);
        outside.setExit("west",pub);
        lobby.setExit("west",outside);
        pub.setExit("east",outside);
        study.setExit("north",outside);
        study.setExit("east", bedroom);
        bedroom.setExit("west",study);
        lobby.setExit("up", pub);
        pub.setExit("down", lobby);

        currentRoom = outside;  //	从城堡门外开始
    }
向这里的Room主要是为了“搭桥”,把所有的场景和场景之间的联系构造出来




Room的介绍

  在Room里面我们需要做什么?

  • 存储各个场景之间的联系
  • 获取在某场景中可以走的方位
  • 获取此刻的位置
package dome_1;

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);
    }

    @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));
    }
}




2.显示初操作

private Room currentRoom;//对应Room里面的description
private void printWelcome() {
        System.out.println();
        System.out.println("欢迎来到城堡!");
        System.out.println("这是一个超级无聊的游戏。");
        System.out.println("如果需要帮助,请输入 'help' 。");
        System.out.println();
        showPrompt();
    }
  
public void showPrompt(){
        System.out.println("你在" + currentRoom);
        System.out.print("出口有: ");
        System.out.print(currentRoom.getExitDesc());
        System.out.println();
    }




3.输入操作

public void play()
    {
        Scanner in = new Scanner(System.in);
        while ( true ) {
            String line = in.nextLine();
            String[] words = line.split(" ");//如果是输入走向则有两个输入 go(空格)方向,因此需要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();
    }





三,细节补充




1.这里需要的三个class所需要的具体要求为:

  • HandlerHelp
  • 纯输出
public class HandlerHelp extends Handler{

    	public HandlerHelp(Game game) {
       	 super(game);
        //TODO Auto-generated constructor stub
  		  }
    	public void doCmd(String word) {
     	   System.out.print("迷路了吗?你可以做的命令有:go bye help");
      	  System.out.println("如:\tgo east");
   		 }
    }




  • HandlerGo
  • 进入goRoom方法
  • 判断输入的方向是否正确
  • 若存在该方向则转入该场景
public class HandlerGo extends Handler{

    public HandlerGo(Game game) {
        super(game);
        //TODO Auto-generated constructor stub
    }
    public void doCmd(String word)
    {
        game.goRoom(word);
    }    
}
public void goRoom(String direction) 
    {
        Room nextRoom = currentRoom.getExit(direction);
        
        if (nextRoom == null) {
            System.out.println("那里没有门!");
        }
        else {
            currentRoom = nextRoom;
            showPrompt();
        }
    }




  • HandlerBye
  • 结束程序,返回true
public class HandlerBye extends Handler{
    public HandlerBye(Game game) {
        super(game);
        //TODO Auto-generated constructor stub
    }

    @Override
    public boolean isBye()
    {
        return true;
    }
}




2.低耦合!

  该代码由于为了考虑未来延展性,故封入了许多class,低耦合也能为未来修缮,添入新性能减少不必要的麻烦