java的学习笔记——一个城堡小游戏

  今天看了浙江大学的翁凯老师的java面向对象的课程,里面有一个城堡小游戏,看似很简单,但是我花了好长时间才弄明白。因为这个小游戏开始是用面向方法来做的,然后老师将它改成的面向对象的方法。下面把代码粘上来。

package castle;

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,这样就不用设置私有变量north,west,east,south来表示方向了。其实在开始的时候我对这样做并不是十分的理解,因为按照我们的平常思维,既然要做一个二维平面的,那么肯定是需要这四个变量,这样在写代码的时候,思路也是十分的清晰。可是这样做有一个弊端,那就是如果将来想要把这个二维平面变成一个三维平面,那么问题就会变得有一些复杂,因为到时候还要在设两个up,down变量来表示二维到三维的一个过渡,这样做是非常麻烦的。这个时候就可以看出HashMap的优势了(关于HashMap的东西会在另一篇博客中写)。首先用构造函数构造出一个房间的信息,然后用HashMap来存放这个房子的二维信息,即他的四周都有什么,这样的话,虽然在main函数中多了一些设置方位的函数,但是在添加上下是非常有帮助的,直接就可以通过this.setExit(Stirng dir,Room room)来添加它的三维信息。其次,就是在获得信息上。如果用面向方法来编写的话,SIf..else来嵌套使用看它的二维信息(就是它在那些方位是可以行走的),但是用HashMap可以直接通过keySet(),即用关键值来找它的二维信息,用一个Foreach循环来代替if..else。还有一点就是StringBuffer,不同于String,它可以节省内存(关于StringBuffer的东西会在另一篇博客中写道)。最后是实现进入另一个房间,用的是getExit(),感觉很优雅,只用了一行代码就实现了这个功能。还是因为HashMap把它的二维信息记录下来了,所以可以根据方向来返回到底下一个房间是哪个。

package castle;

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.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);
        pub.setExit("down",lobby);
        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("出口有:");
        System.out.print(currentRoom.getExitdesc());
    }

    // 以下为用户命令

    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.getExit("north");
        }
        if(direction.equals("east")) {
        	nextRoom = currentRoom.getExit("east");
        }
        if(direction.equals("south")) {
        	nextRoom = currentRoom.getExit("south");
        }
        if(direction.equals("west")) {
        	nextRoom = currentRoom.getExit("west");
        }

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

}

然后就是游戏实现的类了。可以看到Room的类封装的好的话,在选择创造Room的时候回感觉很舒服。花了将近两个小时来看这个只有两个类的代码。主要是自己动手跟着老师一起将面向方法改成了面向对象,总体来说还是有很大的收获的。

  其实看看能不能加一个怪兽类,来变成一个城堡探险类的文字游戏呢,我会继续下去学习,争取自己写一个Monster类。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值