-1

私はテキストベースのRPGを作成しています。メソッドの作成を手伝ってもらえますか?メソッドを作成する方法を学びたいので、"help" caseすべてのループにコピーアンドペーストする必要はありません。

これが私がメソッドに実行させたいことです:

string command;
while (command != "exit game")
 {
    command=Console.ReadLine();

     switch(command){
     case (help):
        Console.WriteLine("List of useableverbs and nouns");
        break;
    default:
        Console.WriteLine("Invalidcommand");
        break;
      }
    }

また、「ゲーム終了」がゲームを終了するように設定するにはどうすればよいですか?

私は数週間前にプログラミングを始めたので、助けていただければ幸いです

4

5 に答える 5

1

ここに方法があります:

void HandleCommand(string command)
{
    switch (command)
    {
        case (help):
           Console.WriteLine("List of useable verbs and nouns");
           break;
        default:
           Console.WriteLine("Invalid command");
           break;
    }
}

そしてそれを使用するには:

while (command != "exit game")
{
    command=Console.ReadLine();
    HandleCommand(command);
}
于 2013-02-11T14:06:17.143 に答える
1

メソッド内でこれを do として設定できます。メソッドは再利用可能なコードを作成します。これにより、同じロジックをコピーして貼り付ける必要がなくなります。コードをコピーして貼り付ける代わりに、(この場合) 経由でメソッドを呼び出すだけです。

CheckCommand();

メソッドは次のようになります...

private static void CheckCommand()
{
    string command;
    do
    {
        command = Console.ReadLine();
        switch (command)
        {
            case ("help"):
                Console.WriteLine("List of useable verbs and nouns");
                break;
            default:
                Console.WriteLine("Invalid command");
                break;
        }
    }
    while (command != "exit game");

}

これは、ユーザーが「ゲームを終了」と入力すると、ループが終了するように設定されています。別の注意として、このロジックを拡張する 1 つの良い方法は、大文字と小文字を区別しない比較を行うことです。

于 2013-02-11T14:08:10.707 に答える
0

help とい​​う名前の変数がない限り、変数を引用符で囲みます。いいえ:

case("help"):

書かれているように、「ゲームを終了」と入力すると、ループが中断され、ケースに入れた場合はコンソール ウィンドウが閉じます。ハードコードされた文字列の代わりに定数を使用するなど、よりクリーンになる可能性があります。

于 2013-02-11T14:07:11.743 に答える
0

C# では、見た目どおりにメソッドを作成します。ヘルプ テキストを表示したい場合、他のメソッド (おそらくメイン メソッド) の外側で、次の行に沿って何かを記述します。

static void ShowHelp() {
    Console.WriteLine("This is some text. Enter some command!");
    var command = Console.ReadLine();
    //Do other things
}

そして、そのテキストを表示したいときはいつでも、 で呼び出しますShowHelp()

于 2013-02-11T14:07:34.753 に答える
0

ブール変数を使用して、ゲームの終了をループに知らせることができます。コマンドはループ内で照会する必要があり、ループの開始時にコマンドがわからないため、ループ条件をループの最後に置きます。

bool doExit = false;
do {
    string command = Console.ReadLine().ToLower();
    switch (command) {
        case "exit":
        case "quit":
            doExit = true;
            break;
        case "otherCommand":
            HandleOtherCommand();
            break;
        case "?":
        case "h":
        case "help":
            PrintHelp();
            break;
        default:
            Console.WriteLine("Invalid command!");
            PrintHelp();
            break;
    } 
} while (!doExit);

ブール変数を使用すると、他の条件が満たされたときにゲームを簡単に終了できるという利点があります。たとえば、プレイヤーがゲームに勝ったり負けたりしたときなどです。


次にメソッドについて説明します。同じソース コード (Program.cs) 内にメソッドを配置したり、新しいクラスを作成したりできます。Program.cs 内で、次のように記述します。

private static void PrintHelp()
{
    Console.WriteLine("Valid commands:");
    Console.WriteLine("help, h, ?: Print this help.");
    Console.WriteLine("exit, quit: End this game.");
    Console.WriteLine("...");
}

Mainメソッドが静的であるため、この同じクラス内の他のメソッドも静的でなければならないことに注意してください。コマンド用に他のクラスを作成する場合は、静的クラスを作成するかどうかを選択できます。静的クラスは、メソッドを配置する場所にすぎません。

static class GameCommands
{
     // The `public` modifier makes it visible to other classes.
    public static void PrintHelp()
    {
        ...
    }

    public static void SomeOtherCommand()
    {
        ...
    }
}

このようなメソッドは、className.MethodName()構文で呼び出すことができます。

GameCommands.PrintHelp();

さまざまな状態を保存する必要がある場合 (スコアなど)。非静的クラスを作成するのが適切です。クラスインスタンスまたはオブジェクトと呼ばれるそのようなクラスのコピーを作成できます。これは実際にはクラスの状態のみをコピーし、メソッド コードはコピーしません。非静的メソッドは、この状態 (フィールド、プロパティ) に作用できます。

class Player
{
    // Constructor. Initializes an instance of the class (an object).
    public Player (string name)
    {
        Name = name;
    }

    // Property
    public int Score { get; private set; }

    // Property
    public string Name { get; private set; }

    // Instance method (non-static method) having a parameter.
    public void IncreaseScoreBy(int points)
    {
        Score += points;
    }

    public void PrintWinner()
    {
        Console.WriteLine("The winner is {0} with a score of {2} points." Name, Score);
    }
}

このようなクラスを使用できます

Player player1 = new Player("John"); // Pass an argument to the constructor.
Player player2 = new Player("Sue");

player1.IncreaseScoreBy(5);
player2.IncreaseScoreBy(100);

if (player1.Score > player2.Score) {
    player1.PrintWinner();
} else if (player2.Score > player1.Score)
    player2.PrintWinner();
} else {
    Console.WriteLine("The score is even!");
}

今まで戻り値のないメソッドを使っていました。これは、戻り値の型を置き換える void キーワードによって通知されます。

void MethodWithNoReturnValue() { ... }

戻り値がある場合 (つまり、メソッドが関数である場合)、戻り値の型を指定する必要があります。ステートメントはreturn関数を終了し、戻り値を指定します。

double Reciprocal(double x)
{
    return 1.0 / x;
}

同じクラス内でこのように呼び出します

double y = Reciprocal(x);

または、静的な場合はオブジェクト名またはクラス名を先頭に追加します。

于 2013-02-11T14:11:51.350 に答える