Java开发MUD游戏

引言

MUD(Multi-User Dungeon)是一种多用户的文本角色扮演游戏。它在20世纪80年代兴起,通过终端连接到远程服务器进行游戏。随着互联网的发展,MUD游戏也逐渐演变为基于Web的图形游戏,但仍保留了原始的多用户、虚拟世界的特点。

本文将介绍如何使用Java开发一个简单的MUD游戏。我们将使用Socket编程来实现多用户连接,并使用面向对象的思想来设计游戏的基本构架。

游戏基本架构

类图

以下是游戏的类图示例:

classDiagram
      class Game {
            -users: List<User>
            -world: World
            +start(): void
            +stop(): void
      }

      class User {
            +name: String
            +socket: Socket
            +input: BufferedReader
            +output: PrintWriter
            +User(socket: Socket)
            +getName(): String
            +send(message: String): void
            +receive(): void
            +close(): void
      }

      class World {
            -rooms: List<Room>
            +addRoom(room: Room): void
            +getRoom(roomId: int): Room
      }

      class Room {
            -roomId: int
            -name: String
            -description: String
            -exits: Map<String, Room>
            +Room(roomId: int, name: String, description: String)
            +getRoomId(): int
            +getName(): String
            +getDescription(): String
            +getExit(direction: String): Room
            +setExit(direction: String, room: Room): void
      }

类说明

  • Game类表示游戏的主控制器,负责创建和管理用户连接,并将用户的输入路由到正确的房间。
  • User类表示一个游戏玩家,每个玩家都对应一个独立的Socket连接。User类负责接收和发送消息,并在游戏世界中移动。
  • World类表示游戏的世界,包含多个房间。它负责管理房间和房间之间的连接。
  • Room类表示游戏的一个房间,包含房间的编号、名称、描述和连接其他房间的出口。

游戏实现

Game类

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Game {
    private List<User> users;
    private World world;

    public Game() {
        users = new ArrayList<>();
        world = new World();
    }

    public void start() {
        try {
            ServerSocket serverSocket = new ServerSocket(8888);
            System.out.println("Game started. Listening on port 8888...");

            while (true) {
                Socket socket = serverSocket.accept();
                User user = new User(socket);
                users.add(user);
                user.start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void stop() {
        for (User user : users) {
            user.close();
        }
        users.clear();
    }
}

User类

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class User extends Thread {
    private String name;
    private Socket socket;
    private BufferedReader input;
    private PrintWriter output;

    public User(Socket socket) {
        this.socket = socket;
        try {
            input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            output = new PrintWriter(socket.getOutputStream(), true);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public String getName() {
        return name;
    }

    public void send(String message) {
        output.println(message);
    }

    public void receive() {
        try {
            String message = input.readLine();
            // 处理用户输入
            // ...
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void close() {
        try {
            socket.close();
            input.close();
            output.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        // 发送欢迎消息
        send("Welcome to the game!");

        // 接收用户输入
        while (true) {
            receive();
        }
    }
}

World类

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List