From c3e5790ee5823dbf5a8a2feb3e3c029aa7b33070 Mon Sep 17 00:00:00 2001 From: "gpt-engineer-app[bot]" <159125892+gpt-engineer-app[bot]@users.noreply.github.com> Date: Fri, 5 Sep 2025 05:05:36 +0000 Subject: [PATCH] Add slow mode toggle --- src/components/CrapsGame.tsx | 136 +++++++++++++++++++++++++++++------ 1 file changed, 116 insertions(+), 20 deletions(-) diff --git a/src/components/CrapsGame.tsx b/src/components/CrapsGame.tsx index 8fb71ad..25f5283 100644 --- a/src/components/CrapsGame.tsx +++ b/src/components/CrapsGame.tsx @@ -4,6 +4,7 @@ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/com import { Badge } from '@/components/ui/badge'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Checkbox } from '@/components/ui/checkbox'; +import { Switch } from '@/components/ui/switch'; import { Slider } from '@/components/ui/slider'; import { Dice1, Dice2, Dice3, Dice4, Dice5, Dice6, RotateCcw, Settings, Play } from 'lucide-react'; import SocialShare from '@/components/SocialShare'; @@ -40,6 +41,8 @@ const CrapsGame: React.FC = ({ showSocialShare = false }) => { // Simulation state const [simulationRounds, setSimulationRounds] = useState([10]); const [isSimulating, setIsSimulating] = useState(false); + const [slowMode, setSlowMode] = useState(false); + const [currentSimulationGame, setCurrentSimulationGame] = useState(0); const [simulationResults, setSimulationResults] = useState<{ wins: number; losses: number; @@ -92,9 +95,9 @@ const CrapsGame: React.FC = ({ showSocialShare = false }) => { if (point === null) { // First roll (come out roll) if (loseSums.includes(sum)) { - return { result: 'lose', turns }; + return { result: 'lose', turns, die1, die2, sum }; } else if (winSums.includes(sum)) { - return { result: 'win', turns }; + return { result: 'win', turns, die1, die2, sum }; } else { point = sum; turns++; @@ -102,9 +105,9 @@ const CrapsGame: React.FC = ({ showSocialShare = false }) => { } else { // Subsequent rolls if (sum === point) { - return { result: 'win', turns }; + return { result: 'win', turns, die1, die2, sum }; } else if (sum === 7) { - return { result: 'lose', turns }; + return { result: 'lose', turns, die1, die2, sum }; } else { turns++; } @@ -112,23 +115,99 @@ const CrapsGame: React.FC = ({ showSocialShare = false }) => { } }; + const simulateGameSlow = async (gameNumber: number) => { + const winSums = isCustomRules ? customWinSums : [7, 11]; + const loseSums = isCustomRules ? customLoseSums : [2, 3, 12]; + + let turns = 1; + let point: number | null = null; + + while (true) { + // Show rolling animation + setIsRolling(true); + await new Promise(resolve => setTimeout(resolve, 500)); + + const die1 = Math.floor(Math.random() * 6) + 1; + const die2 = Math.floor(Math.random() * 6) + 1; + const sum = die1 + die2; + + // Update dice display + setDice1(die1); + setDice2(die2); + setIsRolling(false); + + // Wait to show the result + await new Promise(resolve => setTimeout(resolve, 800)); + + if (point === null) { + // First roll (come out roll) + if (loseSums.includes(sum)) { + setGameResult('lose'); + await new Promise(resolve => setTimeout(resolve, 1000)); + return { result: 'lose', turns }; + } else if (winSums.includes(sum)) { + setGameResult('win'); + await new Promise(resolve => setTimeout(resolve, 1000)); + return { result: 'win', turns }; + } else { + setGameResult('continue'); + point = sum; + turns++; + await new Promise(resolve => setTimeout(resolve, 800)); + } + } else { + // Subsequent rolls + if (sum === point) { + setGameResult('win'); + await new Promise(resolve => setTimeout(resolve, 1000)); + return { result: 'win', turns }; + } else if (sum === 7) { + setGameResult('lose'); + await new Promise(resolve => setTimeout(resolve, 1000)); + return { result: 'lose', turns }; + } else { + setGameResult('continue'); + turns++; + await new Promise(resolve => setTimeout(resolve, 600)); + } + } + } + }; + const runSimulation = async () => { setIsSimulating(true); + setCurrentSimulationGame(0); const numGames = simulationRounds[0]; let wins = 0; let losses = 0; let totalTurns = 0; - // Add small delays to show progress - for (let i = 0; i < numGames; i++) { - const game = simulateGame(); - if (game.result === 'win') wins++; - else losses++; - totalTurns += game.turns; - - // Add a small delay every 10 games to show progress - if (i % 10 === 0) { - await new Promise(resolve => setTimeout(resolve, 50)); + if (slowMode) { + // Slow mode: simulate visually + for (let i = 0; i < numGames; i++) { + setCurrentSimulationGame(i + 1); + setGameResult(null); + const game = await simulateGameSlow(i + 1); + if (game.result === 'win') wins++; + else losses++; + totalTurns += game.turns; + + // Brief pause between games + await new Promise(resolve => setTimeout(resolve, 500)); + } + } else { + // Fast mode: simulate in background + for (let i = 0; i < numGames; i++) { + const game = simulateGame(); + if (game.result === 'win') wins++; + else losses++; + totalTurns += game.turns; + + // Add a small delay every 10 games to show progress + if (i % 10 === 0) { + setCurrentSimulationGame(i + 1); + await new Promise(resolve => setTimeout(resolve, 50)); + } } } @@ -138,6 +217,7 @@ const CrapsGame: React.FC = ({ showSocialShare = false }) => { averageTurns: totalTurns / numGames, totalGames: numGames }); + setCurrentSimulationGame(0); setIsSimulating(false); }; @@ -204,11 +284,21 @@ const CrapsGame: React.FC = ({ showSocialShare = false }) => { {/* Simulation Controls */} - - Simulation - - Run multiple games to analyze win/loss statistics - + +
+ Simulation + + Run multiple games to analyze win/loss statistics + +
+
+ + +
@@ -228,7 +318,13 @@ const CrapsGame: React.FC = ({ showSocialShare = false }) => { className="w-full gap-2" > - {isSimulating ? 'Simulating...' : 'Simulate'} + {isSimulating + ? (slowMode + ? `Simulating Game ${currentSimulationGame}/${simulationRounds[0]}...` + : 'Simulating...' + ) + : 'Simulate' + } {simulationResults && (