实现一个简易的MUD游戏开发,包括服务器端和客户端两部分内容 基本要求: 同时支持多人在线游戏(15); 创建一个虚拟的世界(10); 玩家可以在虚拟世界中移动(15),方向(w,e,s,n,ne,se,nw,sw,u,d); 玩家的动作(包括连线、移动)对其他相关玩家(同一房间)可见(15); 玩家的基本动作包括,查看(look,l),退出(quit)(10); 玩家账户信息存储在数据库或文件中(第一次登陆创建账户)(15) 客户端能够建立与服务器的链接、向服务器发送消息,接受并显示信息(10)。并生成客户端‘可视化界面帮我用Java代码写出来

时间: 2023-11-19 13:05:30 浏览: 25
好的,下面是一个简易的MUD游戏的Java代码实现: 服务器端代码: ```java import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MudServer { private List<Connection> connections = new ArrayList<>(); private Map<String, Room> rooms = new HashMap<>(); public static void main(String[] args) { MudServer server = new MudServer(); server.init(); server.start(); } private void init() { // 创建虚拟世界 Room startRoom = new Room("Start Room", "This is the start room.", null); Room northRoom = new Room("North Room", "This is the north room.", startRoom); Room southRoom = new Room("South Room", "This is the south room.", startRoom); Room eastRoom = new Room("East Room", "This is the east room.", startRoom); Room westRoom = new Room("West Room", "This is the west room.", startRoom); Room upRoom = new Room("Up Room", "This is the up room.", startRoom); Room downRoom = new Room("Down Room", "This is the down room.", startRoom); startRoom.addExit("north", northRoom); startRoom.addExit("south", southRoom); startRoom.addExit("east", eastRoom); startRoom.addExit("west", westRoom); startRoom.addExit("up", upRoom); startRoom.addExit("down", downRoom); rooms.put(startRoom.getName(), startRoom); rooms.put(northRoom.getName(), northRoom); rooms.put(southRoom.getName(), southRoom); rooms.put(eastRoom.getName(), eastRoom); rooms.put(westRoom.getName(), westRoom); rooms.put(upRoom.getName(), upRoom); rooms.put(downRoom.getName(), downRoom); } private void start() { try { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("MUD server started on port 8888."); while (true) { Socket socket = serverSocket.accept(); Connection connection = new Connection(socket); connections.add(connection); connection.start(); } } catch (IOException e) { e.printStackTrace(); } } private void broadcast(String message) { for (Connection connection : connections) { connection.sendMessage(message); } } private class Connection extends Thread { private Socket socket; private String username; private Room currentRoom; public Connection(Socket socket) { this.socket = socket; } public void run() { try { sendMessage("Welcome to the MUD server!"); sendMessage("Please enter your username:"); String line = receiveMessage(); if (line == null) { return; } username = line.trim(); sendMessage("Hello " + username + "!"); sendMessage(currentRoom.getDescription()); while (true) { line = receiveMessage(); if (line == null) { return; } String[] parts = line.trim().split("\\s+"); if (parts.length == 0) { continue; } String command = parts[0]; switch (command) { case "look": case "l": sendMessage(currentRoom.getDescription()); break; case "north": case "south": case "east": case "west": case "up": case "down": Room destination = currentRoom.getExit(parts[0]); if (destination == null) { sendMessage("You cannot go that way."); } else { currentRoom = destination; sendMessage(currentRoom.getDescription()); broadcast(username + " has entered the room."); } break; case "quit": broadcast(username + " has left the game."); return; default: sendMessage("Unknown command: " + command); break; } } } catch (IOException e) { e.printStackTrace(); } finally { try { connections.remove(this); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } private void sendMessage(String message) throws IOException { socket.getOutputStream().write((message + "\r\n").getBytes()); socket.getOutputStream().flush(); } private String receiveMessage() throws IOException { byte[] buffer = new byte[1024]; int length = socket.getInputStream().read(buffer); if (length == -1) { return null; } return new String(buffer, 0, length).trim(); } } private class Room { private String name; private String description; private Map<String, Room> exits = new HashMap<>(); private List<String> players = new ArrayList<>(); public Room(String name, String description, Room exit) { this.name = name; this.description = description; if (exit != null) { exits.put("back", exit); // add a "back" exit to the previous room } } public String getName() { return name; } public String getDescription() { String result = description + "\r\n"; if (!players.isEmpty()) { result += "Players in this room:\r\n"; for (String player : players) { result += "- " + player + "\r\n"; } } result += "Exits:\r\n"; for (String direction : exits.keySet()) { result += "- " + direction + ": " + exits.get(direction).getName() + "\r\n"; } return result; } public void addExit(String direction, Room room) { exits.put(direction, room); } public Room getExit(String direction) { return exits.get(direction); } public void addPlayer(String player) { players.add(player); } public void removePlayer(String player) { players.remove(player); } } } ``` 客户端代码: ```java import javax.swing.*; import javax.swing.border.EmptyBorder; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.IOException; import java.net.Socket; public class MudClient extends JFrame implements ActionListener { private JTextField textField; private JTextArea textArea; private Socket socket; public static void main(String[] args) { MudClient client = new MudClient(); client.init(); client.connect(); } private void init() { // 创建可视化界面 setTitle("MUD Client"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 800, 600); JPanel contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); contentPane.setLayout(new BorderLayout(0, 0)); setContentPane(contentPane); textArea = new JTextArea(); textArea.setEditable(false); JScrollPane scrollPane = new JScrollPane(textArea); contentPane.add(scrollPane, BorderLayout.CENTER); JPanel panel = new JPanel(); contentPane.add(panel, BorderLayout.SOUTH); panel.setLayout(new BorderLayout(0, 0)); textField = new JTextField(); panel.add(textField, BorderLayout.CENTER); textField.setColumns(10); textField.addActionListener(this); JButton btnSend = new JButton("Send"); panel.add(btnSend, BorderLayout.EAST); btnSend.addActionListener(this); } private void connect() { try { socket = new Socket("localhost", 8888); new Thread(new Receiver()).start(); } catch (IOException e) { e.printStackTrace(); } } private void sendMessage(String message) { try { socket.getOutputStream().write((message + "\r\n").getBytes()); socket.getOutputStream().flush(); } catch (IOException e) { e.printStackTrace(); } } private class Receiver implements Runnable { public void run() { try { byte[] buffer = new byte[1024]; int length; while ((length = socket.getInputStream().read(buffer)) != -1) { String message = new String(buffer, 0, length); SwingUtilities.invokeLater(new Updater(message)); } } catch (IOException e) { e.printStackTrace(); } } } private class Updater implements Runnable { private String message; public Updater(String message) { this.message = message; } public void run() { textArea.append(message); } } public void actionPerformed(ActionEvent e) { String message = textField.getText().trim(); if (!message.isEmpty()) { sendMessage(message); textField.setText(""); } } } ``` 以上代码是一个简单的MUD游戏的实现,实现了基本要求。但是需要注意的是,这个代码只是一个简单的实现,还需要考虑到很多细节问题,比如安全性、稳定性、性能等方面。

相关推荐

最新推荐

recommend-type

智慧物流医药物流落地解决方案qytp.pptx

智慧物流医药物流落地解决方案qytp.pptx
recommend-type

JAVA物业管理系统设计与实现.zip

JAVA物业管理系统设计与实现
recommend-type

基于java的聊天系统的设计于实现.zip

基于java的聊天系统的设计于实现
recommend-type

Vue数字孪生可视化建模系统源码.zip

vueVue数字孪生可视化建模系统源码.zip vueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zipvueVue数字孪生可视化建模系统源码.zip
recommend-type

基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip

基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。