10 Commits
e234eb2e50
...
4ef75e249b
6 changed files with 488 additions and 11 deletions
-
247src/main/java/Game/Chess.java
-
34src/main/java/Game/ChessObj/ChessBoard.java
-
2src/main/java/Game/ChessObj/ChessFigure.java
-
64src/test/java/Game/ChessObj/ChessBoardTest.java
-
2src/test/java/Game/ChessObj/ChessFigureTest.java
-
132src/test/java/Game/ChessTest.java
@ -0,0 +1,247 @@ |
|||||
|
package Game; |
||||
|
|
||||
|
import Game.ChessObj.ChessBoard; |
||||
|
import Game.ChessObj.ChessFigure; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
|
||||
|
public class Chess extends Game { |
||||
|
|
||||
|
private int[] firstTurn; |
||||
|
private ChessFigure.Team currentTeam; |
||||
|
|
||||
|
private ArrayList<ChessFigure> destroyedWhiteFigures; |
||||
|
private ArrayList<ChessFigure> destroyedBlackFigures; |
||||
|
|
||||
|
private ChessBoard.MoveFeedback lastFeedback; |
||||
|
|
||||
|
private ChessBoard chessBoard; |
||||
|
|
||||
|
public Chess() { |
||||
|
init(); |
||||
|
} |
||||
|
|
||||
|
private void init() { |
||||
|
resetGame(); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void update(String input) { |
||||
|
outputBuffer.clear(); |
||||
|
ArrayList<String> footer = new ArrayList<>(); |
||||
|
|
||||
|
if (isFinished()) { |
||||
|
resetGame(); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
int[] coords = convertInput(input); |
||||
|
|
||||
|
if (coords == null) { |
||||
|
footer.add("Invalid Input!"); |
||||
|
firstTurn = null; |
||||
|
} else { |
||||
|
if (firstTurn == null) { |
||||
|
firstTurn = coords; |
||||
|
if (getChessBoard().getBoard()[firstTurn[1]][firstTurn[0]] != null) { |
||||
|
if (getChessBoard().getBoard()[firstTurn[1]][firstTurn[0]].getTeam() == currentTeam) { |
||||
|
String firstCoords = (char) (firstTurn[0] + 97) + "" + (firstTurn[1] + 1); |
||||
|
footer.add("Currently selected cell: " + firstCoords); |
||||
|
} else { |
||||
|
footer.add("It's " + currentTeam.name() + "'s turn "); |
||||
|
firstTurn = null; |
||||
|
} |
||||
|
} else { |
||||
|
footer.add("Can't select empty cell"); |
||||
|
firstTurn = null; |
||||
|
} |
||||
|
} else { |
||||
|
footer = makeMove(firstTurn, coords); |
||||
|
if(lastFeedback != ChessBoard.MoveFeedback.INVALID && lastFeedback != ChessBoard.MoveFeedback.OUTSIDEOFBOARD) |
||||
|
switchCurrentTeam(); |
||||
|
firstTurn = null; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (chessBoard.scanForOccurringFigure(ChessFigure.Type.KING, ChessFigure.Team.WHITE) == 0) { |
||||
|
footer.add("Black has Won!"); |
||||
|
footer.add("Press any key to restart game"); |
||||
|
setFinished(true); |
||||
|
} |
||||
|
if (chessBoard.scanForOccurringFigure(ChessFigure.Type.KING, ChessFigure.Team.BLACK) == 0) { |
||||
|
footer.add("White has Won!"); |
||||
|
footer.add("Press any key to restart game"); |
||||
|
setFinished(true); |
||||
|
} |
||||
|
|
||||
|
outputBuffer.addAll(getHeader()); |
||||
|
outputBuffer.addAll(getUpdatedOutputBoard(destroyedWhiteFigures, destroyedBlackFigures)); |
||||
|
outputBuffer.addAll(footer); |
||||
|
|
||||
|
} |
||||
|
|
||||
|
private ArrayList<String> getHeader() { |
||||
|
ArrayList<String> header = new ArrayList<>(); |
||||
|
|
||||
|
header.add("Welcome to the good old game Chess!"); |
||||
|
header.add("First select one cell like: 'e7', than confirm it with an enter."); |
||||
|
header.add("After that, select a second cell and also confirm it with an enter."); |
||||
|
header.add("The Goal is to defeat the other teams King(K)."); |
||||
|
header.add(""); |
||||
|
header.add("It's your Turn " + currentTeam.name().toLowerCase() + "."); |
||||
|
|
||||
|
return header; |
||||
|
} |
||||
|
|
||||
|
//int[0] = x, int[1] = y; |
||||
|
public int[] convertInput(String input) { |
||||
|
int[] temp = new int[2]; |
||||
|
|
||||
|
//input is not 2 chars big |
||||
|
if (input.length() != 2) |
||||
|
return null; |
||||
|
char[] symbols = input.toCharArray(); |
||||
|
int counterDigit = 0; |
||||
|
int counterChar = 0; |
||||
|
//input contains one number and one char |
||||
|
for (char x : symbols) { |
||||
|
if (Character.isDigit(x)) { |
||||
|
counterDigit++; |
||||
|
temp[1] = Character.getNumericValue(x) - 1; |
||||
|
} |
||||
|
if (Character.isAlphabetic(x)) { |
||||
|
counterChar++; |
||||
|
temp[0] = x; |
||||
|
} |
||||
|
} |
||||
|
if (counterChar != 1 || counterDigit != 1) |
||||
|
return null; |
||||
|
|
||||
|
temp[0] = Character.toLowerCase(temp[0]) - 97; |
||||
|
if (!chessBoard.isCellInBoard(temp[0], temp[1])) |
||||
|
return null; |
||||
|
else |
||||
|
return temp; |
||||
|
} |
||||
|
|
||||
|
public ArrayList<String> makeMove(int[] source, int[] target) { |
||||
|
ArrayList<String> result = new ArrayList<>(); |
||||
|
ChessFigure sourceFigure = chessBoard.getBoard()[source[1]][source[0]]; |
||||
|
ChessFigure targetFigure = chessBoard.getBoard()[target[1]][target[0]]; |
||||
|
String sourceFigureName = "<NOT FOUND>"; |
||||
|
String targetFigureName = "<NOT FOUND>"; |
||||
|
String sourceCoords = (char) (source[0] + 97) + "" + (source[1] + 1); |
||||
|
String targetCoords = (char) (target[0] + 97) + "" + (target[1] + 1); |
||||
|
|
||||
|
ChessBoard.MoveFeedback moveFeedback = chessBoard.moveFigure(source[0], source[1], target[0], target[1]); |
||||
|
lastFeedback = moveFeedback; |
||||
|
|
||||
|
if (sourceFigure != null) |
||||
|
sourceFigureName = sourceFigure.getTeam().name().toCharArray()[0] + sourceFigure.getTeam().name().substring(1).toLowerCase() + " " + sourceFigure.getType().name().toLowerCase(); |
||||
|
if (targetFigure != null) |
||||
|
targetFigureName = targetFigure.getTeam().name().toLowerCase() + " " + targetFigure.getType().name().toLowerCase(); |
||||
|
|
||||
|
if (moveFeedback == ChessBoard.MoveFeedback.MOVE) { |
||||
|
result.add("Successfully moved " + sourceFigureName.toLowerCase() + " from " + sourceCoords + " to " + targetCoords); |
||||
|
} else if (moveFeedback == ChessBoard.MoveFeedback.ENEMYBEATEN) { |
||||
|
result.add(sourceFigureName + " successfully beat " + targetFigureName.toLowerCase() + " at " + targetCoords); |
||||
|
if (targetFigure.getTeam() == ChessFigure.Team.WHITE) |
||||
|
getDestroyedWhiteFigures().add(targetFigure); |
||||
|
else |
||||
|
getDestroyedBlackFigures().add(targetFigure); |
||||
|
} else { |
||||
|
result.add("Invalid input!"); |
||||
|
switch (moveFeedback) { |
||||
|
case INVALID: |
||||
|
if (targetFigure != null) |
||||
|
if (targetFigure.getTeam() == sourceFigure.getTeam()) |
||||
|
result.add("You are on the same Team! [" + getCurrentTeam().name() + "]"); |
||||
|
break; |
||||
|
case OUTSIDEOFBOARD: |
||||
|
result.add("Input is not inside the board!"); |
||||
|
break; |
||||
|
default: |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
private ArrayList<String> getUpdatedOutputBoard(ArrayList<ChessFigure> whiteFigures, ArrayList<ChessFigure> blackFigures) { |
||||
|
ArrayList<String> updatedOutputBoard = chessBoard.getOutputBoard(); |
||||
|
ArrayList<String> sidebarWhiteFigures = getSidebarFigures(whiteFigures, 5); |
||||
|
ArrayList<String> sidebarBlackFigures = getSidebarFigures(blackFigures, 5); |
||||
|
|
||||
|
for (int i = 0; i < sidebarWhiteFigures.size(); i++) { |
||||
|
int index = i + 3; |
||||
|
updatedOutputBoard.set(index, updatedOutputBoard.get(index) + sidebarWhiteFigures.get(i)); |
||||
|
} |
||||
|
|
||||
|
for (int i = 0; i < sidebarBlackFigures.size(); i++) { |
||||
|
int index = updatedOutputBoard.size() - (i + 3); |
||||
|
updatedOutputBoard.set(index, updatedOutputBoard.get(index) + sidebarBlackFigures.get(i)); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
return updatedOutputBoard; |
||||
|
} |
||||
|
|
||||
|
public ArrayList<String> getSidebarFigures(ArrayList<ChessFigure> chessFigureArrayList, int maxPerLine) { |
||||
|
ArrayList<String> result = new ArrayList<>(); |
||||
|
String line = ""; |
||||
|
int counter = 0; |
||||
|
|
||||
|
for (int i = 0; i < chessFigureArrayList.size(); i++) { |
||||
|
if (i == chessFigureArrayList.size() - 1) { |
||||
|
line += chessFigureArrayList.get(i).getSymbol() + ""; |
||||
|
result.add(line); |
||||
|
return result; |
||||
|
} |
||||
|
line += chessFigureArrayList.get(i).getSymbol() + ","; |
||||
|
counter++; |
||||
|
if (counter >= maxPerLine) { |
||||
|
result.add(line); |
||||
|
line = ""; |
||||
|
counter = 0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return result; |
||||
|
} |
||||
|
|
||||
|
private void switchCurrentTeam() { |
||||
|
if (currentTeam == ChessFigure.Team.WHITE) |
||||
|
currentTeam = ChessFigure.Team.BLACK; |
||||
|
else |
||||
|
currentTeam = ChessFigure.Team.WHITE; |
||||
|
} |
||||
|
|
||||
|
public void resetGame() { |
||||
|
chessBoard = new ChessBoard(); |
||||
|
firstTurn = null; |
||||
|
currentTeam = ChessFigure.Team.WHITE; |
||||
|
destroyedWhiteFigures = new ArrayList<>(); |
||||
|
destroyedBlackFigures = new ArrayList<>(); |
||||
|
setFinished(false); |
||||
|
outputBuffer.clear(); |
||||
|
outputBuffer.addAll(getHeader()); |
||||
|
outputBuffer.addAll(chessBoard.getOutputBoard()); |
||||
|
} |
||||
|
|
||||
|
public ChessBoard getChessBoard() { |
||||
|
return this.chessBoard; |
||||
|
} |
||||
|
|
||||
|
public ChessFigure.Team getCurrentTeam() { |
||||
|
return this.currentTeam; |
||||
|
} |
||||
|
|
||||
|
public ArrayList<ChessFigure> getDestroyedWhiteFigures() { |
||||
|
return destroyedWhiteFigures; |
||||
|
} |
||||
|
|
||||
|
public ArrayList<ChessFigure> getDestroyedBlackFigures() { |
||||
|
return destroyedBlackFigures; |
||||
|
} |
||||
|
|
||||
|
} |
@ -0,0 +1,132 @@ |
|||||
|
package Game; |
||||
|
|
||||
|
import Game.ChessObj.ChessFigure; |
||||
|
import org.junit.jupiter.api.AfterEach; |
||||
|
import org.junit.jupiter.api.BeforeEach; |
||||
|
import org.junit.jupiter.api.Test; |
||||
|
|
||||
|
import java.util.ArrayList; |
||||
|
|
||||
|
import static org.junit.jupiter.api.Assertions.*; |
||||
|
|
||||
|
class ChessTest { |
||||
|
|
||||
|
Chess chess; |
||||
|
|
||||
|
@BeforeEach |
||||
|
void setUp() { |
||||
|
chess = new Chess(); |
||||
|
} |
||||
|
|
||||
|
@AfterEach |
||||
|
void tearDown() { |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void convertInput() { |
||||
|
int[] test1 = {0, 0}; |
||||
|
int[] test2 = {7, 7}; |
||||
|
int[] test3 = {6, 2}; |
||||
|
|
||||
|
assertNull(chess.convertInput("0g2")); |
||||
|
assertNull(chess.convertInput("25")); |
||||
|
assertNull(chess.convertInput("bg")); |
||||
|
assertNull(chess.convertInput("9b")); |
||||
|
assertNull(chess.convertInput("2i")); |
||||
|
|
||||
|
assertArrayEquals(chess.convertInput("1a"), test1); |
||||
|
assertArrayEquals((chess.convertInput("a1")), test1); |
||||
|
assertArrayEquals((chess.convertInput("8h")), test2); |
||||
|
assertArrayEquals((chess.convertInput("h8")), test2); |
||||
|
|
||||
|
assertArrayEquals((chess.convertInput("3G")), test3); |
||||
|
assertArrayEquals((chess.convertInput("G3")), test3); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void getSidebarFigures() { |
||||
|
ArrayList<ChessFigure> array1 = new ArrayList<>(); |
||||
|
ArrayList<ChessFigure> array2 = new ArrayList<>(); |
||||
|
ArrayList<ChessFigure> array3 = new ArrayList<>(); |
||||
|
ArrayList<String> expectedArray2 = new ArrayList<>(); |
||||
|
ArrayList<String> expectedArray3 = new ArrayList<>(); |
||||
|
|
||||
|
array2.add(new ChessFigure(ChessFigure.Type.PAWN, ChessFigure.Team.WHITE)); |
||||
|
array2.add(new ChessFigure(ChessFigure.Type.BISHOP, ChessFigure.Team.WHITE)); |
||||
|
array2.add(new ChessFigure(ChessFigure.Type.PAWN, ChessFigure.Team.WHITE)); |
||||
|
array2.add(new ChessFigure(ChessFigure.Type.PAWN, ChessFigure.Team.WHITE)); |
||||
|
array2.add(new ChessFigure(ChessFigure.Type.CASTLE, ChessFigure.Team.WHITE)); |
||||
|
array2.add(new ChessFigure(ChessFigure.Type.PAWN, ChessFigure.Team.WHITE)); |
||||
|
|
||||
|
expectedArray2.add(" o , I , o , o , T ,"); |
||||
|
expectedArray2.add(" o "); |
||||
|
|
||||
|
array3.add(new ChessFigure(ChessFigure.Type.QUEEN, ChessFigure.Team.BLACK)); |
||||
|
array3.add(new ChessFigure(ChessFigure.Type.PAWN, ChessFigure.Team.BLACK)); |
||||
|
array3.add(new ChessFigure(ChessFigure.Type.KING, ChessFigure.Team.BLACK)); |
||||
|
array3.add(new ChessFigure(ChessFigure.Type.PAWN, ChessFigure.Team.BLACK)); |
||||
|
|
||||
|
expectedArray3.add("|Q|,|o|,|K|,|o|"); |
||||
|
|
||||
|
assertEquals(0, chess.getSidebarFigures(array1, 5).size()); |
||||
|
assertEquals(expectedArray2, chess.getSidebarFigures(array2, 5)); |
||||
|
assertEquals(expectedArray3, chess.getSidebarFigures(array3, 5)); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void makeMove() { |
||||
|
int countBlackPawns = chess.getChessBoard().scanForOccurringFigure(ChessFigure.Type.PAWN, ChessFigure.Team.BLACK); |
||||
|
int countWhiteBishops = chess.getChessBoard().scanForOccurringFigure(ChessFigure.Type.BISHOP, ChessFigure.Team.WHITE); |
||||
|
chess.makeMove(chess.convertInput("a2"), chess.convertInput("a3")); |
||||
|
chess.makeMove(chess.convertInput("e7"), chess.convertInput("e6")); |
||||
|
chess.makeMove(chess.convertInput("f8"), chess.convertInput("a3")); |
||||
|
chess.makeMove(chess.convertInput("b2"), chess.convertInput("a3")); |
||||
|
|
||||
|
assertEquals(countBlackPawns - 1, chess.getChessBoard().scanForOccurringFigure(ChessFigure.Type.PAWN, ChessFigure.Team.BLACK)); |
||||
|
assertEquals(countWhiteBishops - 1, chess.getChessBoard().scanForOccurringFigure(ChessFigure.Type.BISHOP, ChessFigure.Team.WHITE)); |
||||
|
} |
||||
|
|
||||
|
@Test |
||||
|
void update() { |
||||
|
//starting team = White |
||||
|
assertEquals(chess.getCurrentTeam(), ChessFigure.Team.WHITE); |
||||
|
|
||||
|
//Emtpy cell |
||||
|
chess.update("d7"); |
||||
|
chess.update("g5"); |
||||
|
assertEquals(chess.getCurrentTeam(), ChessFigure.Team.WHITE); |
||||
|
|
||||
|
chess.update("7b"); |
||||
|
chess.update("6b"); |
||||
|
assertEquals(chess.getCurrentTeam(), ChessFigure.Team.BLACK); |
||||
|
|
||||
|
chess.update("e2"); |
||||
|
chess.update("e3"); |
||||
|
assertEquals(chess.getCurrentTeam(), ChessFigure.Team.WHITE); |
||||
|
|
||||
|
chess.update("6b"); |
||||
|
chess.update("5b"); |
||||
|
assertEquals(chess.getCurrentTeam(), ChessFigure.Team.BLACK); |
||||
|
|
||||
|
//Defeat enemy |
||||
|
chess.update("f1"); |
||||
|
chess.update("b5"); |
||||
|
assertEquals(7, chess.getChessBoard().scanForOccurringFigure(ChessFigure.Type.PAWN, ChessFigure.Team.WHITE)); |
||||
|
assertEquals(chess.getCurrentTeam(), ChessFigure.Team.WHITE); |
||||
|
|
||||
|
chess.update("d7"); |
||||
|
chess.update("d6"); |
||||
|
assertEquals(chess.getCurrentTeam(), ChessFigure.Team.BLACK); |
||||
|
|
||||
|
//Invalid Move |
||||
|
chess.update("5b"); |
||||
|
chess.update("a5"); |
||||
|
assertEquals(chess.getCurrentTeam(), ChessFigure.Team.BLACK); |
||||
|
|
||||
|
//King defeated |
||||
|
chess.update("5b"); |
||||
|
chess.update("e8"); |
||||
|
|
||||
|
assertTrue(chess.isFinished()); |
||||
|
} |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue