-1

ゲームを作ろうと思っているので、自分も手伝いたいので、ユーザーファイルを作成するファイルを作りました。ログイン名、表示名、およびパスワードを書き込むログインがあります。ログイン名にちなんで名付けられたファイルに書き込みます。

今度は、Java を使用してログイン スクリプトも作成したいと思います。具体的には、行の読み方と入力済みのパスワードを知りたいです。

ファイルを作成するときに、パスワードを「playerPass」として1回、「currPass」として2回保存するようにしています。これにより、パスワードを変更する予定がある場合(ログインスクリプトから使用します)、 currPass は、playerPass 変数を使用して正しいパスワードとして読み取られます。とにかく、BufferedReader と FileReader を使用して、パスワードと現在のパスワードを示す行を読み取って、ログインできるようにしたいと思います。

誰かがこれで私を大いに助けてくれますか? 私はまだ、ある程度初心者です。

PS。コードを微調整できます。コードの書き方について少し説明が必要です笑。

変数:

playerLogName
playerName
playerPass
currPass

ファイル名:

Login.java
CharacterFileCreator.java

追加を行い、半分は機能しましたが、パスワードを入力した後、間違っているか正しいかに関係なく、(Dr. Java を使用して) ロックされ、System.out.println() は実行されません。間違っています。それを確認してください:

import java.util.Scanner;
import java.io.BufferedWriter;
import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.FileReader;
import java.io.IOException;
import java.io.FileNotFoundException;

class Login {

  public static void LogIn(){
    boolean loggedIn = false;
    loggedIn = true;
    System.out.println("You are now logged in!");
  }

  public static void main(String[] args) {  
    System.out.println("What is your login name?");
    Scanner charLogName = new Scanner(System.in);
    String playerLogName = charLogName.nextLine();
    boolean charFileFound = false;
    BufferedReader characterfile = null;

    try {
      characterfile = new BufferedReader(new FileReader("./game/characters/" + playerLogName + ".txt"));
      charFileFound = true;
    }
    catch (FileNotFoundException fileex1) {}
    if(charFileFound == false){
      System.out.println("Login name does not exist!");
    }
    else
    {
      System.out.println(playerLogName + ": is your username, what is your password?");
      Scanner charPassword = new Scanner(System.in);
      String playerPass = charPassword.nextLine();
      String line = "";
      String token = "";
      String token2 = "";
      int ReadMode = 0;
      try {
        line = characterfile.readLine();
      } catch (IOException ioexception) {
        System.out.println(playerLogName + ": error loading file.");
      }
      while (line != null) {
        line = line.trim();
        int spot = line.indexOf("=");
        if (spot > -1) {
          token = line.substring(0, spot);
          token = token.trim();
          token2 = line.substring(spot + 1);
          token2 = token2.trim();
          switch (ReadMode) {
            case 1:
              if (token.equals("character-password")) {
              if (playerPass.equals(token2)) {
                LogIn();
              } else {
                System.out.println("You entered an incorrect password!");
              }
              break;
            }
          }
        }            else {
          if(line.equals("[ACCOUNT]")) {
            ReadMode = 1;
          }
          else if(line.equals("[EOF]")) {
            try {
              characterfile.close();
            } catch (IOException ioexception) {
            }
          }
        }
      }
    }
  }
}

編集:

サンプルファイル:

[ACCOUNT]
character-loginname = SampleFile
character-password = samplepassword
[EOF]
4

1 に答える 1

0

おそらく、プロパティ ファイルを使用する方が簡単でしょう! 任意のファイル拡張子を付けたり、必要に応じて暗号化することもできますが、Properties オブジェクトを使用すると、行番号に関係なく任意のプロパティを取得または設定できます。

ここで例を見てください: http://www.exampledepot.com/egs/java.util/Props.html

更新: 私はあなたの問題を発見しました - あなたは whileループ内のファイルの次の行を決して読んでいないので、おそらくSystem.out.println(line);ループ内のどこかに置くと "[ACCOUNT]" - 最初の行を表示し続けるでしょう.あなたのファイルの!

この問題を解決するために、ループ全体をtry catchステートメントに入れ、条件を に変更する傾向があるかもしれませんwhile((line = characterfile.readLine()) != null)。このように、すべてのループで次の行が使用されますが、状況によっては例外をキャッチするという点で問題が生じる可能性があります。

または、ステートメントで1 にline = characterfile.readLine();設定した後に、テスト時に else ステートメントとして追加することもできます....ReadModeif(line.equals("[ACCOUNT]"))if (token.equals("character-password"))

ただし、私のアドバイスに従ってファイルを使用する場合は、リンクの例のPropertiesように呼び出すだけで文字データを取得するためにループを実行する必要はありません。password = propertyObject.getyProperty("password")

HTH

于 2011-12-17T11:15:26.483 に答える