学习Java时的笔记心得——城堡小游戏

在B站上看了浙江大学翁凯老师的Java进阶课,其中有一个城堡小游戏,感觉很有意思,我就跟着老师一起写。
翁凯老师的Java进阶课

package Game;

import java.util.HashMap;

public class Room {

	private String description;//房间信息
	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 dir :exits.keySet()) {        
			 sb.append(dir);    
			 sb.append(" ");    
		 }     
		return sb.toString();  
	}
	
	 public Room getExit(String dir) {    //进入另一个方向的房间
		 return exits.get(dir);
	}
	 
	 public String toString() {
		 return " "+description;  
	}
	
}

这是一个Room的类。其中用了HashMap来表示一个方向有一个Room,首先用构造函数构造出一个房间的信息,然后用HashMap来存放这个房子的四周都有什么,HashMap中有一个KeySet()方法,可以获取哪个方向可以走。

package Game;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;

public class Game {

	private Room currentRoom;//现在所在的房间
	HashMap<String,Header> headers = new HashMap<String,Header>();
	HashSet<String> list = new HashSet<String>();
	
	public Game(){
		creat();
		headers.put("go", new HeaderGo(this));
		headers.put("help", new HeaderHelp(this));
		headers.put("bye", new HeaderBye(this));
	}
	public void creat(){
		//制造各个房间
		 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("east", outside);        
		 study.setExit("north",outside);        
		 study.setExit("south",bedroom);        
		 bedroom.setExit("west",study);               
		 currentRoom = outside;  //	从城堡门外开始
		
	}
	
	public void Welcome(){
		System.out.println();
		System.out.println("欢迎来到旅行社!");
		System.out.println("这是一个超级无聊的游戏。");
		System.out.println("如果需要帮助,请输入 'help' 。");
		System.out.println();
		System.out.println("现在你在" + currentRoom);
		System.out.print("可以走的方向有:");
		System.out.print(currentRoom.getExitdesc());
	}

	public void play(){
		Scanner in = new Scanner(System.in);
		while ( true ){
			String line = in.nextLine();        		
			String[] words = line.split(" "); 
			//将输入的内容用空格分割成数组,创建相应的Header,将自己(Game类)传过去
			Header header = headers.get(words[0]);
			
			String value = "";
			if(words.length > 1){
				value = words[1];
				list.add(currentRoom.toString());
			}
			
			if(header != null){
				//将方向传入相应的类里
				header.doCmd(value);
				//isBye为true则跳出循环
				if(header.isBye())
					break;
			}      
			}
	}
	
    public void printBye(){
    	System.out.println("旅行到此结束,再见!");
    	System.out.println("此次旅行经过的地点有:"+list.toString());
    }
    
    public void printGo(String direction){
    	Room nextRoom = null;
    	if(direction.equals("north")){
    		nextRoom = currentRoom.getExit(direction);
    	}
    	 if(direction.equals("east")){
    		nextRoom = currentRoom.getExit(direction);
    	}        
    	 if(direction.equals("south")){
    		nextRoom = currentRoom.getExit(direction);
    	}        
    	 if(direction.equals("west")){        	
    		nextRoom = currentRoom.getExit(direction);        
    	}
    	 if(nextRoom == null){
    		 System.out.println("那个方向没有东西");
    	 }else{
    		 currentRoom = nextRoom;
    		 System.out.println("你现在在" + currentRoom);
    		 System.out.print("可以走的方向有: ");
             System.out.print(currentRoom.getExitdesc());
             System.out.println();
    	 }
    }
	public static void main(String[] args) {

		Game game = new Game();
		
		game.Welcome();
		
		game.play();
		
		game.printBye();

	}
}

游戏实现类Game。这里将操作都封装到Header类里面,Header里是一个父类,规定着所做的操作,每个操作具体做的事情(HeaderGo,HeaderHelp,HeaderBye)为子类继承这个Header类。游戏在初始化时,用户输入相应的操作将自己传到相应的类里。代码如下:

package Game;

public class Header {

	protected Game game;
	public Header(Game game){
		this.game = game;
	}
	public void doCmd(String name){}
	public boolean isBye(){return false;}
}
package Game;

public class HeaderGo extends Header {

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

	@Override
	public void doCmd(String name) {
		game.printGo(name);
	}

以上代码HeaderGo类重写了父类的doCmd方法,这里的game是游戏在初始化时,用户输入相应的操作将自己传到HeaderGo的类里。

package Game;

public class HeaderHelp extends Header {

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

	@Override
	public void doCmd(String name) {
		
		System.out.println("迷路了吗?你可以做的命令有:go bye help");
        System.out.println("如:\tgo east");
        
	}

}

以上代码HeaderHelp类重写了父类的doCmd方法,同样的,这里的game是游戏在初始化时,用户输入相应的操作将自己传到HeaderHelp的类里。

package Game;

public class HeaderBye extends Header {

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

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

}

这里有一个isBye()方法,它确定了用户的输入是否为Bye,另外两个具体类(HeaderGo、HeaderHelp)并没有实现这个方法,他们会调用父类的isBye()。
除此之外,我自己加了一个HashSet,用来存放经过的地点。因为HashSet的集合没有重复的元素,所以我感觉用HashSet也比较合理。
第一次写,可能里面很多东西没有说明白,请多多见谅,本人也是小白一个,希望我们共同进步、共同成长。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值