diff --git a/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java b/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java index cb31352..9bf591f 100644 --- a/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java +++ b/backend/src/main/java/de/szut/casino/blackjack/BlackJackService.java @@ -29,14 +29,14 @@ public class BlackJackService { BlackJackGameEntity game = new BlackJackGameEntity(); game.setUser(user); game.setBet(betAmount); - + initializeDeck(game); dealInitialCards(game); - + game.setState(getState(game)); deductBetFromBalance(user, betAmount); - - return blackJackGameRepository.save(game); + + return processGameBasedOnState(game); } @Transactional @@ -44,12 +44,11 @@ public class BlackJackService { if (game.getState() != BlackJackState.IN_PROGRESS) { return game; } - + dealCardToPlayer(game); - updateGameStateAndBalance(game); - - return blackJackGameRepository.save(game); + + return processGameBasedOnState(game); } @Transactional @@ -57,11 +56,11 @@ public class BlackJackService { if (game.getState() != BlackJackState.IN_PROGRESS) { return game; } - + dealCardsToDealerUntilMinimumScore(game); determineWinnerAndUpdateBalance(game); - - return blackJackGameRepository.save(game); + + return processGameBasedOnState(game); } @Transactional @@ -69,98 +68,107 @@ public class BlackJackService { if (game.getState() != BlackJackState.IN_PROGRESS || game.getPlayerCards().size() != 2) { return game; } - + UserEntity user = getUserWithFreshData(game.getUser()); BigDecimal additionalBet = game.getBet(); - + deductBetFromBalance(user, additionalBet); game.setBet(game.getBet().add(additionalBet)); - + dealCardToPlayer(game); updateGameStateAndBalance(game); - + if (game.getState() == BlackJackState.IN_PROGRESS) { return stand(game); } - + return game; } @Transactional public BlackJackGameEntity split(BlackJackGameEntity game) { - if (game.getState() != BlackJackState.IN_PROGRESS || - game.getPlayerCards().size() != 2 || - game.isSplit() || - !game.getPlayerCards().get(0).getRank().equals(game.getPlayerCards().get(1).getRank())) { + if (game.getState() != BlackJackState.IN_PROGRESS || + game.getPlayerCards().size() != 2 || + game.isSplit() || + !game.getPlayerCards().get(0).getRank().equals(game.getPlayerCards().get(1).getRank())) { return game; } - + UserEntity user = getUserWithFreshData(game.getUser()); BigDecimal splitBet = game.getBet(); - + if (user.getBalance().compareTo(splitBet) < 0) { return game; } - + deductBetFromBalance(user, splitBet); game.setSplitBet(splitBet); game.setSplit(true); - + CardEntity card = game.getPlayerCards().remove(1); card.setCardType(CardType.PLAYER_SPLIT); game.getPlayerSplitCards().add(card); - + dealCardToPlayer(game); dealCardToSplitHand(game); - + + return blackJackGameRepository.save(game); + } + + private BlackJackGameEntity processGameBasedOnState(BlackJackGameEntity game) { + if (game.getState() != BlackJackState.IN_PROGRESS) { + this.blackJackGameRepository.delete(game); + return game; + } + return blackJackGameRepository.save(game); } private BlackJackGameEntity refreshGameState(BlackJackGameEntity game) { return blackJackGameRepository.findById(game.getId()).orElse(game); } - + private UserEntity getUserWithFreshData(UserEntity user) { return userRepository.findById(user.getId()).orElse(user); } - + private void dealInitialCards(BlackJackGameEntity game) { for (int i = 0; i < 2; i++) { dealCardToPlayer(game); } - + dealCardToDealer(game); } - + private void dealCardToPlayer(BlackJackGameEntity game) { CardEntity card = drawCardFromDeck(game); card.setCardType(CardType.PLAYER); game.getPlayerCards().add(card); } - + private void dealCardToDealer(BlackJackGameEntity game) { CardEntity card = drawCardFromDeck(game); card.setCardType(CardType.DEALER); game.getDealerCards().add(card); } - + private void dealCardsToDealerUntilMinimumScore(BlackJackGameEntity game) { while (calculateHandValue(game.getDealerCards()) < 17) { dealCardToDealer(game); } } - + private void dealCardToSplitHand(BlackJackGameEntity game) { CardEntity card = drawCardFromDeck(game); card.setCardType(CardType.PLAYER_SPLIT); game.getPlayerSplitCards().add(card); } - + private void updateGameStateAndBalance(BlackJackGameEntity game) { if (game.isSplit()) { int mainHandValue = calculateHandValue(game.getPlayerCards()); int splitHandValue = calculateHandValue(game.getPlayerSplitCards()); - + if (mainHandValue > 21 && splitHandValue > 21) { game.setState(BlackJackState.PLAYER_LOST); updateUserBalance(game, false); @@ -171,7 +179,7 @@ public class BlackJackService { } } else { game.setState(getState(game)); - + if (game.getState() == BlackJackState.PLAYER_WON) { updateUserBalance(game, true); } else if (game.getState() == BlackJackState.PLAYER_LOST) { @@ -179,7 +187,7 @@ public class BlackJackService { } } } - + private void determineWinnerAndUpdateBalance(BlackJackGameEntity game) { int playerValue = calculateHandValue(game.getPlayerCards()); int dealerValue = calculateHandValue(game.getDealerCards()); @@ -195,7 +203,7 @@ public class BlackJackService { updateUserBalance(game, false); } } - + private void deductBetFromBalance(UserEntity user, BigDecimal betAmount) { user.setBalance(user.getBalance().subtract(betAmount)); userRepository.save(user); @@ -206,21 +214,21 @@ public class BlackJackService { UserEntity user = getUserWithFreshData(game.getUser()); BigDecimal totalBet = game.getBet(); BigDecimal balance = user.getBalance(); - + if (game.isSplit()) { totalBet = totalBet.add(game.getSplitBet()); - + if (isWin) { int mainHandValue = calculateHandValue(game.getPlayerCards()); int splitHandValue = calculateHandValue(game.getPlayerSplitCards()); int dealerValue = calculateHandValue(game.getDealerCards()); - + if (mainHandValue <= 21 && (dealerValue > 21 || mainHandValue > dealerValue)) { balance = balance.add(game.getBet().multiply(BigDecimal.valueOf(2))); } else if (mainHandValue == dealerValue) { balance = balance.add(game.getBet()); } - + if (splitHandValue <= 21 && (dealerValue > 21 || splitHandValue > dealerValue)) { balance = balance.add(game.getSplitBet().multiply(BigDecimal.valueOf(2))); } else if (splitHandValue == dealerValue) { @@ -236,7 +244,7 @@ public class BlackJackService { balance = balance.add(totalBet); } } - + user.setBalance(balance); userRepository.save(user); }