当前位置: 首页 > 面试题库 >

将Swing集成到简单的文字冒险游戏中

柴砚文
2023-03-14
问题内容

我对Java中的一些中间概念还很陌生。最近,我制作了一款名为DazzleQuest的文字冒险游戏,该游戏完全在开发者控制台/终端中运行。它以我的朋友为角色,因此我想向他们展示它,并通过将命令行和控制台的输出功能转移到一个简单的Swing界面(包括一个JTextArea用于显示游戏输出的a和一个JTextField带有ActionListener,处理来自用户的命令。

我的主DazzleQuest类包含名为run()和的方法handleCommand(),我认为我需要将其与我的Frame类及其子类TextFieldHandler[扩展ActionListener]
集成在一起。 总的来说,我想知道集成这些方法和类的最佳方法是什么。
我目前的尝试令人困惑,尽管我对如何使不同的类和方法进行通信有基本的了解,但这是暂时的。

抱歉,缺乏具体性。我会分享我的代码,但是不确定给出多少和确切给出什么。如果您认为您可以回答我的问题,但是需要我所举的例子,请这么说。甚至伪代码作为答案也将不胜感激。谢谢!理解这一点可能对我作为程序员的学习很有帮助。

编辑:以下是我的代码的简化示例,这些代码完全在开发人员控制台中运行。这是我的主要课程DazzleQuest

public class DazzleQuest {

public void run() {
    listCommands();
    for (;;) {
        StdOut.println(new StringBuilder("You are in ").append(currentRoom.getName()).append(".").toString());
        StdOut.println(new StringBuilder("You can go to: ").append(currentRoom.listExits()).toString());
        StdOut.print("> ");
        handleCommand(StdIn.readLine());
        StdOut.println();
    }

public void handleCommand(String line) {
        String[] words = line.split(" ");
        if (words[0].equals("look"))
            look();
        }
    }

}

这是我当前JFrameFrame课程中的设置:

import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JTextArea;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class Frame extends JFrame {

    public static JTextField field;
    public JTextArea area;

    public Frame() {
        setLayout(new FlowLayout());

        area = new JTextArea(20, 40);
        area.setEditable(false);

        field = new JTextField(20);
        add(area);
        add(field);
        pack();
        setVisible(true);

         TextFieldHandler handler = new TextFieldHandler();

            field.addActionListener(handler);
        }

        public class TextFieldHandler implements ActionListener{

            public void actionPerformed(ActionEvent event)
            {
                String line = field.getText();
                area.append(line + "\n");
                field.setText("");
            }
        }


    public static void main(String args[]) {

        Frame test = new Frame();
        test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

我知道如何将输出打印到JTextArea而不是控制台。我的问题是如何在课堂上真正地handleCommand()一起工作,或者是否应该在主类中设置动作侦听器或类似的东西。实施的任何示例将不胜感激。actionPerformed()``Frame

再次感谢您可以告诉我的任何信息!


问题答案:

首先,关于包含代码,您应该查看https://stackoverflow.com/help/mcve,了解如何帮助我们为您提供帮助。

现在,由于您还没有提供任何代码(尚未!),就如何构造程序提出建议有些棘手。但是无论如何,我都会尝试,并且在您提供MWE后可能会编辑答案。

就您而言,JTextArea这实际上只是一种幻想,System.out.print因为您只会用它来显示冒险游戏输出的文本(如果我正确理解了您的话)。因此,基本上,您可以编写一个接受字符串的方法,该方法会将字符串附加到您的JTextArea。然后只需使用此方法替换当前的输出线即可。

然后,您有了JTextField要替换(我猜)Scanner(System.in)的东西。我假设您知道如何设置响应的动作监听器Entersubmit-button。如何设置这些并不是什么奇怪的事,许多指南都在讨论如何做到这一点。https://docs.oracle.com/javase/tutorial/uiswing/components/textfield.html提供了一个很好的示例。

现在,大体上关于程序的结构。你 希望依赖于 如何 将用户输入的文本或你如何显示它。我的意思是,您不希望输入或显示逻辑与您的游戏( 业务
)逻辑混为一谈。您的游戏逻辑应该只是从任何地方接收输入,然后将其输出到任何地方。然后调用函数如何以及如何决定如何处理该信息,这并不是游戏逻辑所关心的。

因此,应用于您发布的方法名称。我认为这run()是您开始的地方。当您一直希望显示输出时,您可能希望传入一个interface包含方法print(string)(或类似方法)的here,该方法应该是将文本打印到用于显示文本的任何文本元素的方法,它System.out还是JTextArea。该run()方法永远不需要知道。
handleCommand()还应该只接受一个值(我假设是一个String)并按应有的方式处理它,而不管调用它的是谁。

我在没有代码的情况下无法为您提供更多建议。但是我的一般建议是:不要将表示逻辑与业务逻辑混在一起。并给每种方法尽可能少的信息,因为给它们过多的信息通常会导致流程和结构的灵活性降低。

现在编辑,已添加了一些代码。

我知道如何将输出打印到JTextArea而不是控制台。我的问题是如何确切地使handleCommand()与Frame类中的actionPerformed()一起使用

顺其自然actionPerformed()。我建议您这样做,因为如果Thread将来某个时候决定使用您的应用程序(多人游戏),您将不必费心。https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html提供了一些有关如何编写侦听器的良好信息。但我也会给您一些建议代码。

...
area.setEditable(false);

field = new JTextField(20);
field.addActionListener(new SendText());    
....

class SendText implements ActionListener{
    public void actionPerformed(ActionEvent ae){
        if(ae.getSource() == field){
            String str = field.getText();
            if(!str.equals("")){
                commandHandler.handle(str);
            }
        }
    }
}

然后重写你的run()方法

public void run(){
   ui.print(commandHandler.listCommands());

   while(true){
       if(commandHandler.continue()){
           ui.print(commandHandler.events());
       }
   }
}

因此,现在您有一个非常小的run()方法,它与逻辑或显示都没有真正的联系。ui.print(str)是您的UI类(Frame对于您而言)的一种方法,该方法只是将发送给它的字符串附加到其绘图区域(无论是System.out还是)JTextArea

commandHandler是新的。这就是您的游戏逻辑所在。它有一种handle(string)旧的方法handleCommand(string)。它有一个continue()返回布尔值的方法。每当您希望故事继续进行时(例如,当用户输入命令时),布尔值应设置为true。最后events()(这是一个不好的名字)返回自上次发送命令以来发生的事情,并为用户提供下一步操作的选项。我还没有实现它,只是想将这个概念提供给您。UI不执行任何逻辑处理。该run()方法没有任何期望,它只会继续检查是否continue()为真。commandHandler是所有嗡嗡声所在的地方。

现在,您确实正在运行一个无限循环。因此,如果您遇到任何性能问题,可以进行调查Thread。该模型应支持向其迁移。



 类似资料:
  • 在我的游戏中有几个类我写过,包括房间,灯,胸,爪哇,玩家,钥匙和地图。这些都经过了测试,并且是正确的,所以现在我正在编写我的adventure类,它是程序的驱动程序。我需要设置球员的房间位置[0][0],但我不知道怎么做。这是我到目前为止在我的房间和冒险课。

  • 所以我是Java编码的新手,我对C#有很好的经验,我知道它们非常相似。我目前正在通过创建一个文本冒险游戏来处理Java,游戏使用案例(案例1、案例2、默认等),目前我正在开发一个保存和加载功能,但我不知道如何保存一个使用案例来进一步编码的分支游戏,有人有什么想法吗?

  • 我正在为一个C项目做一个冒险游戏。目标基本上是拥有一组由类定义的房间。然后使用地图将它们链接在一起。除了检查是否没有房间和确保没有为空房间接受输入之外,我的一切都正常工作。例如,它会说“那里什么都没有”,然后重新提示用户移动的方向。当前,如果某个方向上没有空间,并且选择了该方向,我的程序就会崩溃。我现在已经设置好了它,至少确保输入了一个有效的方向(北、南、东或西),但它没有检查这个方向是否可用。有

  • 我正在Java制作一个基于文本的冒险游戏。我需要让用户能够拿起物品并将其放入库存中,但我不确定如何做到! 这是我的项目当前的设置方式: 我需要能够在某些房间里有特定的物品。有人有什么建议吗?

  • 我目前正在创建一个冒险游戏,你通过输入命令(北,南)通过一个地牢的房间移动。所以我试图用字典把每个房间连接在一起,这样我就可以用“北”、“南”等键来移动这些房间。但我似乎不明白。有什么想法吗?

  • 我一直在尝试制作一个简单的游戏,计算机生成一个随机数,你试着猜它。它还存储了你“尝试”的猜测量。 但是,当我运行该程序时,它只是打印:“让我们玩游戏。我会想到一个数字 1-100。试着猜猜。 这是我的代码: 我不明白为什么这不起作用,有人能解释一下为什么不起作用吗?