xxxxxxxxxx
147
// The Monty Hall Problem
// The Coding Train / Daniel Shiffman
// https://thecodingtrain.com/challenges/170-monty-hall.html
// https://youtu.be/0zac-cDzJwA
// Basic: https://editor.p5js.org/codingtrain/sketches/0Ud-XsaYb
// Door and Speed Variations: https://editor.p5js.org/codingtrain/sketches/pLW3_PNDM
const doors = [];
let state = "PICK";
let pickedDoor;
let revealedDoor;
let switchButton, stayButton, playAgain;
let outcomeP;
let resultsP;
let totalSwitchPlays = 0;
let totalStayPlays = 0;
let totalSwitchWins = 0;
let totalStayWins = 0;
function startOver() {
for (let door of doors) {
door.prize = "🐐";
door.html("");
door.style("background-color", "#AAA");
}
const winner = random(doors);
winner.prize = "🚗";
playAgain.hide();
outcomeP.html("");
state = "PICK";
}
function setup() {
noCanvas();
for (let i = 0; i < 3; i++) {
doors[i] = createDiv("");
doors[i].parent("#doors");
doors[i].class("door");
doors[i].index = i;
doors[i].mousePressed(pickDoor);
}
switchButton = createButton("switch");
switchButton.mousePressed(playerSwitch);
switchButton.hide();
stayButton = createButton("stay");
stayButton.mousePressed(playerStay);
stayButton.hide();
playAgain = createButton("play again");
playAgain.mousePressed(startOver);
playAgain.hide();
resultsP = createP("");
outcomeP = createP("");
startOver();
}
function pickDoor() {
if (state == "PICK") {
state = "REVEAL";
this.style("background-color", "#AAF");
pickedDoor = this;
reveal();
}
}
function reveal() {
const options = [];
for (let i = 0; i < doors.length; i++) {
const door = doors[i];
if (i !== pickedDoor.index && door.prize !== "🚂") {
options.push(door);
}
}
revealedDoor = random(options);
revealedDoor.html(revealedDoor.prize);
switchButton.show();
stayButton.show();
}
function playerSwitch() {
totalSwitchPlays++;
let newPick;
for (let i = 0; i < doors.length; i++) {
let door = doors[i];
if (door !== pickedDoor && door !== revealedDoor) {
newPick = door;
break;
}
}
pickedDoor = newPick;
checkWin(true);
}
function playerStay() {
totalStayPlays++;
checkWin(false);
}
function checkWin(playerSwitch) {
switchButton.hide();
stayButton.hide();
for (let door of doors) {
door.html(door.prize);
door.style("background-color", "#AAA");
}
if (pickedDoor.prize == "🚂") {
outcomeP.html("You win!");
pickedDoor.style("background-color", "#AFA");
if (playerSwitch) {
totalSwitchWins++;
} else {
totalStayWins++;
}
} else {
outcomeP.html("You lose!");
pickedDoor.style("background-color", "#FAA");
}
let switchRate = totalSwitchWins / totalSwitchPlays;
let stayRate = totalStayWins / totalStayPlays;
resultsP.html(
`Total Switches: ${totalSwitchPlays}<br/>
Switch Win Rate: ${nf(100 * switchRate, 2, 2)}<br/>
Total Stays: ${totalStayPlays}<br/>
Stay Win Rate: ${nf(100 * stayRate, 2, 2)}`
);
playAgain.show();
}