I'm currently trying to build a simple chess piece movement program. I read in the chess movement notation from a text file. The chess notation goes something like this:
plb1 c3 = (p)pawn(l)white moves from position b1(b1) to position c3(c3). my regex then parses the move.
In the code I match various pieces and print out their various movements. What I want to do is break my moveBetter() method into mutliple smaller methods such as a findPiece() or findColor() methods.
The problem is, everytime I try to break up the methods, they don't work or i'm told i have to make the method static and that breaks it further. How do I split moveBetter() into multiple methods?
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");
}
}
}
}
Don't call movePiece
from your static main
method. define a ChessEngine
class or something, instantiate one in your main method, and then have that ChessEngine
object handle all of the logic. Then you can split up your method as suggested in the other answers/comments.