我是初学者程序员,这是我在这个论坛上的第一个问题。
我正在编写一个简单的文本冒险游戏,使用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,但是所有的例子对我来说都太过笼统,无法理解如何使用该函数。任何帮助将不胜感激,如果有任何其他必要的信息(如更多示例代码),我很乐意提供它。
-Sebastien
以下是完整代码:
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;
}
}
答案 0 :(得分:3)
看到你对编程很新,我建议从一些比完整的冒险游戏更简单的程序开始。您还没有完全掌握Java语法的一些基础知识。以HelloWorld计划为例:
public class HelloWorld {
public static void main(String[] args) {
String output = "Hello World!"
System.out.println(output);
}
}
请注意public
是小写的。资本Public
的{{1}}与P
不同。
另请注意,public
类的资本为String
。*同样,大写也很重要,因此S
与string
不同。
此外,请注意我不必使用String
。您可以使用String string = new String("string")
。此语法运行速度更快,更易于阅读。
在测试字符串相等性时,您需要使用String string = "string"
而不是String.equals
。这是因为==
检查对象相等性(即a == b
和a
占用内存中的相同位置)并b
检查stringOne.equals(stringTwo)
是否具有相同的位置字符与stringOne
的顺序相同,无论它们在内存中的位置如何。
现在,关于您的问题,我建议您使用stringTwo
或Enum
来跟踪要使用的对象。
例如:
Map
*这是格式化Java代码的标准方法。类名称为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");
}
}
,而变量名称为PascalCased
。
答案 1 :(得分: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);
答案 2 :(得分:0)
您的问题下面的评论是真实的 - 您的代码非常粗糙。
无论如何,如果你有像
这样的方法public void doSomething(String str) {
if (str.equals("whatever")) {
// do something
}
}
然后将其称为
doSomething("whatever");
答案 3 :(得分: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 ());
}
// ...
}
怪物可以拥有属性,如果其中一个已经死亡,如果你不处理Strings中的所有内容,你可以更容易识别它。