5.1 城堡游戏

本文介绍了如何设计一款让玩家根据提示探索城堡并绘制地图的游戏,包括创建Game类、Room类,设置房间布局,输入指令判断及路径移动等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 我们现在有一个城堡,然后就是让玩家自己根据提示,探索城堡,并画出地图。

如图是我们规划好的地图,接下来就是我们要设计的思路:

首先,我们需要让给出提示,然后让玩家输入指令,对应的我们给出目前在的位置,或者帮助信息。如果输入非法输入,则判断为“没门”。

第一步:定义一个 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值