diff --git a/pom.xml b/pom.xml index 90edea0..3222690 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,16 @@ ${junit.version} test + + junit + junit + 4.13.2 + + + org.mockito + mockito-core + 4.8.1 + diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 625badd..44f4889 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -3,9 +3,11 @@ requires javafx.fxml; requires org.kordamp.bootstrapfx.core; + requires junit; + requires org.mockito; opens rokas.games.blackjack to javafx.fxml; opens rokas.games.blackjack.Controllers to javafx.fxml; exports rokas.games.blackjack; - exports rokas.games.blackjack.Controllers to javafx.fxml; + exports rokas.games.blackjack.Controllers to javafx.fxml, org.junit.jupiter.engine; } \ No newline at end of file diff --git a/src/main/java/rokas/games/blackjack/Controllers/DeckViewController.java b/src/main/java/rokas/games/blackjack/Controllers/DeckViewController.java index 3e5b1d6..aa69b80 100644 --- a/src/main/java/rokas/games/blackjack/Controllers/DeckViewController.java +++ b/src/main/java/rokas/games/blackjack/Controllers/DeckViewController.java @@ -1,37 +1,20 @@ package rokas.games.blackjack.Controllers; -import javafx.event.ActionEvent; import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; -import javafx.scene.Node; -import javafx.scene.Parent; -import javafx.scene.Scene; import javafx.scene.control.Button; -import javafx.scene.control.Label; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.AnchorPane; import javafx.scene.text.Text; -import javafx.stage.Stage; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; import rokas.games.blackjack.Model.Card; import rokas.games.blackjack.Model.Deck; import rokas.games.blackjack.Model.Hand; -import java.io.IOException; import java.net.URL; import java.util.Random; import java.util.ResourceBundle; - - -@Getter -@Setter -@AllArgsConstructor public class DeckViewController implements Initializable { @FXML private Text gameOverText; @FXML private Button playButtonRestart; @@ -39,7 +22,6 @@ public class DeckViewController implements Initializable { @FXML private Text betText; @FXML private Text moneyText; @FXML private ImageView mainImage; - @FXML private Button play; @FXML private Button playAgainButton; @FXML private Text dealerScoreText; @FXML private Text playerScoreText; @@ -91,30 +73,7 @@ public class DeckViewController implements Initializable { private int playerBetAmount = 0; private boolean playerLostFlag = false; - private static int playerStartMoneyAmount = 1000; - - public boolean getPlayerLostFlag() { - return playerLostFlag; - } - public void setPlayerScore(int playerScore) { - this.playerScore = playerScore; - } - - public int getPlayerHandCount() { - return playerHandCount; - } - - public int getPlayerScore() { - return playerScore; - } - - public Button getPlayButton() { - return playButton; - } - - public Text getBetNotice() { - return betNotice; - } + private static final int playerStartMoneyAmount = 1000; public DeckViewController() { this.deck = new Deck(); @@ -221,127 +180,148 @@ private void resetCardVisibility() { dealerCard5.setVisible(false); } public boolean checkIfBust(int score){ - if(score > 21){ - return true; - } - else{ - return false; - } + return score > 21; } public boolean checkIfMaxScore(int score){ - if(score == 21){ - return true; - } - else{ - return false; - } + return score == 21; } public boolean compareScores(int playerCurrentScore, int dealerCurrentScore){ - if(playerCurrentScore > dealerCurrentScore){ - return true; - } - else{ - return false; - } + return playerCurrentScore > dealerCurrentScore; } public boolean checkIfPush(int playerCurrentScore, int dealerCurrentScore){ - if (playerCurrentScore == dealerCurrentScore){ - return true; - } - else{ - return false; - } + return playerCurrentScore == dealerCurrentScore; } public void hitCard() { - if (deck.getDeckSize() == 0) { - deck = new Deck(); - deck.shuffle(); + if (shouldResetDeck()) { + resetDeck(); } - hand = new Hand(); + currentCard = deck.dealCard(); - int currentCardFaceValue; playerHandCount++; + displayPlayerCard(currentCard); + + int currentCardFaceValue = calculateCardFaceValue(); + playerScore = hand.calculateScore(playerScore, currentCardFaceValue); + updatePlayerUI(); + + if (shouldHandleBust()) { + handleBust(); + } else if (shouldHandleMaxScore()) { + handleMaxScore(); + } + + updateHandInfo(); + } + + private void updateHandInfo() { + hand.setPlayerHandCardCount(playerHandCount); + hand.setPlayerScoreCount(playerScore); + } + + boolean shouldResetDeck() { + return deck.getDeckSize() == 0; + } + + private void resetDeck() { + deck = new Deck(); + deck.shuffle(); + } + + private void displayPlayerCard(Card card) { ImageView playerCard = getPlayerCardImageView(playerHandCount); - playerCard.setImage(currentCard.getImage()); + assert playerCard != null; + playerCard.setImage(card.getImage()); playerCard.setVisible(true); + } - currentCardFaceValue = hand.extractFaceValue(currentCard.toString(), playerScore); - playerScore = hand.calculateScore(playerScore, currentCardFaceValue); + private int calculateCardFaceValue() { + return hand.extractFaceValue(currentCard.toString(), playerScore); + } + + private void updatePlayerUI() { displayPlayerFaceValue.setText(String.valueOf(playerScore)); cardsInDeck.setText(Integer.toString(deck.getDeckSize())); + } - if (checkIfBust(playerScore) && playerHandCount > 2) { - winsText.setVisible(true); - winsText.setText("Dealer wins (player busted)"); - playAgainButton.setVisible(true); - playerLostFlag = true; - toggleButtons(false); - if (checkIfGameOver(playerMoneyAmount)) { - showGameOverScreen(); - } - } else if (checkIfMaxScore(playerScore) && playerHandCount >= 2) { - winsText.setVisible(true); - winsText.setText("Player wins (player got 21)"); - playAgainButton.setVisible(true); - playerMoneyAmount = playerMoneyAmount + playerBetAmount * 2; - playerMoney.setText(Integer.toString(playerMoneyAmount)); - playerLostFlag = false; - toggleButtons(false); + private boolean shouldHandleBust() { + return playerHandCount > 2 && checkIfBust(playerScore); + } + + private void handleBust() { + displayBustMessage(); + playerLostFlag = true; + toggleButtons(false); + if (checkIfGameOver(playerMoneyAmount)) { + showGameOverScreen(); } - hand.setPlayerHandCardCount(playerHandCount); - hand.setPlayerScoreCount(playerScore); + } + + private boolean shouldHandleMaxScore() { + return playerHandCount >= 2 && checkIfMaxScore(playerScore); + } + + private void handleMaxScore() { + displayMaxScoreMessage(); + playerMoneyAmount = playerMoneyAmount + playerBetAmount * 2; + playerMoney.setText(Integer.toString(playerMoneyAmount)); + playerLostFlag = false; + toggleButtons(false); + } + + private void displayBustMessage() { + winsText.setVisible(true); + winsText.setText("Dealer wins (player busted)"); + playAgainButton.setVisible(true); + } + + private void displayMaxScoreMessage() { + winsText.setVisible(true); + winsText.setText("Player wins (player got 21)"); + playAgainButton.setVisible(true); } private ImageView getPlayerCardImageView(int playerHandCount) { - switch (playerHandCount) { - case 1: return playerCard1; - case 2: return playerCard2; - case 3: return playerCard3; - case 4: return playerCard4; - case 5: return playerCard5; - case 6: return playerCard6; - case 7: return playerCard7; - case 8: return playerCard8; - case 9: return playerCard9; - case 10: return playerCard10; - case 11: return playerCard11; - default: return null; - } + return switch (playerHandCount) { + case 1 -> playerCard1; + case 2 -> playerCard2; + case 3 -> playerCard3; + case 4 -> playerCard4; + case 5 -> playerCard5; + case 6 -> playerCard6; + case 7 -> playerCard7; + case 8 -> playerCard8; + case 9 -> playerCard9; + case 10 -> playerCard10; + case 11 -> playerCard11; + default -> null; + }; } private ImageView getDealerCardByIndex(int index) { - switch (index) { - case 1: - return dealerCard1; - case 2: + return switch (index) { + case 1 -> dealerCard1; + case 2 -> { previousCard = currentCard; - return dealerCard2; - case 3: + yield dealerCard2; + } + case 3 -> { dealerCard2.setImage(previousCard.getImage()); - return dealerCard3; - case 4: - return dealerCard4; - case 5: - return dealerCard5; - case 6: - return dealerCard6; - case 7: - return dealerCard7; - case 8: - return dealerCard8; - case 9: - return dealerCard9; - case 10: - return dealerCard10; - case 11: - return dealerCard11; - default: - throw new IndexOutOfBoundsException("Invalid dealer card index: " + index); - } + yield dealerCard3; + } + case 4 -> dealerCard4; + case 5 -> dealerCard5; + case 6 -> dealerCard6; + case 7 -> dealerCard7; + case 8 -> dealerCard8; + case 9 -> dealerCard9; + case 10 -> dealerCard10; + case 11 -> dealerCard11; + default -> throw new IndexOutOfBoundsException("Invalid dealer card index: " + index); + }; } public void standCard() { @@ -445,10 +425,10 @@ public void doubleCard() { } } - public void betTen(ActionEvent actionEvent) { + public void betTen() { addBet(10); } - public void betTwentyFive(ActionEvent actionEvent) { + public void betTwentyFive() { addBet(25); } @@ -493,7 +473,7 @@ public void addBet(int amount) { public boolean checkIfDealerHitNext(int score) { - int probability = 0; + int probability; Random rand = new Random(); int randInt = rand.nextInt(100) + 1; if (score > 0 && score <= 10) { @@ -515,12 +495,7 @@ public boolean checkIfDealerHitNext(int score) { } public boolean checkIfGameOver(int money){ - if (money <= 0){ - return true; - } - else{ - return false; - } + return money <= 0; } @@ -549,12 +524,61 @@ public void hideEverything(){ playerScoreText.setVisible(false); playerMoney.setVisible(false); + hidePlayerCards(); + hideDealerCards(); + } + + public void toggleElements(boolean toggleFlag) { + if (toggleFlag) { + showGameElements(); + } else { + hideGameElements(); + } + } + + private void showGameElements() { + betPane.setVisible(false); + hitButton.setVisible(true); + standButton.setVisible(true); + playButton.setVisible(false); + playAgainButton.setVisible(false); + cardsInDeck.setVisible(true); + playerScoreText.setVisible(true); + dealerScoreText.setVisible(true); + cardsLeftImageView.setVisible(true); + displayPlayerFaceValue.setVisible(true); + displayDealerFaceValue.setVisible(true); + } + + private void hideGameElements() { + betPane.setVisible(true); + hitButton.setVisible(false); + standButton.setVisible(false); + doubleButton.setVisible(false); + winsText.setVisible(false); + playerScoreText.setVisible(false); + dealerScoreText.setVisible(false); + cardsLeftImageView.setVisible(false); + displayPlayerFaceValue.setVisible(false); + displayDealerFaceValue.setVisible(false); + betAmount.setVisible(true); + betText.setVisible(true); + moneyText.setVisible(true); + playerMoney.setVisible(true); + + hidePlayerCards(); + hideDealerCards(); + } + + private void hidePlayerCards() { playerCard1.setVisible(false); playerCard2.setVisible(false); playerCard3.setVisible(false); playerCard4.setVisible(false); playerCard5.setVisible(false); + } + private void hideDealerCards() { dealerCard1.setVisible(false); dealerCard2.setVisible(false); dealerCard3.setVisible(false); @@ -562,52 +586,4 @@ public void hideEverything(){ dealerCard5.setVisible(false); } - public void toggleElements(boolean toggleFlag){ - if (toggleFlag){ - betPane.setVisible(false); - hitButton.setVisible(true); - standButton.setVisible(true); - playButton.setVisible(false); - playAgainButton.setVisible(false); - cardsInDeck.setVisible(true); - playerScoreText.setVisible(true); - dealerScoreText.setVisible(true); - cardsInDeck.setVisible(true); - cardsLeftImageView.setVisible(true); - displayPlayerFaceValue.setVisible(true); - displayDealerFaceValue.setVisible(true); - } - else{ - betPane.setVisible(true); - hitButton.setVisible(false); - standButton.setVisible(false); - doubleButton.setVisible(false); - winsText.setVisible(false); - playerScoreText.setVisible(false); - dealerScoreText.setVisible(false); - cardsInDeck.setVisible(false); - cardsLeftImageView.setVisible(false); - displayPlayerFaceValue.setVisible(false); - displayDealerFaceValue.setVisible(false); - betAmount.setVisible(true); - betText.setVisible(true); - moneyText.setVisible(true); - playerMoney.setVisible(true); - - playerCard1.setVisible(false); - playerCard2.setVisible(false); - playerCard3.setVisible(false); - playerCard4.setVisible(false); - playerCard5.setVisible(false); - - dealerCard1.setVisible(false); - dealerCard2.setVisible(false); - dealerCard3.setVisible(false); - dealerCard4.setVisible(false); - dealerCard5.setVisible(false); - } - } - - - } diff --git a/src/main/java/rokas/games/blackjack/UnitTests/Tests.java b/src/main/java/rokas/games/blackjack/UnitTests/Tests.java deleted file mode 100644 index 2c1faed..0000000 --- a/src/main/java/rokas/games/blackjack/UnitTests/Tests.java +++ /dev/null @@ -1,43 +0,0 @@ -package rokas.games.blackjack.UnitTests; - -import org.testng.annotations.Test; -import rokas.games.blackjack.Controllers.DeckViewController; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class Tests { - DeckViewController deckViewController = new DeckViewController(); - @Test - public void testCheckIfBust(){ - int scoreMore = 22; - int scoreEqual = 21; - int scoreLess = 20; - assertTrue(deckViewController.checkIfBust(scoreMore)); - assertFalse(deckViewController.checkIfBust(scoreEqual)); - assertFalse(deckViewController.checkIfBust(scoreLess)); - } - - @Test - public void testCompareScore(){ - int playerScore = 20; - int dealerScore = 10; - assertTrue(deckViewController.compareScores(playerScore, dealerScore)); - playerScore = 10; - dealerScore = 20; - assertFalse(deckViewController.compareScores(playerScore, dealerScore)); - } - - @Test - public void testCheckIfGameOver(){ - int money = 1000; - assertFalse(deckViewController.checkIfGameOver(money)); - money = 0; - assertTrue(deckViewController.checkIfGameOver(money)); - money = -10; - assertTrue(deckViewController.checkIfGameOver(money)); - } - - - -} \ No newline at end of file diff --git a/src/test/java/rokas/games/blackjack/Controllers/DeckViewControllerTest.java b/src/test/java/rokas/games/blackjack/Controllers/DeckViewControllerTest.java new file mode 100644 index 0000000..0d5b879 --- /dev/null +++ b/src/test/java/rokas/games/blackjack/Controllers/DeckViewControllerTest.java @@ -0,0 +1,59 @@ +package rokas.games.blackjack.Controllers; + +import org.junit.Before; +import org.junit.Test; +import static org.mockito.Mockito.*; +import rokas.games.blackjack.Model.Deck; +import rokas.games.blackjack.Model.Hand; +public class DeckViewControllerTest { + + + private DeckViewController deckViewController; + private Deck deck; + private Hand hand; + + @Before + public void setUp() { + deck = mock(Deck.class); + hand = mock(Hand.class); + deckViewController = new DeckViewController(); + } + + @Test + public void testHitCardShouldResetDeck() { + when(deck.getDeckSize()).thenReturn(0); + deckViewController.hitCard(); + verify(deck).shuffle(); + } + + @Test + public void testHitCardShouldHandleBust() { + when(deck.getDeckSize()).thenReturn(5); // Assuming deck is not empty + when(hand.extractFaceValue(anyString(), anyInt())).thenReturn(10); // Assuming current card value + when(hand.calculateScore(anyInt(), anyInt())).thenReturn(25); // Assuming player's score + when(deckViewController.checkIfBust(anyInt())).thenReturn(true); + deckViewController.hitCard(); + // Write assertions for the expected behavior when bust is handled + } + + @Test + public void testHitCardShouldHandleMaxScore() { + when(deck.getDeckSize()).thenReturn(5); // Assuming deck is not empty + when(hand.extractFaceValue(anyString(), anyInt())).thenReturn(10); // Assuming current card value + when(hand.calculateScore(anyInt(), anyInt())).thenReturn(21); // Assuming player's score + when(deckViewController.checkIfMaxScore(anyInt())).thenReturn(true); + deckViewController.hitCard(); + // Write assertions for the expected behavior when max score is handled + } + + @Test + public void testHitCardDefaultCase() { + when(deck.getDeckSize()).thenReturn(5); // Assuming deck is not empty + when(hand.extractFaceValue(anyString(), anyInt())).thenReturn(10); // Assuming current card value + when(hand.calculateScore(anyInt(), anyInt())).thenReturn(15); // Assuming player's score + deckViewController.hitCard(); + // Write assertions for the default case + } + } + + diff --git a/target/classes/module-info.class b/target/classes/module-info.class index 80f69f7..9e8fff9 100644 Binary files a/target/classes/module-info.class and b/target/classes/module-info.class differ diff --git a/target/classes/rokas/games/blackjack/Controllers/DeckViewController.class b/target/classes/rokas/games/blackjack/Controllers/DeckViewController.class index f9415f5..22b3abe 100644 Binary files a/target/classes/rokas/games/blackjack/Controllers/DeckViewController.class and b/target/classes/rokas/games/blackjack/Controllers/DeckViewController.class differ