0

我是一个初学者程序员,这是我在这个论坛上的第一个问题。

我正在使用 BlueJ 作为编译器编写一个简单的文本冒险游戏,并且我在 Mac 上。我遇到的问题是我想让我的代码更加自动化,但是我不能用字符串调用一个类。我想调用该类而不将其全部包含在 if 函数中的原因是我可以合并更多方法。

以下是它当前的运行方式:

public class textadventure {
public method(String room){
if(room==street){street.enterRoom();}
}
}
public class street{
public enterRoom(){
//do stuff and call other methods
}
}

if 语句测试我创建的每个班级/房间。我希望代码做的是自动将字符串房间变成可以调用的类名。所以它可能会像这样:

Public method(string room){
Class Room = room;
Room.enterRoom();
}

我已经研究过使用 Class.forName,但是所有的例子都太笼统了,我无法理解如何使用这个函数。任何帮助将不胜感激,如果有任何其他必要的信息(例如更多示例代码),我很乐意提供。

-塞巴斯蒂安

这是完整的代码:

import java.awt.*;
import javax.swing.*;

public class Player extends JApplet{
public String textOnScreen;

public void start(){
room("street1");
}

public void room(String room){
    if(room=="street1"){
    textOnScreen=street1.enterRoom();
    repaint();
    }
    if(room=="street2"){
    textOnScreen=street2.enterRoom();
    repaint();
    }
}
public void paint(Graphics g){
    g.drawString(textOnScreen,5,15);
}
}

public abstract class street1
{
private static String textToScreen;
public static String enterRoom(){
    textToScreen = "You are on a street running from North to South.";
    return textToScreen;
}
}

public abstract class street2
{
private static String textToScreen;
public static String enterRoom(){
    textToScreen = "You are on another street.";
    return textToScreen;
}
}
4

4 回答 4

3

鉴于您对编程相当陌生,我建议您从一些比成熟的冒险游戏更简单的程序开始。您还没有完全掌握 Java 语法的一些基础知识。以 HelloWorld 程序为例:

public class HelloWorld {
  public static void main(String[] args) {
    String output = "Hello World!"
    System.out.println(output);
  }   
}

注意public是小写的。 Public跟大写P不一样public

另请注意,String该类有一个大写S字母。* 同样,大写很重要,因此string与.* 不同String

另外,请注意,我不必使用String string = new String("string"). 您可以使用String string = "string". 这种语法运行得更快,更容易阅读。

在测试字符串相等性时,您需要使用String.equals而不是==. 这是因为a == b检查对象是否相等(即ab占据内存中的相同位置)并stringOne.equals(stringTwo)检查是否stringOne有相同的字符以相同的顺序排列,stringTwo而不管它们在内存中的位置。

现在,至于您的问题,我建议使用 anEnum或 aMap来跟踪要使用的对象。

例如:

public class Tester {

  public enum Location {

    ROOM_A("Room A", "You are going into Room A"),
    ROOM_B("Room B", "You are going into Room B"),
    OUTSIDE("Outside", "You are going outside");
    private final String name;
    private final String actionText;

    private Location(String name, String actionText) {
      this.name = name;
      this.actionText = actionText;
    }

    public String getActionText() {
      return this.actionText;
    }   

    public String getName() {
      return this.name;
    }   

    public static Location findByName(String name) {
      name = name.toUpperCase().replaceAll("\\s+", "_");
      try {
        return Enum.valueOf(Location.class, name);
      } catch (IllegalArgumentException e) {
        return null;
      }   
    }   
  }


  private Location currentLocation;

  public void changeLocation(String locationName) {
    Location location = Location.findByName(locationName);
    if (location == null) {
      System.out.println("Unknown room: " + locationName);
    } else if (currentLocation != null && currentLocation.equals(location)) {
      System.out.println("Already in room " + location.getName());
    } else {
      System.out.println(location.getActionText());
      currentLocation = location;
    }
  }

  public static void main(String[] args) {
    Tester tester = new Tester();
    tester.changeLocation("room a");
    tester.changeLocation("room b");
    tester.changeLocation("room c");
    tester.changeLocation("room b");
    tester.changeLocation("outside");
  }
}

*这是格式化 Java 代码的标准方式。类名是PascalCased,而变量名是camelCased

于 2012-05-19T18:49:37.177 回答
0

在 Java 中,许多类都有属性,您可以而且经常会拥有来自同一个类的多个实例。

您将如何识别哪个是哪个名称?

例如

class Room {
    List<Monster> monsters = new ArrayList <Monster> ();
    public Room (int monstercount) {
         for (int i = 0; i < monstercount; ++i)
            monsters.add (new Monster ());
    }
    // ...
}

怪物可以有属性,如果其中一个已经死了,如果你不处理字符串中的所有内容,你可以更容易地识别它。

于 2012-05-19T23:55:22.283 回答
0
String className=getClassName();//Get class name from user here
String fnName=getMethodName();//Get function name from user here

Class params[] = {};
Object paramsObj[] = {};

Class thisClass = Class.forName(className);// get the Class

Object inst = thisClass.newInstance();// get an instance
// get the method
Method fn = thisClass.getDeclaredMethod(fnName, params);
// call the method
fn.invoke(inst, paramsObj);
于 2012-05-19T18:21:33.447 回答
0

您问题下方的评论是正确的-您的代码非常粗糙。

无论如何,如果您有类似的方法

public void doSomething(String str) {
  if (str.equals("whatever")) {
    // do something
  }
}

然后像这样称呼它

doSomething("whatever");
于 2012-05-19T18:22:42.083 回答