我们现在有一个城堡,然后就是让玩家自己根据提示,探索城堡,并画出地图。
如图是我们规划好的地图,接下来就是我们要设计的思路:
首先,我们需要让给出提示,然后让玩家输入指令,对应的我们给出目前在的位置,或者帮助信息。如果输入非法输入,则判断为“没门”。
第一步:定义一个 Game 类,主函数,输入,创建对象
import java.util.Scanner;
public class Game{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Game game = new Game();}
第二步:当然是需要输入提示信息, 需要调用game 的成员函数,所以先创建一个 printWelcom函数
调用
game.printWelcome();
输出提示信息的Game的成员函数
private void printWelcome() {
System.out.println();
System.out.println("欢迎来到城堡!");
System.out.println("这是一个超级无聊的游戏。");
System.out.println("如果需要帮助,请输入 'help' 。");
System.out.println();
System.out.println("现在你在" + currentRoom);
System.out.print("出口有:");
}
第三步:刚开始,输入提示信息,肯定需要知道目前在那个地方,所以我们要定义初始化,把地方都定义一遍,然后初始地方 currentRoom 也定义一下
定义Game成员变量
private Room currentRoom;
当然,这个初始化地方,是一个对象,是对象就有属性,所以要定义出来一个类,来定义地点这个属性
开辟一个Room 类,定义成员变量,和成员函数
public class Room {
public String description; //目的地
public Room northExit; //北边的地方
public Room southExit; //南边的地方
public Room eastExit; //东边的地方
public Room westExit; //西边的地方//构造函数
public Room(String description)
{
this.description = description;
}}
第四步:我们现在要的是定义初始化,要有用Room类制造的房间,
初始地也要定义,所以要定义成员变量
Game类成员变量
private void createRooms(){
Room outside, lobby , pub, study , bedroom;
// 制造房间
outside = new Room("城堡外");
lobby = new Room("大堂");
pub = new Room("小酒吧");
study = new Room("书房");
bedroom = new Room("卧室");}
当然,这些还是不够的,我们需要的就是,要能够知道房间的东西南北到底是那个地方,分别标出,当我们输入对应方向的时候,对应判断,位置赋值,进而输出位移后的位置。
那就需要定义房间东西南北了,仔细思考一下如何定义呢?
我们先把位置放在参数里面,然后调用Room里面的成员函数,进行赋值判断,如果方向不是Null,则说明那个方向有门,
Game类的成员函数:
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.setExits(null, lobby, study, pub);
lobby.setExits(null, null, null, outside);
pub.setExits(null, outside, null, null);
study.setExits(outside, bedroom, null, null);
bedroom.setExits(null, null, null, study);currentRoom = outside; // 从城堡门外开始
}
那接下来就是在Rooml里面定义对应的成员变量和函数
Room类的成员函数:
public void setExits(Room north, Room east, Room south, Room west)
{
if(north != null)
northExit = north;
if(east != null)
eastExit = east;
if(south != null)
southExit = south;
if(west != null)
westExit = west;
}
对应北,东,南,西。在Game里创建对象依次调用setExits,传入参数,如果那个方向不是null,那就把对应的方向的房间名字赋值对象的成员变量,注意:这里传入的参数,都是不同方向的房间名
我们这样做可以做两件事情,第一个,就是可以调用当前房间的成员变量,判断其是否为空,从而输出在其四周方向是否有门可走
第二个,就是可以通过输入的方向,进行判断,选择调用成员变量
public Room northExit;
public Room southExit;
public Room eastExit;
public Room westExit;
把对应的房间名,赋值给下一个要走的房间,从而得到移动后的当前房间。
这里需要注意,如果要直接赋值字符串的话,需要覆盖Object的函数,就是在Room里面添加
@Override
public String toString()
{
return description;
}
接下来回到,printWelcom成员函数,初始化完成了,我们继续往下走,想起初始化,我们的
private void createRooms(){}
需要在创建Game 的时候就被调用初始化了,那new 的时候只初始化成员变量和构造函数,他也不是构造函数,没有和类同名,所以就需要一个构造函数调用他了。
public Game()
{
createRooms();
}
第五步:往下走,回到:private void printWelcome()
System.out.println();
System.out.println("欢迎来到城堡!");
System.out.println("这是一个超级无聊的游戏。");
System.out.println("如果需要帮助,请输入 'help' 。");
System.out.println();
System.out.println("现在你在" + currentRoom);
System.out.print("出口有:");currentRoom已经定义初始化了,那出口就需要判断一下了,我们在Room的成员函数里,可以把房间的四周的地名已经输入进去进行判断了,有门就可以了,无门就是null ,
调用
public void setExits(Room north, Room east, Room south, Room west)
{
if(north != null)
northExit = north;
if(east != null)
eastExit = east;
if(south != null)
southExit = south;
if(west != null)
westExit = west;
}if(currentRoom.northExit != null)
System.out.print("north ");
if(currentRoom.eastExit != null)
System.out.print("east ");
if(currentRoom.southExit != null)
System.out.print("south ");
if(currentRoom.westExit != null)
System.out.print("west ");这样就可以把出口输出了,那接下了,要判断输入的东西来进行下一步的判断了
第六步:来一个死循环,除非输入 bye ,才结束。输入help,调用帮助参数,输入方向继续判断
while ( true ) {
String line = in.nextLine();
String[] words = line.split(" ");
if ( words[0].equals("help") ) {
game.printHelp();
} else if (words[0].equals("go") ) {
game.goRoom(words[1]);
} else if ( words[0].equals("bye") ) {
break;
}
}
其中帮助的成员函数:
private void printHelp()
{
System.out.print("迷路了吗?你可以做的命令有:go bye help");
System.out.println("如:\tgo east");
}
第七步:最后就是对输入方向,判断是否有门,从而进行输出对应房间。
判断输入的方向,然后通过调用对应对象的成员地点,进行赋值判断
private void goRoom(String direction) {
Room nextRoom = null;
if(direction.equals("north")) {
nextRoom = currentRoom.northExit;
}
if(direction.equals("east")) {
nextRoom = currentRoom.eastExit;
}
if(direction.equals("south")) {
nextRoom = currentRoom.southExit;
}
if(direction.equals("west")) {
nextRoom = currentRoom.westExit;
}
}
接着判断,如果对应的方向有门的话,就把对应方向的地点赋值下一个地点,从而达到移动的目的
if (nextRoom == null) {
System.out.println("那里没有门!");
}
else {
currentRoom = nextRoom;
System.out.println("你在" + currentRoom);
System.out.print("出口有: ");
if(currentRoom.northExit != null)
System.out.print("north ");
if(currentRoom.eastExit != null)
System.out.print("east ");
if(currentRoom.southExit != null)
System.out.print("south ");
if(currentRoom.westExit != null)
System.out.print("west ");
System.out.println();
}
}
注意,我们判断输入的是方向,赋值的是地点,对应方向的地点已经被我们在Room里的函数赋值了。
这样就完成了。
效果如图:
两个类的源码:
import java.util.Scanner;
public class Game {
private Room currentRoom;
public Game()
{
createRooms();
}
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.setExits(null, lobby, study, pub);
lobby.setExits(null, null, null, outside);
pub.setExits(null, outside, null, null);
study.setExits(outside, bedroom, null, null);
bedroom.setExits(null, null, null, study);
currentRoom = outside; // 从城堡门外开始
}
private void printWelcome() {
System.out.println();
System.out.println("欢迎来到城堡!");
System.out.println("这是一个超级无聊的游戏。");
System.out.println("如果需要帮助,请输入 'help' 。");
System.out.println();
System.out.println("现在你在" + currentRoom);
System.out.print("出口有:");
if(currentRoom.northExit != null)
System.out.print("north ");
if(currentRoom.eastExit != null)
System.out.print("east ");
if(currentRoom.southExit != null)
System.out.print("south ");
if(currentRoom.westExit != null)
System.out.print("west ");
System.out.println();
}
// 以下为用户命令
private void printHelp()
{
System.out.print("迷路了吗?你可以做的命令有:go bye help");
System.out.println("如:\tgo east");
}
private void goRoom(String direction)
{
Room nextRoom = null;
if(direction.equals("north")) {
nextRoom = currentRoom.northExit;
}
if(direction.equals("east")) {
nextRoom = currentRoom.eastExit;
}
if(direction.equals("south")) {
nextRoom = currentRoom.southExit;
}
if(direction.equals("west")) {
nextRoom = currentRoom.westExit;
}
if (nextRoom == null) {
System.out.println("那里没有门!");
}
else {
currentRoom = nextRoom;
System.out.println("你在" + currentRoom);
System.out.print("出口有: ");
if(currentRoom.northExit != null)
System.out.print("north ");
if(currentRoom.eastExit != null)
System.out.print("east ");
if(currentRoom.southExit != null)
System.out.print("south ");
if(currentRoom.westExit != null)
System.out.print("west ");
System.out.println();
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Game game = new Game();
game.printWelcome();
while ( true ) {
String line = in.nextLine();
String[] words = line.split(" ");
if ( words[0].equals("help") ) {
game.printHelp();
} else if (words[0].equals("go") ) {
game.goRoom(words[1]);
} else if ( words[0].equals("bye") ) {
break;
}
}
System.out.println("感谢您的光临。再见!");
in.close();
}
}
public class Room {
public String description;
public Room northExit;
public Room southExit;
public Room eastExit;
public Room westExit;
public Room(String description)
{
this.description = description;
}
public void setExits(Room north, Room east, Room south, Room west)
{
if(north != null)
northExit = north;
if(east != null)
eastExit = east;
if(south != null)
southExit = south;
if(west != null)
westExit = west;
}
@Override
public String toString()
{
return description;
}
}