2016-12-12 15 views
-4

Der folgende Code ist ein Ausschnitt aus einem Arbeitscode, der für ein Schloss-Labyrinth-Spiel in C# steht. Die if else-Struktur druckt nur korrekt dun.roomend == true). Tow.roomEnd zeigt jetzt an, wann tre.isExit angezeigt werden soll. Der tre.isExit wird überhaupt nicht angezeigt. Ich habe die aktuellen Variablen wie erklärt:Wenn die Else-Anweisung nicht funktioniert

public bool isExit; 
public bool deadEnd; 
public bool roomEnd; 

tre.isExit = true; 
dun.deadEnd = true; 
tow.roomEnd = true; 

if (dun.roomEnd == true) 
{ 
    Console.WriteLine("You've fallen into the Dungeons of the Dead. Try again"); 
    return; 
} 

if (tow.roomEnd == true) 
{ 
    Console.WriteLine("You been caught by the Kings guard and have been placed in the tower for life.Try again"); 
    return; 
} 
else if (tre.isExit == true) 
{ 
    Console.WriteLine("You have found the treaure... now run!!"); 
    return; 
} 
else 
{ 
    Console.WriteLine("Too scared....."); 
} 
+3

schauen Sie sich Ihren Code an und durchlaufen Sie ihn mit dem Debugger und achten Sie auf die Bool-Werte nur auf Ihren Code schaut es immer die erste Wenn und Rückkehr .. – MethodMan

+2

Ich sehe Ihre Frage wurde aber nur ein Tipp auf Ihre beantwortet Syntax. Bei der Bewertung von Bool-Werten in if-Anweisungen muss der Operator "==" nicht verwendet werden. In Ihrem Fall können Sie einfach 'if (dun.roomEnd) {}' schreiben, und das wird dasselbe tun wie 'if (dun.roomEnd == true) {} '. Um zu überprüfen, ob es falsch ist, verwenden Sie vor Ihrer bool-Variable ein '!' (Bekannt als nicht). So essentiell 'if (! Dun.roomEnd)' ist das gleiche wie 'if (dun.roomEnd == false)'. –

+0

Danke dafür, es war wirklich hilfreich. Immer noch mit der Antwort zu kämpfen, da es nicht funktioniert –

Antwort

4

Das ist, weil Sie sofort zurück, wenn eine Ihrer Bedingungen erfüllt ist.

// Don't explicitly compare to true - just write if (dun.roomEnd) 
if (dun.roomEnd == true) 
{ 
    Console.WriteLine("You've fallen into the Dungeons of the Dead. Try again"); 
    // You end the method here, so none of the rest of the code after this will execute 
    return; 
} 

Auch die Tatsache, dass Sie

else if (tre.isExit == true) 

bedeutet tun, dass dies nicht durchführen, wenn

tow.roomEnd == true 

auch wahr ist. "Else if" bedeutet "wenn die aktuelle Bedingung wahr ist und die vorherige Bedingung falsch", so

if (A) { 
    // do work 
} 
else if (B) { 
    // Do work 
} 

ist semantisch äquivalent

if (A) { 
    // Do work 
} 

if (!A && B) { 
    // Do work 
} 

Schließlich I erwähnte dies nebenbei, aber ich möchte wiederholen, dass es nicht notwendig ist ausdrücklich true oder false, zu vergleichen, so

if (tow.roomEnd == true) 

sollte nur sein

if (tow.roomEnd) 

Auch ich glaube nicht, es macht Sinn für alle diese Bedingungen auf einmal wahr sein. Kann etwas tatsächlich ein Raumende, eine Sackgasse und gleichzeitig ein Ausgang sein? Zumindest scheint es, als ob ein bestimmter Ort nicht gleichzeitig Ausgang und Sackgasse sein kann. Wenn die Daten sagen, dass mehrere dieser Dinge auf einmal wahr sind, needs to be corrected, damit das Programm ordnungsgemäß funktioniert.

+0

Entfernen der beiden Rückgabewerte vor dem else if, results in Das gleiche Ergebnis wie zuvor mit den Rückgabewerten –

+0

Stellen Sie sicher, dass Sie das Projekt neu erstellen, nachdem Sie diese Änderung vorgenommen haben. Oder speichern Sie die Datei. Welche Entwicklungsumgebung verwenden Sie? –

+1

@AmberDyer Weil du 'sonst if (tre.isExit == true)' anstatt nur 'if (tre.isExit == true)' hast. 'else if (tre.isExit == true)' * only * wird ausgeführt, wenn 'tow.roomEnd == true' false ist, aber in Ihrem Beispiel ist alles auf 'true' gesetzt. – Quantic

1

In jeder if-Anweisung haben Sie das Schlüsselwort return;. Die return-Anweisung beendet die Ausführung der Methode und deshalb wird nur die erste Console.WriteLine angezeigt.

sorgfältig lesen: return (C# Reference)

0

Lese durch dem, was du getan hast, wenn ich das richtig zu verstehen bin, was sind Sie nach sind wie folgt.

public bool isExit; 
public bool deadEnd; 
public bool roomEnd; 

tre.isExit = true; 
dun.deadEnd = true; 
tow.roomEnd = true; 

if (dun.roomEnd == true) 
{ 
    Console.WriteLine("You've fallen into the Dungeons of the Dead. Try again"); 
} 
else if (tow.roomEnd) 
{ 
    Console.WriteLine("You been caught by the Kings guard and have been placed in the tower for life.Try again"); 
} 
else if (tre.isExit) 
{ 
    Console.WriteLine("You have found the treaure... now run!!"); 
} 
else 
{ 
    Console.WriteLine("Too scared....."); 
} 

return 

Dies wird jede Bedingung einzeln, bewerten und dann einmal komplett zurück.

Was dieser Code effektiv sagt, ist "wenn Bedingung 1 wahr ist, zeige den Text an und verlasse den if-Block und kehre dann zurück. Ansonsten, wenn Bedingung 2 wahr ist, mach dasselbe, Bedingung 3/4 macht dasselbe auch.

ich denke, das ist, was Sie nach dest an. es Refactoring könnte es ein wenig einfacher zu machen, aber nicht über die Zeit, die zur Zeit zu gehen.

+0

Danke dafür, ich schätze es wirklich, es zeigt immer noch die falschen Nachrichten, aber ich werde weiter damit spielen und hoffe, es funktioniert –

0

Unter der Annahme, es zeigt die Dungeons of the Dead und die Kings Guard Nachricht, du musst ein "else" zum if for tow.roomEnd hinzufügen.

Verwandte Themen