0

私は現在、単純なチェスの駒の動きのプログラムを構築しようとしています。テキスト ファイルからチェスの動きの表記を読み込みました。チェスの記法は次のようになります。

plb1 c3 = (p)pawn(l)white は位置 b1(b1) から位置 c3(c3) に移動します。私の正規表現は移動を解析します。

コードでは、さまざまなピースを一致させ、さまざまな動きを出力します。私がやりたいのは、moveBetter()メソッドを、findPiece() メソッドやfindColor()メソッドなどの複数の小さなメソッドに分割することです。

問題は、メソッドを分割しようとするたびに、メソッドが機能しないか、メソッドを静的にする必要があると言われ、それがさらに壊れることです。moveBetter() を複数のメソッドに分割するにはどうすればよいですか?

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SuperiorFileIO {

public static void main(String[] args) throws IOException {
    moveBetter();
}

public static void moveBetter() throws IOException
{
    String piece = " "; //group1
    String color = " "; //group2
    String position = " "; //group3
    String position2 = " "; //group4
    String capture = " "; //group5
    //or 
    String kingPos1 = "";//6
    String kingPos2 = "";//7
    String rookPos1 = "";//8
    String rookPos2 = "";//9

    ReadFile readFile = new ReadFile();     
    String input = readFile.readTextFile("TestMoves");


    Pattern matchingMoves = Pattern.compile("(q|k|b|p|n|r+)(l|d)(\\w\\d) ?(\\w\\d)?([*])?|(\\w\\d) (\\w\\d) (\\w\\d) (\\w\\d)");
    Matcher m1 = matchingMoves.matcher(input);

    while (m1.find())
    {
        //find piece
            if(m1.group(6) != null && m1.group(6).matches("(\\w\\d)")) //castling part 1
                kingPos1 = m1.group(6);
            else if (m1.group(1).equals("q"))
                piece = "Queen";
            else if (m1.group(1).equals("k"))
                piece = "King";
            else if (m1.group(1).equals("b"))
                piece = "Bishop";
            else if (m1.group(1).equals("p"))
                piece = "Pawn";
            else if (m1.group(1).equals("n"))
                piece = "Knight";
            else if (m1.group(1).matches("(q|k|b|p|n|r+)") &&  m1.group(1).equals("r"))
                piece = "Rook";
            else {
                System.out.println("PIECE FAILED");
                piece = "piece Failed";
            }
        //find color
            if(m1.group(7) != null && m1.group(7).matches("(\\w\\d)")) //castling part 2
                kingPos2 = m1.group(7);
            else if(m1.group(2).equals("d"))
                color = "Black";
            else if(m1.group(2).matches("(l|d)") && m1.group(2).equals("l"))
                color = "White";
            else {
                System.out.println("COLOR FAILED");
                piece = "color Failed";
            }
        //set starting position
            if (m1.group(7) != null && m1.group(7).matches("(\\w\\d)") )
            rookPos1 = m1.group(7); //castling part 3
            else
                position = m1.group(3);
        //Castling
            if (m1.group(8) != null && m1.group(9) != null && m1.group(8).matches("(\\w\\d)") && m1.group(9).matches("(\\w\\d)"))
            {
                rookPos1 = m1.group(8);
                rookPos2 = m1.group(9);
                System.out.println("The king moves from " + kingPos1 + " to " + kingPos2 + " while the rook moves from " + rookPos1 + " to " + rookPos2);   
            }
        //if the player does not move // finds a piece
            else if (m1.group(4) == null)
                System.out.println("The " + color + " " + piece + " resides at " + position);           

        //set ending position
            else if (m1.group(4) != null && m1.group(5) == null)
            {
                position2 = m1.group(4);
                System.out.println("The " + color + " " + piece + " moves from " + position + " to " + position2);
            }
        //set ending position and capture
            else if (m1.group(4) != null && m1.group(5) != null)
            {
                //System.out.println("capture occured");
                position2 = m1.group(4);
                capture = m1.group(5); //unused
                System.out.println("The " + color + " " + piece + " moves from " + position + " to " + position2  + " and captures the piece on " + position2);
            }

            else {
                System.out.println("PARSE ERROR");
            }
    }


}

}

4

3 に答える 3

1

movePiece静的mainメソッドから呼び出さないでください。ChessEngineクラスまたは何かを定義し、メイン メソッドでインスタンス化してから、そのChessEngineオブジェクトにすべてのロジックを処理させます。次に、他の回答/コメントで提案されているように、メソッドを分割できます。

于 2013-11-14T20:35:24.150 に答える
0

次の基本的な例を考えてみましょう。

public static void moveBetter() throws IOException
{
    String piece = "pluto";
    piece = "goofy";
}

これを 2 つの方法に分割するには、次のことを行う必要があります。

1.変数を取り出してmoveBetterの外に置く

string piece;

public static void moveBetter() throws IOException
{
    piece = "pluto";
    piece = "goofy";
}

2.静的メソッド(moveBetterなど)は非静的変数または非静的メソッドにアクセスできないため、変数を静的として定義します

static string piece;

3.新しいメソッドを作成し、その中にコードを移動します。moveBetter によってアクセスされるためには、新しいメソッドも静的でなければならないことを覚えておいてください

string static piece;

public static void moveBetter() throws IOException
{
    piece = "pluto";
    assignGoofy();
}

public static void assignGoofy()
{
    piece = "goofy";
}
于 2013-11-14T20:37:59.347 に答える