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が小文字 になっていることに注意してください。PublicP同じではありませんpublic

Stringクラスには大文字があるSことにも注意してstringくださいString

さらに、使用する必要がなかったことに注意してくださいString string = new String("string")。使用できますString string = "string"。この構文はより高速に実行され、読みやすくなっています。

String.equals文字列が等しいかどうかをテストするときは、代わりにを使用する必要があります==。これはa == b、オブジェクトの等価性 (つまり、メモリ内の同じ場所ab占める) をチェックし、メモリ内の場所に関係なく、同じ文字が同じ順序であるstringOne.equals(stringTwo)かどうかをチェックするためです。stringOnestringTwo

さて、あなたの質問に関しては、使用するオブジェクトを追跡するためにanEnumまたは a のいずれかを使用することをお勧めします。Map

例えば:

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

あなたの質問の下のコメントは本当です-あなたのコードは非常にラフです。

とにかく、あなたがのような方法を持っているなら

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

それからそれを次のように呼びます

doSomething("whatever");
于 2012-05-19T18:22:42.083 に答える
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

Java では、多くのクラスに属性があり、多くの場合、同じクラスから複数のインスタンスを作成できます。

どちらがどちらであるかを名前でどのように識別しますか?

例えば

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

モンスターは属性を持つことができ、そのうちの 1 つが死んでいる場合は、文字列ですべてを処理しない方が簡単に識別できます。

于 2012-05-19T23:55:22.283 に答える