Skip to content

Feature/add two player mode #32

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 5 additions & 3 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,10 @@ repositories {
mavenCentral()
}

dependencies {
testImplementation group: 'junit', name: 'junit', version: '4.12'
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'

testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.2'
implementation 'javax.xml.bind:jaxb-api:2.3.1'

implementation 'commons-cli:commons-cli:1.4'
Expand Down Expand Up @@ -58,7 +60,7 @@ test {
testLogging {
showStandardStreams = true
}

useJUnitPlatform()
finalizedBy jacocoTestReport
}

Expand Down
234 changes: 205 additions & 29 deletions src/main/java/pl/nogacz/checkers/board/Board.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.control.Alert;
import javafx.scene.control.ButtonType;
import pl.nogacz.checkers.application.Design;
import pl.nogacz.checkers.application.Computer;
import pl.nogacz.checkers.application.EndGame;
Expand All @@ -18,6 +20,8 @@
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Optional;
import java.util.Arrays;

/**
* @author Dawid Nogacz on 17.05.2019
Expand All @@ -28,6 +32,8 @@ public class Board {
private boolean isSelected = false;
private boolean newKick = false;
private Coordinates selectedCoordinates;
private boolean vsPlayer = false;
private boolean vsComputer = false;

private Set<Coordinates> possibleMoves = new HashSet<>();
private Set<Coordinates> possibleKick = new HashSet<>();
Expand All @@ -37,10 +43,41 @@ public class Board {
private int roundWithoutKick = 0;

private boolean isComputerRound = false;
private boolean isBlackRound = false;
private boolean isWhiteRound = true;
private Computer computer = new Computer();
private boolean isTest = false;

public Board() {
addStartPawn();
Alert alert = new Alert(Alert.AlertType.NONE);
alert.setTitle("JavaCheckers");
alert.setContentText("Choose game mode");

ButtonType ComputerButton = new ButtonType("vs Computer");
ButtonType PlayerButton = new ButtonType("vs Player");

alert.getButtonTypes().setAll(ComputerButton, PlayerButton);

Optional<ButtonType> result = alert.showAndWait();

if (result.get() == ComputerButton)
vsComputer = true;
else if(result.get() == PlayerButton)
vsPlayer = true;

else
System.exit(0);
}

public Board(int gamemode){
isTest = true;
addStartPawn();
if(gamemode == 0)
vsComputer = true;
else
vsPlayer = true;

}

public static HashMap<Coordinates, PawnClass> getBoard() {
Expand Down Expand Up @@ -73,55 +110,67 @@ private void addStartPawn() {
board.put(new Coordinates(2, 7), new PawnClass(Pawn.PAWN, PawnColor.WHITE));
board.put(new Coordinates(4, 7), new PawnClass(Pawn.PAWN, PawnColor.WHITE));
board.put(new Coordinates(6, 7), new PawnClass(Pawn.PAWN, PawnColor.WHITE));

for(Map.Entry<Coordinates, PawnClass> entry : board.entrySet()) {
Design.addPawn(entry.getKey(), entry.getValue());
if(!isTest){
for(Map.Entry<Coordinates, PawnClass> entry : board.entrySet()) {
Design.addPawn(entry.getKey(), entry.getValue());
}
}
}

public void readMouseEvent(MouseEvent event) {
Coordinates eventCoordinates = new Coordinates((int) ((event.getX() - 37) / 85), (int) ((event.getY() - 37) / 85));
handleMouse(eventCoordinates);
}

public void handleMouse(Coordinates c){
if(vsComputer){
handleRoundvsComputer(c);
}

else if(vsPlayer){
handleRoundvsPlayer(c);
}
}

private void handleRoundvsComputer(Coordinates c){
if(isComputerRound) {
return;
}

checkGameEnd();

if(isGameEnd) {
return;
}

Coordinates eventCoordinates = new Coordinates((int) ((event.getX() - 37) / 85), (int) ((event.getY() - 37) / 85));

Coordinates eventCoordinates = c;
if(isSelected) {
if(selectedCoordinates.equals(eventCoordinates) && !newKick) {
unLightSelect(selectedCoordinates);

selectedCoordinates = null;
isSelected = false;
} else if(possibleMoves.contains(eventCoordinates)) {
}
else if(possibleMoves.contains(eventCoordinates)) {
roundWithoutKick++;

unLightSelect(selectedCoordinates);
movePawn(selectedCoordinates, eventCoordinates);
selectedCoordinates = null;
isSelected = false;

computerMove();
} else if(possibleKick.contains(eventCoordinates) && !isFieldNotNull(eventCoordinates)) {
}
else if(possibleKick.contains(eventCoordinates) && !isFieldNotNull(eventCoordinates)) {
roundWithoutKick = 0;

unLightSelect(selectedCoordinates);

if(!kickPawn(selectedCoordinates, eventCoordinates)) {
isSelected = false;
newKick = false;
computerMove();
} else {
}
else {
newKick = true;
selectedCoordinates = eventCoordinates;
}
}
} else if(eventCoordinates.isValid()) {
}
else if(eventCoordinates.isValid()) {
if(isFieldNotNull(eventCoordinates)) {
if(getPawn(eventCoordinates).getColor().isWhite() && isPossiblePawn(eventCoordinates, PawnColor.WHITE)) {
isSelected = true;
Expand All @@ -132,6 +181,111 @@ public void readMouseEvent(MouseEvent event) {
}
}

private void handleRoundvsPlayer(Coordinates c){
checkGameEnd();
if(isGameEnd) {
return;
}

Coordinates eventCoordinates = new Coordinates(c.getX(),c.getY());
if(isWhiteRound){
if(isSelected) {
if(selectedCoordinates.equals(eventCoordinates) && !newKick) {
if(!isTest){
unLightSelect(selectedCoordinates);
}
selectedCoordinates = null;
isSelected = false;
}
else if(possibleMoves.contains(eventCoordinates)) {
roundWithoutKick++;
if(!isTest){
unLightSelect(selectedCoordinates);
}
movePawn(selectedCoordinates, eventCoordinates);
selectedCoordinates = null;
isSelected = false;
isWhiteRound = false;
isBlackRound = true;
}
else if(possibleKick.contains(eventCoordinates) && !isFieldNotNull(eventCoordinates)) {
roundWithoutKick = 0;
if(!isTest){
unLightSelect(selectedCoordinates);
}
if(!kickPawn(selectedCoordinates, eventCoordinates)) {
isSelected = false;
newKick = false;
isWhiteRound = false;
isBlackRound = true;
}
else {
newKick = true;
selectedCoordinates = eventCoordinates;
}
}
}
else if(eventCoordinates.isValid()) {
if(isFieldNotNull(eventCoordinates)) {
if(getPawn(eventCoordinates).getColor().isWhite() && isPossiblePawn(eventCoordinates, PawnColor.WHITE)) {
isSelected = true;
selectedCoordinates = eventCoordinates;
lightSelect(eventCoordinates);
}
}
}
}
else if(isBlackRound){
if(isSelected) {
if(selectedCoordinates.equals(eventCoordinates) && !newKick) {
if(!isTest){
unLightSelect(selectedCoordinates);
}
selectedCoordinates = null;
isSelected = false;
}
else if(possibleMoves.contains(eventCoordinates)) {
roundWithoutKick++;
if(!isTest){
unLightSelect(selectedCoordinates);
}
movePawn(selectedCoordinates, eventCoordinates);
selectedCoordinates = null;
isSelected = false;
isWhiteRound = true;
isBlackRound = false;
}
else if(possibleKick.contains(eventCoordinates) && !isFieldNotNull(eventCoordinates)) {
roundWithoutKick = 0;
if(!isTest){
unLightSelect(selectedCoordinates);
}
if(!kickPawn(selectedCoordinates, eventCoordinates)) {
isSelected = false;
newKick = false;
isWhiteRound = true;
isBlackRound = false;
}
else {
newKick = true;
selectedCoordinates = eventCoordinates;
}
}
}
else if(eventCoordinates.isValid()) {
if(isFieldNotNull(eventCoordinates)) {
if(getPawn(eventCoordinates).getColor().isBlack() && isPossiblePawn(eventCoordinates, PawnColor.BLACK)) {
isSelected = true;
selectedCoordinates = eventCoordinates;
lightSelect(eventCoordinates);
}
}
}
}
}



public void readKeyboard(KeyEvent event) {
if(event.getCode().equals(KeyCode.R) || event.getCode().equals(KeyCode.N)) {
EndGame.restartApplication();
Expand Down Expand Up @@ -224,9 +378,11 @@ private void movePawn(Coordinates oldCoordinates, Coordinates newCoordinates) {
pawn = new PawnClass(Pawn.QUEEN, pawn.getColor());
}

Design.removePawn(oldCoordinates);
Design.removePawn(newCoordinates);
Design.addPawn(newCoordinates, pawn);
if(!isTest){
Design.removePawn(oldCoordinates);
Design.removePawn(newCoordinates);
Design.addPawn(newCoordinates, pawn);
}

board.remove(oldCoordinates);
board.put(newCoordinates, pawn);
Expand All @@ -241,9 +397,11 @@ private boolean kickPawn(Coordinates oldCoordinates, Coordinates newCoordinates)

Coordinates enemyCoordinates = getEnemyCoordinates(newCoordinates);

Design.removePawn(oldCoordinates);
Design.removePawn(enemyCoordinates);
Design.addPawn(newCoordinates, pawn);
if(!isTest){
Design.removePawn(oldCoordinates);
Design.removePawn(enemyCoordinates);
Design.addPawn(newCoordinates, pawn);
}

board.remove(oldCoordinates);
board.remove(enemyCoordinates);
Expand Down Expand Up @@ -297,11 +455,11 @@ private void lightSelect(Coordinates coordinates) {
if(possibleKick.size() > 0) {
possibleMoves.clear();
}

possibleMoves.forEach(this::lightMove);
possibleKick.forEach(this::lightKick);

lightPawn(coordinates);
if(!isTest){
possibleMoves.forEach(this::lightMove);
possibleKick.forEach(this::lightKick);
lightPawn(coordinates);
}
}

private void lightNewKick(Coordinates coordinates) {
Expand Down Expand Up @@ -386,10 +544,16 @@ public void checkGameEnd() {
new EndGame("Draw. Maybe you try again?");
} else if(possibleMovesWhite.size() == 0 || pawnWhiteCount <= 1) {
isGameEnd = true;
new EndGame("You loss. Maybe you try again?");
if(vsComputer)
new EndGame("You loss. Maybe you try again?");
if(vsPlayer)
new EndGame("Black win!");
} else if(possibleMovesBlack.size() == 0 || pawnBlackCount <= 1) {
isGameEnd = true;
new EndGame("You win! Congratulations! :)");
if(vsComputer)
new EndGame("You win! Congratulations! :)");
if(vsPlayer)
new EndGame("White win!");
}
}

Expand All @@ -404,4 +568,16 @@ public static boolean isThisSameColor(Coordinates coordinates, PawnColor color)
public static PawnClass getPawn(Coordinates coordinates) {
return board.get(coordinates);
}

public boolean getSelected(){
return isSelected;
}

public boolean getWhiteRound(){
return isWhiteRound;
}

public boolean getBlackRound(){
return isBlackRound;
}
}
Loading