| <html> |
| <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> |
| <style> |
| button { |
| font-size: 80px; |
| width: 33.33%; |
| } |
| |
| div { |
| white-space: pre; |
| border-style: solid; |
| line-height: 2; |
| font-size: 20px; |
| } |
| </style> |
| <body> |
| <script> |
| const buttons = []; |
| const doors = []; |
| const massGameCount = 100; // liczba gier uruchamianych po kliknięciu przycisków „automatycznych” |
| let winningDoor; // numer bramka z nagrodą (samochód) |
| let doorSelected; // numer bramki wybranej przez gracza |
| let doorRevealed; // numer bramki odsłoniętej przez prowadzącego |
| let mode; // wybór użytkownika: zachowaj lub zmień |
| // tylko dla celów statystycznych: liczba rozegranych gier i odpowiednie wygrane: |
| let keepGames = 0; |
| let changeGames = 0; |
| let keepWins = 0; |
| let changeWins = 0; |
| |
| function initGame() { |
| textBar.textContent = "Wybierz bramkę"; |
| keepButton.hidden = true; // ukryj wszystkie przyciski |
| changeButton.hidden = true; |
| massKeepButton.hidden = true; |
| massChangeButton.hidden = true; |
| mode = "keep"; // tryb gry "zachowaj" vs "zmień" |
| |
| for (let i = 0; i < 3; i++) { // wyświetl 3 zamknięte bramki, szare i aktywne: |
| buttons[i].innerHTML = "🚪"; |
| buttons[i].style.background = 'grey'; |
| buttons[i].disabled = false; |
| doors[i] = "goat"; |
| // początkowo wszystkie bramki mają kozę |
| } |
| winningDoor = Math.floor(Math.random() * 3); // zastąp kozę za losową bramką nagrodą - samochodem |
| console.log('Bramka z nagrodą: ' + winningDoor); |
| } |
| |
| function doorClick(index) { |
| // gracz wybiera pierwszą bramkę |
| console.log('Wybrana bramka: ' + index); |
| doorSelected = index; |
| buttons[index].style.background = 'green'; |
| textBar.textContent = "Wybrałeś zieloną bramkę.\nProwadzący odsłonił inną bramkę z kozą.\nCzy chciałbyś zmienić swój wybór (na szarą bramkę) czy zachować pierwotny wybór?"; |
| keepButton.hidden = false; |
| changeButton.hidden = false; |
| // prowadzący losowo odsłania jedna bramka z kozą: |
| doorRevealed = "none"; // początkowo żadne bramki nie są odsłonięte |
| let direction = -1; // początkowo załóż kierunek wyszukiwania od prawej do lewej |
| let currentDoor = 2; // zacznij od bramki z prawej |
| if (Math.random() < 0.5) { // 50% prawdopodobieństwa zmiany kierunku |
| direction = 1; // odwróć kierunek |
| currentDoor = 0; // przełącz na bramkę z lewej |
| } |
| |
| for (let i = 0; i < 3; i++) { // sprawdź każdą bramkę |
| buttons[i].disabled = true; |
| // jeśli to nie jest bramka wygrywająca, nie wybrane przez użytkownika i żadne bramki nie zostały jeszcze odsłonięte: |
| if (currentDoor !== winningDoor && currentDoor !== doorSelected && doorRevealed == "none") { |
| buttons[currentDoor].innerHTML = "🐐"; // odsłoń bramkę |
| doorRevealed = currentDoor; |
| console.log("Odsłonięta bramka: " + doorRevealed); |
| } |
| currentDoor = currentDoor + direction; |
| // kontynuuj wyszukiwanie w tym samym kierunku |
| } |
| } |
| |
| function listenerForI(i) { |
| // dodaj nasłuchiwacz kliknięć do każdego przycisku |
| buttons[i].addEventListener('mousedown', function() { |
| doorClick(i); |
| }, false); |
| } |
| |
| function runMassGames(massMode) { |
| // automatycznie uruchom wiele gier |
| for (let i = 0; i < massGameCount; i++) { |
| initGame(); |
| doorClick(Math.floor(Math.random() * 3)); |
| // wybierz losową bramkę dla gracza |
| if (massMode == "change") { |
| // gra typu "zmień" |
| changeButton.click(); |
| } else { |
| keepButton.click(); |
| // gra typu "zachowaj" |
| } |
| } |
| } |
| |
| for (let i = 0; i < 3; i++) { |
| // utwórz przyciski do wyświetlania bramek |
| buttons[i] = document.createElement('button'); |
| document.body.appendChild(buttons[i]); |
| listenerForI(i); |
| } |
| |
| const textBar = document.createElement('div'); |
| // do wyświetlania wiadomości dla gracza |
| document.body.appendChild(textBar); |
| |
| const keepButton = document.createElement('div'); |
| // div używany jako przycisk do wyboru trybu gry "zachowaj" |
| keepButton.textContent = 'Kliknij tutaj, aby zachować zieloną bramkę'; |
| document.body.appendChild(keepButton); |
| |
| const changeButton = document.createElement('div'); |
| // div używany jako przycisk do wyboru trybu gry "zmień" |
| changeButton.textContent = 'Kliknij tutaj, aby zmienić na szarą bramkę'; |
| document.body.appendChild(changeButton); |
| |
| const massChangeButton = document.createElement('div'); |
| massChangeButton.textContent = 'Kliknij tutaj, aby automatycznie uruchomić 100 gier typu "Zmień"'; |
| document.body.appendChild(massChangeButton); |
| |
| const massKeepButton = document.createElement('div'); |
| massKeepButton.textContent = 'Kliknij tutaj, aby automatycznie uruchomić 100 gier typu "Zachowaj"'; |
| document.body.appendChild(massKeepButton); |
| |
| // zdefiniuj zachowanie każdego przycisku/diva: |
| textBar.onclick = initGame; |
| |
| massChangeButton.onclick = function() { |
| runMassGames("change"); |
| } |
| ; |
| |
| massKeepButton.onclick = function() { |
| runMassGames("keep"); |
| } |
| ; |
| |
| keepButton.onclick = function() { |
| // gracz wybiera grę typu "zachowaj" |
| keepButton.hidden = true; |
| changeButton.hidden = true; |
| for (let i = 0; i < 3; i++) { |
| if (i == winningDoor) { |
| buttons[i].innerHTML = '🚗'; |
| } else { |
| buttons[i].innerHTML = "🐐"; |
| } |
| } |
| if (mode == "change") { |
| // zaktualizuj statystyki |
| changeGames++; |
| } else { |
| keepGames++; |
| } |
| if (doorSelected == winningDoor) { |
| textBar.textContent = "Wygrałeś!\nKliknij tutaj, aby zrestartować."; |
| console.log("Wygrana"); |
| if (mode == "change") { |
| changeWins++; |
| } else { |
| keepWins++; |
| } |
| } else { |
| textBar.textContent = "Przegrałeś!\nKliknij tutaj, aby zrestartować."; |
| console.log("Przegrana"); |
| } |
| let stats = "\n\nGry, w których zachowałeś początkową bramkę: " + keepGames; |
| stats = stats + "\nWygrane w grach 'zachowaj': " + keepWins; |
| if (keepGames) { |
| stats = stats + "\nProcent wygranych w grach 'zachowaj': " + Math.floor(keepWins / keepGames * 100); |
| } |
| stats = stats + "\nGry, w których zmieniłeś bramkę na inną: " + changeGames; |
| stats = stats + "\nWygrane w grach 'zmień': " + changeWins; |
| if (changeGames) { |
| stats = stats + "\nProcent wygranych w grach 'zmień': " + Math.floor(changeWins / changeGames * 100); |
| } |
| textBar.textContent = textBar.textContent + stats; |
| console.log('----------------------'); |
| massKeepButton.hidden = false; |
| massChangeButton.hidden = false; |
| } |
| ; |
| |
| changeButton.onclick = function() { // gracz wybiera grę typu "zmień": |
| mode = "change"; |
| buttons[doorSelected].style.background = 'gray'; |
| let newReveal; |
| for (let i = 0; i < 3; i++) { |
| if (i !== doorSelected && i !== doorRevealed) { // zmień wybraną bramkę na te nieodsłonięte |
| newReveal = i; |
| console.log("Zmiana na bramkę " + newReveal); |
| } |
| } |
| doorSelected = newReveal; |
| buttons[doorSelected].style.background = 'green'; |
| keepButton.onclick(); // kontynuuj tak, jakby to była gra typu "zachowaj" |
| } |
| ; |
| |
| initGame(); // zainicjuj pierwszą grę |
| |
| </script> |
| </body> |
| </html> |
Cały kod jest udostępniony na licencji