我目前正在尝试建立一个简单的棋子运动程序。我从文本文件中读取了国际象棋运动表示法。国际象棋符号是这样的:
plb1 c3 =(p)pawn(l)白色从位置b1(b1)移动到位置c3(c3)。 我的正则表达式然后解析移动。
在代码中我匹配各种部分并打印出各种动作。我想要做的是将我的 moveBetter()方法分解为mutliple较小的方法,例如 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");
}
}
}
}
答案 0 :(得分:1)
请勿使用静态movePiece
方法致电main
。定义一个ChessEngine
类或其他东西,在main方法中实例化一个,然后让ChessEngine
对象处理所有逻辑。然后,您可以按照其他答案/评论中的建议拆分您的方法。
答案 1 :(得分:0)
你可以这样做:
public static void main(String[] args) throws IOException
{
findPiece();
findColor();
}
private static void findPiece()
{
//Code
}
private static void findColor()
{
//Code
}
方法可见性可以是私有的,也可以是公共的,具体取决于您希望如何使用它,我更倾向于私有这些方法。
findPiece():
while(m1.find())
{
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";
}
}
对于其他方法几乎相同,循环和复制粘贴您要执行的部分。 虽然如果在另一种方法中需要每种方法中的代码,那么拆分它将无法正常工作
答案 2 :(得分:0)
考虑这个基本的例子:
public static void moveBetter() throws IOException
{
String piece = "pluto";
piece = "goofy";
}
为了将其拆分为两种方法,您必须:
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";
}