Entwickler-Ecke

C# - Die Sprache - TicTacToe - Abfrage, ob das Feld besetz ist


americanaccounts - Mo 05.05.08 14:21
Titel: TicTacToe - Abfrage, ob das Feld besetz ist
Hi C-Sharp-Forum,

also ich programmiere gerade ein TicTacToe spiel, es "funktioniert" auch soweit so gut, allerdigns hapert es gerade an der Abfrage, ob das Spielfeld besetzt ist.

Bevor ich zu meinem Problem komme, erläutere ich erstmal das Prinzip meines TicTacToe's:
Ich erzeuge ein 1-dimensionales-Array und gebe dieses via Console.WriteLine aus.
Das Spielfeld sieht dann so aus:
1 2 3
4 5 6
7 8 9

Dann kann der Spieler eine Zahl angeben, z.B. 2 und die Zahl 2 auf dem Spielfeld wird durch ein X bzw. ein O ersetzt.
Damit man nicht auf ein Feld setzen kann, dass schon besetzt ist, soll eigentlich diese Abfrage greifen..was sie aber nicht tut.

Hier mein Code:


C#-Quelltext
1:
2:
3:
4:
5:
6:
do
  {
  Console.WriteLine("Spieler1: Gib eine Zahl von 1 - 9:");
  i = Convert.ToInt32(Console.ReadLine());
  }
  while (spielfeld[i] == 'O' || spielfeld[i] == 'X');


Um Missverständnisse gleich auszuschließen, hier mal meine Definition wie ich meinen Code verstehe:

Frage solange nach einer (neuen) Zahl bis die Spielfeldzahl so ist, dass die angegebene Zahl NICHT mit einem X oder O besetzt ist.

Ähm naja jetzt was in meinem Programm passiert ist:
Ich setzte mein X z.B. aufs Spielfeld 1, dann ist Spieler 2 dran und der setzt auf Spielfeld 2..dann sieht das so aus:

X O 3
4 5 6
7 8 9

Wenn ich jetzt mit Spieler1 auf das Spielfeld 1 setze, kommt die gewollte Wiederholung und nichts passiert, Spieler1 ist nochmal dran, solange er nicht nen vernüftigen Zug setzt. Wenn er jetzt allerdings auf Spielfeld 2 setzt, dann wird das O einfach überschrieben.

Dann steht da X X 3 usw.

Naja was ich noch festgestellt habe, es ist kein Unterschied, ob ich den oben genannten Code benutze oder die letze Zeile so gestalte:

C#-Quelltext
1:
 while (spielfeld[i] == 'O');                    


Wenn jmd. noch weitere Codeteile benötigt, einfach fragen.
Wenn was unklar ist, einfach fragen.

Hoffe auf Hilfe :)

lg micha

Moderiert von user profile iconNarses: Code- durch C#-Tags ersetzt


Th69 - Mo 05.05.08 15:51

Die Abfrage ist so korrekt, aber hast du evtl. Null '0' statt den Buchstaben 'O' geschrieben?

Ein anderer Grund könnte der Index beim Zugriff auf das Spielfeld sein (da die Indizes bei C# mit Null (0) beginnen, nicht mit 1).
Wie sieht denn die Definition des Spielfeldes und die Ausgabe aus?


Christian S. - Mo 05.05.08 15:52

Hallo und :welcome:!

Könntest Du noch den Code-Teil posten, in dem das Feld des spielfeld-Arrays gesetzt wird? Danke! :-)

Grüße
Christian


americanaccounts - Mo 05.05.08 16:07

Hi,

danke fürs Wilkommen heißen, werde hier wohl jetzt öfter rumgurken ;)
Also hier die Definition für mein Spielfeld, also die Array's:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
            char[] spielfeld = new char[9];
            spielfeld[0] = '1';
            spielfeld[1] = '2';
            spielfeld[2] = '3';
            spielfeld[3] = '4';
            spielfeld[4] = '5';
            spielfeld[5] = '6';
            spielfeld[6] = '7';
            spielfeld[7] = '8';
            spielfeld[8] = '9';


Ähm Null und "O" (O wie Ohrring *g*) wurden nicht vertauscht, überall wo ein "O" stehen soll, steht auch ein O.

EDIT: Also was mich verwundert ist, dass es egal ist, ob ich:


C#-Quelltext
1:
2:
3:
4:
5:
while (spielfeld[i] == 'O');

oder

while (spielfeld[i] == 'O' || spielfeld[i] == 'X' );


schreibe

Wenn ich übrigens:

C#-Quelltext
1:
while(spielfeld[i] == 'X');                    

schreibe, dann kann ich alles überschreiben

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Christian S. - Mo 05.05.08 16:15

Hallo!

Der Fehler dürfte da liegen, wo Th69 sagte: Die Indizes Deines Arrays gehen von 0..8, Du lässt den Benutzer aber Zahlen von 1..9 eingeben. Du musst also abfragen, ob spielfeld[i-1] == 'X' ist.

Wenn Du den Fehler beim setzen des Feldes auch machst (bitte noch nachliefern, wo Du X oder O in das Array schreisbt :-)), dann sollte das erst was ausmachen, wenn Du außerhalb der Array-Grenzen was machen willst :gruebel: (Das solltest Du eh irgendwo abfragen, dass niemand 42 eingibt ;))

Grüße
Christian


americanaccounts - Mo 05.05.08 16:48

Hi hier erstmal die Nachlieferung (nochmal mit der Schleife):


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
do
                {
                    Console.WriteLine("Spieler1: Gib eine Zahl von 1 - 9:");
                    i = Convert.ToInt32(Console.ReadLine());
                }
                while (spielfeld[i] == 'O' || spielfeld[i] == 'X');

                i = i - 1

                spielfeld[i] = 'X';

                Console.Clear();
                Console.WriteLine(spielfeld[0] + "............." + spielfeld[1] + "............." + spielfeld[2]);
                Console.WriteLine(spielfeld[3] + "............." + spielfeld[4] + "............." + spielfeld[5]);
                Console.WriteLine(spielfeld[6] + "............." + spielfeld[7] + "............." + spielfeld[8]);


Ich probiere mal deine Schreibweise aus (weiß ja nicht, ob sich da im Endeffekt was nimmt).

Die Abfrage, ob es sich um eine Zahl von 1-9 handelt, kommt auch noch, hatte davon schonmal einen Prototyp, der eign. ganz gut funktionierte.

lg micha

EDIT: Ja es funktioniert, jetzt habe ich auch meinen Fehler verstanden und verstehe was du genau meintest. Vielen vielen Danke!!

Für alle Leute, die vllt noch über die Suchfunktion über diesen Thread stolpern, die Lsg. muss so aussehen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
do
  {
  Console.WriteLine("Spieler1: Gib eine Zahl von 1 - 9:");
  i = Convert.ToInt32(Console.ReadLine());
  }
  while (spielfeld[i-1] == 'O' || spielfeld[i-1] == 'X');


Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt