diff --git a/src/main/java/com/github/zipcodewilmington/casino/games/RouletteGame.java b/src/main/java/com/github/zipcodewilmington/casino/games/RouletteGame.java new file mode 100644 index 0000000..f8d7189 --- /dev/null +++ b/src/main/java/com/github/zipcodewilmington/casino/games/RouletteGame.java @@ -0,0 +1,143 @@ +package com.github.zipcodewilmington.casino.games.roulette; + +import com.github.zipcodewilmington.casino.CasinoAccount; +import com.github.zipcodewilmington.casino.GameInterface; +import com.github.zipcodewilmington.casino.PlayerInterface; + +import java.util.Random; +import java.util.Scanner; + +public class RouletteGame implements GameInterface { + + private static final int[] RED_NUMBERS = { + 1, 3, 5, 7, 9, 12, 14, 16, 18, 19, + 21, 23, 25, 27, 30, 32, 34, 36 + }; + + private RoulettePlayer player; + private Scanner scanner; + + public RouletteGame() { + this.scanner = new Scanner(System.in); + } + + @Override + public void addPlayer(CasinoAccount account) { + this.player = new RoulettePlayer(account); + } + + @Override + public void play() { + System.out.println("\n==== ROULETTE ===="); + System.out.println("Balance: $" + player.getAccount().getBalance()); + System.out.print("Enter bet amount: $"); + double betAmount = scanner.nextDouble(); + + if (betAmount <= 0) { + System.out.println("Bet must be greater than $0. Returning to lobby..."); + return; + } + + if (betAmount > player.getAccount().getBalance()) { + System.out.println("Not enough funds! Returning to lobby..."); + return; + } + + System.out.println("\nBet type:"); + System.out.println(" 1. Specific number (0-36) -- pays 35x"); + System.out.println(" 2. Red / Black -- pays 2x"); + System.out.println(" 3. Even / Odd -- pays 2x"); + System.out.print("Choose (1-3): "); + int choice = scanner.nextInt(); + + String betType = ""; + int betNumber = -1; + + switch (choice) { + case 1: + System.out.print("Pick a number (0-36): "); + betNumber = scanner.nextInt(); + if (betNumber < 0 || betNumber > 36) { + System.out.println("Invalid number! Returning to lobby..."); + return; + } + betType = "number"; + break; + case 2: + System.out.print("Type red or black: "); + betType = scanner.next().toLowerCase(); + if (!betType.equals("red") && !betType.equals("black")) { + System.out.println("Invalid choice! Returning to lobby..."); + return; + } + break; + case 3: + System.out.print("Type even or odd: "); + betType = scanner.next().toLowerCase(); + if (!betType.equals("even") && !betType.equals("odd")) { + System.out.println("Invalid choice! Returning to lobby..."); + return; + } + break; + default: + System.out.println("Invalid choice! Returning to lobby..."); + return; + } + + player.setBetAmount(betAmount); + player.setBetType(betType); + player.setBetNumber(betNumber); + + int result = spinWheel(); + String resultColor = isRed(result) ? "Red" : (result == 0 ? "Green" : "Black"); + + System.out.println("\n--- Spinning the wheel... ---"); + System.out.println("Result: " + result + " (" + resultColor + ")"); + + if (isWin(result, betType, betNumber)) { + double winnings = calculateWinnings(betAmount, betType); + player.getAccount().deposit(winnings); + System.out.println("YOU WIN! + $" + winnings); + } else { + player.getAccount().withdraw(betAmount); + System.out.println("You lost. - $" + betAmount); + } + + System.out.println("New balance: $" + player.getAccount().getBalance()); + } + + public int spinWheel() { + return new Random().nextInt(37); + } + + public boolean isWin(int result, String betType, int betNumber) { + switch (betType) { + case "number": return result == betNumber; + case "red": return isRed(result); + case "black": return !isRed(result) && result != 0; + case "even": return result != 0 && result % 2 == 0; + case "odd": return result % 2 == 1; + default: return false; + } + } + + public double calculateWinnings(double betAmount, String betType) { + if (betType.equals("number")) { + return betAmount * 35; + } else { + return betAmount * 2; + } + } + + public boolean isRed(int number) { + for (int red : RED_NUMBERS) { + if (number == red) return true; + } + return false; + } + + @Override + public void removePlayer(PlayerInterface player) { + this.player = null; + } +} \ No newline at end of file diff --git a/src/main/java/com/github/zipcodewilmington/casino/games/RoulettePlayer.java b/src/main/java/com/github/zipcodewilmington/casino/games/RoulettePlayer.java new file mode 100644 index 0000000..ee9c9e7 --- /dev/null +++ b/src/main/java/com/github/zipcodewilmington/casino/games/RoulettePlayer.java @@ -0,0 +1,44 @@ +package com.github.zipcodewilmington.casino.games; +import com.github.zipcodewilmington.casino.CasinoAccount; + +//lofi + +public class RoulettePlayer { + private CasinoAccount account; + private int betNumber; + private String betType; + private double betAmount; + + public RoulettePlayer(CasinoAccount account) { + this.account = account; + } + + public CasinoAccount geAccount() { + return account; + } + + public int getBetNumber() { + return betNumber; + } + + public void setBetNumber(int betNumber) { + this.betNumber = betNumber; + } + + public String getBetType() { + return betType; + } + + public void setBetType(String betType) { + this.betType = betType; + } + + public double getBetAmount() { + return betAmount; + } + + public void setBetAmount(double betAmount) { + this.betAmount = betAmount; + } + +} diff --git a/src/main/java/com/github/zipcodewilmington/casino/games/RouletteWheel.java b/src/main/java/com/github/zipcodewilmington/casino/games/RouletteWheel.java new file mode 100644 index 0000000..159326c --- /dev/null +++ b/src/main/java/com/github/zipcodewilmington/casino/games/RouletteWheel.java @@ -0,0 +1,63 @@ +package com.github.zipcodewilmington.casino.games; + +import java.util.Random; + +public class RouletteWheel { + private final int[] numbers; + private final String[] colors; + private int lastSpinNumber; + private String lastSpinColor; + private final Random random; + + public RouletteWheel() { + this.numbers = new int[37]; // 0 to 36 + this.colors = new String[37]; + this.random = new Random(); + initializeWheel(); + } + + private void initializeWheel() { + for (int i = 0; i <= 36; i++) { + numbers[i] = i; + if (i == 0) { + colors[i] = "Green"; + } else if (isRedNumber(i)) { + colors[i] = "Red"; + } else { + colors[i] = "Black"; + } + } + } + + // Official Roulette logic for Red numbers + private boolean isRedNumber(int n) { + if ((n >= 1 && n <= 10) || (n >= 19 && n <= 28)) { + return n % 2 != 0; // Odd is Red + } else { + return n % 2 == 0; // Even is Red + } + } + + public void spin() { + int index = random.nextInt(37); + this.lastSpinNumber = numbers[index]; + this.lastSpinColor = colors[index]; + } + + public int getLastSpinNumber() { + return lastSpinNumber; + } + + public String getLastSpinColor() { + return lastSpinColor; + } + + // Logic for your Game teammate to use for payouts + public boolean lastSpinWasEven() { + return lastSpinNumber != 0 && lastSpinNumber % 2 == 0; + } + + public boolean lastSpinWasOdd() { + return lastSpinNumber != 0 && lastSpinNumber % 2 != 0; + } +} \ No newline at end of file