在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也比较合理。
第一次写,可能里面很多东西没有说明白,请多多见谅,本人也是小白一个,希望我们共同进步、共同成长。