|
|
<!DOCTYPE html> |
|
|
<html lang="zh-TW"> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
|
<title>三門問題遊戲</title> |
|
|
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+TC:wght@400;700&display=swap" rel="stylesheet"> |
|
|
<style> |
|
|
body { |
|
|
font-family: 'Noto Sans TC', Arial, sans-serif; |
|
|
text-align: center; |
|
|
padding: 20px; |
|
|
background-color: #f0f0f0; |
|
|
margin: 0; |
|
|
min-height: 100vh; |
|
|
display: flex; |
|
|
flex-direction: row; |
|
|
justify-content: center; |
|
|
gap: 40px; |
|
|
position: relative; |
|
|
box-sizing: border-box; |
|
|
} |
|
|
.game-container { |
|
|
flex: 1; |
|
|
max-width: 600px; |
|
|
width: 100%; |
|
|
} |
|
|
.stats-container { |
|
|
flex: 1; |
|
|
max-width: 300px; |
|
|
width: 100%; |
|
|
text-align: left; |
|
|
} |
|
|
.door-container { |
|
|
display: flex; |
|
|
justify-content: center; |
|
|
gap: 15px; |
|
|
margin: 20px 0; |
|
|
flex-wrap: wrap; |
|
|
} |
|
|
.door { |
|
|
cursor: pointer; |
|
|
border: 2px solid #333; |
|
|
padding: 10px; |
|
|
background-color: #fff; |
|
|
flex: 0 0 auto; |
|
|
} |
|
|
.door img { |
|
|
width: 100px; |
|
|
height: 150px; |
|
|
max-width: 100%; |
|
|
} |
|
|
#message { |
|
|
font-size: 1.2em; |
|
|
margin: 20px 0; |
|
|
word-wrap: break-word; |
|
|
} |
|
|
button { |
|
|
padding: 10px 20px; |
|
|
font-size: 1em; |
|
|
margin: 5px; |
|
|
cursor: pointer; |
|
|
width: auto; |
|
|
min-width: 120px; |
|
|
} |
|
|
table { |
|
|
width: 100%; |
|
|
border-collapse: collapse; |
|
|
margin-top: 20px; |
|
|
} |
|
|
th, td { |
|
|
border: 1px solid #333; |
|
|
padding: 8px; |
|
|
text-align: center; |
|
|
} |
|
|
th { |
|
|
background-color: #ddd; |
|
|
} |
|
|
.footer { |
|
|
position: absolute; |
|
|
bottom: 10px; |
|
|
right: 10px; |
|
|
font-size: 0.9em; |
|
|
color: #555; |
|
|
} |
|
|
|
|
|
@media (max-width: 768px) { |
|
|
body { |
|
|
flex-direction: column; |
|
|
gap: 20px; |
|
|
} |
|
|
.game-container, .stats-container { |
|
|
max-width: 100%; |
|
|
} |
|
|
.door img { |
|
|
width: 80px; |
|
|
height: 120px; |
|
|
} |
|
|
button { |
|
|
font-size: 0.9em; |
|
|
padding: 8px 16px; |
|
|
min-width: 100px; |
|
|
} |
|
|
#message { |
|
|
font-size: 1em; |
|
|
} |
|
|
.footer { |
|
|
position: static; |
|
|
text-align: center; |
|
|
margin-top: 20px; |
|
|
} |
|
|
} |
|
|
|
|
|
@media (max-width: 480px) { |
|
|
.door img { |
|
|
width: 60px; |
|
|
height: 90px; |
|
|
} |
|
|
button { |
|
|
font-size: 0.8em; |
|
|
padding: 6px 12px; |
|
|
min-width: 80px; |
|
|
} |
|
|
#message { |
|
|
font-size: 0.9em; |
|
|
} |
|
|
h1 { |
|
|
font-size: 1.5em; |
|
|
} |
|
|
h2 { |
|
|
font-size: 1.2em; |
|
|
} |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
<div class="game-container"> |
|
|
<h1>三門問題遊戲</h1> |
|
|
<div id="intro"> |
|
|
<p>歡迎來到三門問題遊戲!遊戲規則如下:<br> |
|
|
有三道門,任選一道,其中兩道門後面是一顆糖果,另一道門後面是一棟豪宅。<br> |
|
|
你選門後,主持人會打開一道有糖果的門,然後問你要不要換門。<br> |
|
|
準備好了嗎?請選擇一道門開始遊戲!</p> |
|
|
</div> |
|
|
<div id="doors" class="door-container"> |
|
|
<div class="door" onclick="chooseDoor(0)"><img src="door.jpg" alt="門 1"></div> |
|
|
<div class="door" onclick="chooseDoor(1)"><img src="door.jpg" alt="門 2"></div> |
|
|
<div class="door" onclick="chooseDoor(2)"><img src="door.jpg" alt="門 3"></div> |
|
|
</div> |
|
|
<div id="message"></div> |
|
|
<div id="switch-choice" style="display: none;"> |
|
|
<button onclick="switchDoor(true)">換門</button> |
|
|
<button onclick="switchDoor(false)">不換門</button> |
|
|
</div> |
|
|
<button onclick="promptForSimulation(false)">模擬 100 次:2號門不換 (需密碼)</button> |
|
|
<button onclick="promptForSimulation(true)">模擬 100 次:2號門換門 (需密碼)</button> |
|
|
<button onclick="promptForTenDoors()">進入十門版本 (需密碼)</button> |
|
|
<button onclick="promptForTeacherVersion()">進入教師教學版本 (需密碼)</button> |
|
|
</div> |
|
|
<div class="stats-container"> |
|
|
<h2>中獎機率統計</h2> |
|
|
<table id="stats-table"> |
|
|
<tr> |
|
|
<th>選擇</th> |
|
|
<th>次數</th> |
|
|
<th>中獎次數</th> |
|
|
<th>中獎機率</th> |
|
|
</tr> |
|
|
<tr> |
|
|
<td>換門</td> |
|
|
<td id="switch-count">0</td> |
|
|
<td id="switch-wins">0</td> |
|
|
<td id="switch-rate">0%</td> |
|
|
</tr> |
|
|
<tr> |
|
|
<td>不換門</td> |
|
|
<td id="no-switch-count">0</td> |
|
|
<td id="no-switch-wins">0</td> |
|
|
<td id="no-switch-rate">0%</td> |
|
|
</tr> |
|
|
</table> |
|
|
</div> |
|
|
<div class="footer">程式設計者:新竹縣立精華國中 藍星宇老師</div> |
|
|
|
|
|
<script> |
|
|
let playerChoice = null; |
|
|
let prizeDoor = Math.floor(Math.random() * 3); |
|
|
let revealedDoor = null; |
|
|
|
|
|
let switchCount = 0; |
|
|
let switchWins = 0; |
|
|
let noSwitchCount = 0; |
|
|
let noSwitchWins = 0; |
|
|
|
|
|
function chooseDoor(door) { |
|
|
playerChoice = door; |
|
|
document.getElementById("intro").style.display = "none"; |
|
|
|
|
|
do { |
|
|
revealedDoor = Math.floor(Math.random() * 3); |
|
|
} while (revealedDoor === playerChoice || revealedDoor === prizeDoor); |
|
|
|
|
|
const doors = document.getElementsByClassName("door"); |
|
|
doors[revealedDoor].innerHTML = '<img src="candy.jpg" alt="糖果">'; |
|
|
doors[revealedDoor].style.pointerEvents = "none"; |
|
|
|
|
|
document.getElementById("message").innerHTML = |
|
|
`你選了門 ${playerChoice + 1},主持人開啟了門 ${revealedDoor + 1},後面是一顆糖果。<br>你要換門嗎?`; |
|
|
document.getElementById("switch-choice").style.display = "block"; |
|
|
|
|
|
for (let i = 0; i < doors.length; i++) { |
|
|
doors[i].style.pointerEvents = "none"; |
|
|
} |
|
|
} |
|
|
|
|
|
function switchDoor(doSwitch) { |
|
|
let finalChoice = playerChoice; |
|
|
if (doSwitch) { |
|
|
finalChoice = 3 - playerChoice - revealedDoor; |
|
|
switchCount++; |
|
|
} else { |
|
|
noSwitchCount++; |
|
|
} |
|
|
|
|
|
const doors = document.getElementsByClassName("door"); |
|
|
for (let i = 0; i < 3; i++) { |
|
|
if (i === prizeDoor) { |
|
|
doors[i].innerHTML = '<img src="house.jpg" alt="豪宅">'; |
|
|
} else { |
|
|
doors[i].innerHTML = '<img src="candy.jpg" alt="糖果">'; |
|
|
} |
|
|
} |
|
|
|
|
|
const won = finalChoice === prizeDoor; |
|
|
let result = ""; |
|
|
if (doSwitch) { |
|
|
result = won ? "換門,有中" : "換門,沒中"; |
|
|
if (won) switchWins++; |
|
|
} else { |
|
|
result = won ? "不換門,有中" : "不換門,沒中"; |
|
|
if (won) noSwitchWins++; |
|
|
} |
|
|
document.getElementById("message").innerHTML = |
|
|
`你最終選擇了門 ${finalChoice + 1},豪宅在門 ${prizeDoor + 1}。<br>結果:${result}<br><button onclick="resetGame()">再玩一次</button>`; |
|
|
|
|
|
document.getElementById("switch-choice").style.display = "none"; |
|
|
|
|
|
updateStats(); |
|
|
} |
|
|
|
|
|
function resetGame() { |
|
|
prizeDoor = Math.floor(Math.random() * 3); |
|
|
playerChoice = null; |
|
|
revealedDoor = null; |
|
|
|
|
|
document.getElementById("intro").style.display = "block"; |
|
|
document.getElementById("message").innerHTML = ""; |
|
|
document.getElementById("switch-choice").style.display = "none"; |
|
|
|
|
|
const doors = document.getElementsByClassName("door"); |
|
|
for (let i = 0; i < doors.length; i++) { |
|
|
doors[i].innerHTML = `<img src="door.jpg" alt="門 ${i + 1}">`; |
|
|
doors[i].style.pointerEvents = "auto"; |
|
|
} |
|
|
} |
|
|
|
|
|
function updateStats() { |
|
|
document.getElementById("switch-count").innerHTML = switchCount; |
|
|
document.getElementById("switch-wins").innerHTML = switchWins; |
|
|
const switchRate = switchCount > 0 ? (switchWins / switchCount * 100).toFixed(1) : 0; |
|
|
document.getElementById("switch-rate").innerHTML = `${switchRate}%`; |
|
|
|
|
|
document.getElementById("no-switch-count").innerHTML = noSwitchCount; |
|
|
document.getElementById("no-switch-wins").innerHTML = noSwitchWins; |
|
|
const noSwitchRate = noSwitchCount > 0 ? (noSwitchWins / noSwitchCount * 100).toFixed(1) : 0; |
|
|
document.getElementById("no-switch-rate").innerHTML = `${noSwitchRate}%`; |
|
|
} |
|
|
|
|
|
function promptForSimulation(doSwitch) { |
|
|
const password = prompt("請輸入密碼以啟動模擬功能:"); |
|
|
if (password === "Ghjh") { |
|
|
runSimulation(doSwitch); |
|
|
} else { |
|
|
alert("密碼錯誤!"); |
|
|
} |
|
|
} |
|
|
|
|
|
function runSimulation(doSwitch) { |
|
|
for (let i = 0; i < 100; i++) { |
|
|
playerChoice = 1; |
|
|
prizeDoor = Math.floor(Math.random() * 3); |
|
|
|
|
|
do { |
|
|
revealedDoor = Math.floor(Math.random() * 3); |
|
|
} while (revealedDoor === playerChoice || revealedDoor === prizeDoor); |
|
|
|
|
|
let finalChoice = playerChoice; |
|
|
if (doSwitch) { |
|
|
finalChoice = 3 - playerChoice - revealedDoor; |
|
|
switchCount++; |
|
|
if (finalChoice === prizeDoor) switchWins++; |
|
|
} else { |
|
|
noSwitchCount++; |
|
|
if (finalChoice === prizeDoor) noSwitchWins++; |
|
|
} |
|
|
} |
|
|
|
|
|
updateStats(); |
|
|
|
|
|
const action = doSwitch ? "換門" : "不換門"; |
|
|
document.getElementById("message").innerHTML = |
|
|
`模擬完成!已執行 100 次,選擇 2 號門且${action}。<br>請查看右側統計表格。<br><button onclick="resetGame()">再玩一次</button>`; |
|
|
} |
|
|
|
|
|
function promptForTenDoors() { |
|
|
const password = prompt("請輸入密碼以進入十門版本:"); |
|
|
if (password === "TenDoors") { |
|
|
window.location.href = "ten_doors.html"; |
|
|
} else { |
|
|
alert("密碼錯誤!"); |
|
|
} |
|
|
} |
|
|
|
|
|
function promptForTeacherVersion() { |
|
|
const password = prompt("請輸入密碼以進入教師教學版本:"); |
|
|
if (password === "Teacher") { |
|
|
window.location.href = "teacher_version.html"; |
|
|
} else { |
|
|
alert("密碼錯誤!"); |
|
|
} |
|
|
} |
|
|
</script> |
|
|
</body> |
|
|
</html> |