Autor Beitrag
americanaccounts
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 05.05.08 14:21 
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:

ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
americanaccounts Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: 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:

ausblenden 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:

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

oder

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


schreibe

Wenn ich übrigens:
ausblenden 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
americanaccounts Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: Mo 05.05.08 16:48 
Hi hier erstmal die Nachlieferung (nochmal mit der Schleife):

ausblenden 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:

ausblenden 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