Monty-Hall-Spiel
Ich bin ein neuer Programmierer gerade dabei, Java zu lernen. Ich habe ein Spiel hier basiert auf dem Spiel Let ' s make a deal & die monty-hall-problem (https://www.youtube.com/watch?v=mhlc7peGlGg) und ich habe schon Probleme mit der Logik für diesen code. Scheint alles zu funktionieren, außer dass ich kann nicht scheinen, um die user_door wechseln auf die andere Tür und festzustellen, ob Sie ein Gewinner richtig. Wenn jemand kann mir helfen zu verstehen, was ich falsch mache hier, ich würde gerne diese Gelegenheit nutzen, um zu lernen, danke!
import java.util.Random;
import java.util.Scanner;
public class GameShow {
public static void main(String[] args) {
Scanner scan = new Scanner (System.in);
Random generator = new Random();
//Initialize Variables
int user_door,
open_door,
other_door,
prize_door;
//Generate random value 1-3
prize_door = generator.nextInt(3)+1;
open_door = prize_door;
while(open_door == prize_door){
open_door = generator.nextInt(3)+1;
}
other_door = open_door;
while (other_door == open_door || other_door == prize_door){
other_door = generator.nextInt(3)+1;
}
//Begin Game
System.out.println("*** Welcome to the game show! ***");
System.out.println("Select the door (1, 2, or 3): ");
user_door = scan.nextInt();
//User Validation
if (user_door > 3 || user_door < 0) {
System.out.println("Please select door 1, 2, or 3");
user_door = scan.nextInt();
} else if(user_door == 1 || user_door == 2 || user_door == 3) {
//Continue Game
System.out.println("\nIn a moment, I will show you where the prize is located,");
System.out.println("but first I will show you what is behind one of the other doors");
//Continue Dialogue
System.out.println("\nBehind door number " + open_door + " are goats!");
System.out.println("You selected door number " + user_door);
System.out.println("\nWould you like to switch your door(y/n)? ");
//User Input Yes or No
char userReply = scan.next().charAt(0);
//If statement with nested while statements for user input
if (userReply == 'y'){
user_door = other_door;
} while(userReply != 'y' && userReply != 'n')
{
//User Validation
System.out.println("Please enter either y/n");
userReply = scan.next().charAt(0);
}
System.out.println("The prize is behind door number: " + prize_door);
//Check to see if user won or lost
if(user_door == prize_door){
System.out.println("Congratulations! You won the prize!");
} else {
System.out.println("Sorry. You lost.");
}
}
}
}
- Haben Sie versucht, einen debugger Anhängen und Schritt durch den code Zeile für Zeile zu sehen, an welcher Stelle genau, das Programm abweichend von Ihrer Erwartung, was er tun soll?
- Sind Sie mit Eclipse?
- Ich bin dabei ein code-review durch Ihre Arbeit im moment. Es ist ein bisschen mehr zu verfolgen, das problem, also werde ich erklären, einige der Dinge, die man optimieren könnte in ein paar Minuten.
- Wenn Sie mit Eclipse zu sehen, der Variablen gehen Sie zu Fenster -> Show View -> Variablen, oder alternativ drücken Sie Alt+Umschalt+Q,V
- Ja, ich bin auf eclipse und wird versuchen, dass so schnell wie möglich! Danke für die Hilfe
- Wenn Sie sind besorgt über andere Leute, die auf Ihre Klasse zu teilen Ihren code nicht veröffentlichen Sie Ihren code auf eine öffentliche Seite im internet. Versucht zu Bearbeiten, aus den Antworten der beteiligten, nachdem Sie erhalten Ihre Antwort zu vermeiden, jemand lernen die gleichen Dinge, die Sie getan haben ist SO gegen die Politik. Neben selbst dann können die Leute sehen, die source-code-suchen Sie in edit-history.
- Selbst wenn es bearbeitet wird, Sie ist eine öffentliche edit-history ist verfügbar für die google-Suchmaschine und es ist SO gegen die Politik als t0mppa erwähnt
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Stimme mit dem, was Srikanth oben gesagt. Die Sache, die fehlt, ist der Teil, wo Sie testen Sie die Benutzer Antwort. schalten Sie den "if" und "while" - Anweisungen. Dies wird helfen, lösen Sie Ihre Tür schalten problem.
Bevor
Änderung
Den Weg, den Sie Taten es nur die erste Zeit ein Zeichen eingegeben wurde. Wenn Sie es Taten, falsch und versucht, es wieder zu tun, dann würde es nicht schalten Sie die Türe, denn Sie waren Vergangenheit, Teil des Programms.
Sie nie richtig zuordnen die andere Tür. Die andere Tür, die Sie zugewiesen haben, ist eine zufällige Zahl, und auch Ihre Umsetzung nicht richtig beschreiben, das Monty-Hall-Problem.
Ein Beispiel, Bricht das Programm
Also sagen wir mal Preis-Tür = 1, Tür öffnen = 2, dann andere Türen = 3 standardmäßig.
Lassen Sie uns sagen, das der Anwender wählt Tür 2. Dann, wenn die Tür 2 geöffnet ist, gibt es eigentlich 2 mögliche andere Türen: 1 und 3.
Ist ein wichtiger Teil der Monty-Hall-Problem ist, dass eine Tür, die Benutzer nicht ausgewählt hat wird geöffnet.
Wenn Sie den Benutzer auswählen, der die Tür, die Sie benötigen, um zu bestimmen, was die other_door ist dann. Dieser code war etwas schwer zu Folgen, also werde ich gehen über einige Themen, die ich gefunden, während versucht zu finden, Ihr Problem.
Preis-Tür-Generation
Dieser code weist die prize_door richtig, aber der rest muss nicht sein, noch nicht fertig. Wir vereinfachen die Implementierung dieser.
Dies ist einfacher zu verwalten als 3 Variablen, und weniger abhängig von der Zufälligkeit. Wir brauchen nur zu verfolgen, die Auswahl der Tür, und die Tür, die den Preis hinter sich.
Bekommen die User die Tür
Ihre Benutzer-Validierung fehl, wenn ich versuche, geben Sie 4, nachdem er gesagt, nicht zu. Sollten Sie lock Sie in die Schleife, bis Sie wählen eine Tür.
Dieser entfernt auch Ihre Notwendigkeit für eine wenn, da die Zahl 1, 2 oder 3 nach verlassen der Schleife
Immer die Tür zu Öffnen,
Zu diesem Zeitpunkt, wir haben zwei zahlen instanziiert.
Zu diesem Zeitpunkt in der ursprünglichen Monty-Hall-Spiel, Sie soll die Tür zu öffnen, dass die Auswahl nicht ausgewählt hat. Die Benutzer, die Tür wird nie geöffnet. In diesem Fall haben wir zwei Eingänge, user_door und prize_door
Mit kitschig-Logik, können wir bestimmen, welche Tür zu öffnen, indem Sie Sie zusammen, oder Sie können tun, eine wahre, wenn zu überprüfen. Ich Stelle kitschig, da es schneller zu schreiben und macht immer noch Sinn.
Nicht-kitschig option:
Immer die Tür, die Sie Wechseln können,
Mithilfe der offenen Tür und der ursprünglichen Tür, wir können wählen Sie die ausgeschaltet Tür, als die Tür diese zwei sind nicht die, die Sie wechseln.
Feststellen, ob der Benutzer gewonnen hat,
Gleiche wie vorher:
Keine Probleme mit diesem.
if(prize_door + user_door == 4) { // 1 and 3 open_door = 2; }
die Tür auch geöffnet werden! B: Wenn Sie bei der Auswahl der richtigen Tür, einer der beiden anderen Türen sollten zufällig gewählt werden. Wenn ich wähle Tür 2 und Tür 3 öffnet, ich weiß, der Preis hinter Tür 1, da wenn der Preis sich hinter Tür 2, Tür 1 geöffnet haben!Ich habe einige code-Optimierung und vor allem habe ich es gelöst. Die Fehler, die Sie in Ihrem code, der weiter unten erklärt wird.
Sollten Sie zuweisen, nur die
prize_door
vor Anreiseuser_door
nach dem aufstehen dieuser_door
ordnen Sie dieopen_door
und auch dieother_door
wenn Sie wählen, wechseln Ihre Tür.Lets verstehen, was dein code führt Schritt für Schritt durch eine Beispiel
Nehmen wir an der generator weist 2 bis
price_door
Vermuten lässt nach der Schleife der generator weist 1 bis
open_door
Vermuten lässt nach der Schleife der generator weist 3 bis
other_door
Lässt erinnern an die Werte der Variablen
open_door = 1
other_door = 3
prize_door = 2
Vermuten lässt Benutzer 1
user_door = 1
Hier, die Sie öffnen Tür 1 (
open_door = 1
) das ist das gleiche wie dieuser_door = 1
Das ist falsch, nach der Logik des Spiels
Müssen Sie ändern Sie die Auswahl von Türen basiert auf die Eingabe des Benutzers, denn als Gastgeber wissen Sie, wo das Auto/gold ist und wo die Ziege ist, die fehlt im Programm
Sollte man die
prize_door
bevor das Spiel beginnt, die Sie tun korrekt, aber dieopen_door
undother_door
sollte entschieden werden, basierend auf deruser_door
prize_door
richtig? Ebenfalls vielen Dank für die Zeit nehmen, um zu helfen! Es zu schätzen wissenIF (prize_door == 1) other_doors[] = {2,3}
Viele Antworten, viele Dinge hingewiesen, wie falsch oder unwirksam (irgendwie noch niemand kommentiert Randomisierung 3 Elemente auf diese Weise, anstatt einfach mischen Sie einmal basierend auf einem randomizer), aber es hat niemand explizit löste die Frage: "...außer, dass ich kann nicht scheinen, um die user_door wechseln auf die andere Tür.."
Die drei Türen sind beschriftet
prize_door
,open_door
, undother_door
.user_door
werden kann, eine diese. Das ist falsch, aber was solls.Den Aussagen, die hier änderungen
user_door
zu den spezifischen Wertother_door
(die nicht-Preis geschlossene Tür), ohne Bezug, was der Wert vonuser_door
ist. Es sollte ändern Sie es vonprize_door
zuother_door
- und Umgekehrt.Abgesehen
user_door == open_door
, das sollte ja auch nicht vorhanden.