ERLEDIGT
JA
JA
ANTWORTEN
15
15
ZUGRIFFE
514
514
EMPFEHLEN
-
Hello,
ich glaub ich seh vor lauter Bäumen den Wald nicht.
Soll als Aufgabe ein Tic Tac Toe spiel machen, nun hab ich 2. Fehler
- Er wechselt nicht den Spieler
- Wenn eine Reihe voll ist gibt der den sieger nicht aus
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
import java.io.*; class TicTacToe { char[][] spielfeld; public TicTacToe() { spielfeld = new char [3][3]; spielfeld[0][0]=' '; spielfeld[0][1]=' '; spielfeld[0][2]=' '; spielfeld[1][0]=' '; spielfeld[1][1]=' '; spielfeld[1][2]=' '; spielfeld[2][0]=' '; spielfeld[2][1]=' '; spielfeld[2][2]=' '; } public static void main(String args[]) { char sieger; char Spieler; TicTacToe spiel = new TicTacToe(); System.out.println("Willkommen bei Tic Tac Toe"); spiel.zeigeSpielfeld(); do { spiel.dasSpiel(); spiel.zeigeSpielfeld(); } while (spiel.Sieger() == ' '); } public void zeigeSpielfeld() { System.out.println(spielfeld[0][0]+"|"+spielfeld[0][1]+"|"+spielfeld[0][2]); System.out.println("-----"); System.out.println(spielfeld[1][0]+"|"+spielfeld[1][1]+"|"+spielfeld[1][2]); System.out.println("-----"); System.out.println(spielfeld[2][0]+"|"+spielfeld[2][1]+"|"+spielfeld[2][2]); System.out.println(""); } public char Sieger() { char sieger = ' '; for (int i = 0; i < 3; i++) { if ((spielfeld[0][i] == spielfeld[1][i]) && (spielfeld[1][i] == spielfeld[2][i])) { sieger = spielfeld[0][i]; } } for (int j = 0; j < 3; j++) { if ((spielfeld[j][0] == spielfeld[j][1]) && (spielfeld[j][1] == spielfeld[j][2])) { sieger = spielfeld[j][0]; } } return sieger; } public void dasSpiel() { int reihe; int spalte; int EingabeCheck = 1; char Spieler = 'x'; String Eingabe; int Umwandlung; do { System.out.println("Bitte geben sie ein Feld ein mit Zahl,Zahl.. z.B 0,2"); System.out.println("0,2 ist z.B oben Rechts, 0,1 ist oben in der Mitte und 0,0 oben Links"); System.out.println("Spieler "+Spieler+" ist am Zug"); Eingabe = getLine(); reihe = Integer.parseInt(Eingabe.substring(0,1)); spalte = Integer.parseInt(Eingabe.substring(2,3)); if (( reihe < 0 || reihe > 2 ) && ( spalte < 0 || spalte > 2 )) { EingabeCheck = 0; System.out.println("ungültige Eingabe, versuch es erneut"); } if (spielfeld[reihe][spalte]!=' ' ) { EingabeCheck = 0; System.out.println("Spielfeld ist schon belegt"); } } while (EingabeCheck == 0); spielfeld[reihe][spalte] = Spieler; if (Spieler == 'x') Spieler = 'o'; else Spieler = 'x'; } /** ****************************************** * Diese Hilfsmethode liest eine Zeile von der Konsole ein * @return eingelesene Zeile (mit Return am Schluss!) als String * Aufruf z.B.: String s; s = getLine(); // in s steht die Eingabe * ************************************************/ static String getLine() { String line =""; try{ BufferedReader Tast = new BufferedReader(new InputStreamReader(System.in)); line = Tast.readLine(); } catch(Exception e) { } return line; } }
Das Programm ist noch nicht fertig, aber wollte schonmal die einfachen Sachen testen.
Was übersehe ich? Mehere Augen sehen mehr als 2...
Der Sieger wird mit
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
public char Sieger() { char sieger = ' '; for (int i = 0; i < 3; i++) { if ((spielfeld[0][i] == spielfeld[1][i]) && (spielfeld[1][i] == spielfeld[2][i])) { sieger = spielfeld[0][i]; } } for (int j = 0; j < 3; j++) { if ((spielfeld[j][0] == spielfeld[j][1]) && (spielfeld[j][1] == spielfeld[j][2])) { sieger = spielfeld[j][0]; } } return sieger; }
Ermittelt und gehört zum while in main()
Der spieler soll eigentlich gewechselt werden, nach dem while in dasSpiel()
Code :1 2 3 4 5
if (Spieler == 'x') Spieler = 'o'; else Spieler = 'x';
das
Code :1
spielfeld[reihe][spalte] = Spieler;
führt er ja aus, nach dem while... un übergibt X an die Position die man gewählt hat.Geändert von phreeak (26.11.11 um 15:56 Uhr)
-
Hi
Also, manche Sachen kann man mit Schleifen kürzer lösen...
Einrückungen wären für die Übersicht von Vorteil.
Bei Sieger fehlt die Diagonal-Überprüfung.
Bei dasSpiel muss die Variable Spieler raus aus der Methode in die Klasse.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
also Spieler als "globale variable" ?! Naja das Problem ist irgendwie er will keine globale variablen, das array nun global gemacht, weil ich kb habe, immer den wert an eine andere funktion zu übergeben.
Wird sollen die werte immer übergeben.
-
Dann mach Spieler im main, wechsel es dort nach jedem Schleifendurchgang
und übergib es von dort aus.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Habs mit der globalen Variablen nun gemacht, mir egal wenn er Probleme damit hat.
Wenn ich es anders mache kommt immer ein fehler..
Allerdings nun nen Problem,
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
public char Sieger() { char sieger = ' '; for (int i = 0; i < 3; i++) { // z.B wenn 0,0 = 1,0 und 1,0 = 2,0 dann // z.B wenn 0,1 = 1,1 und 1,1 = 2,1 dann // z.B wenn 0,2 = 1,2 und 1,2 = 2,2 dann if ((spielfeld[0][i] == spielfeld[1][i]) && (spielfeld[1][i] == spielfeld[2][i])) { sieger = spielfeld[0][i]; } } for (int j = 0; j < 3; j++) { // z.B wenn 0,0 = 0,1 und 0,1 = 0,2 dann // z.B wenn 1,0 = 1,1 und 1,1 = 1,2 dann // z.B wenn 2,0 = 2,1 und 2,1 = 2,2 dann if ((spielfeld[j][0] == spielfeld[j][1]) && (spielfeld[j][1] == spielfeld[j][2])) { sieger = spielfeld[j][0]; } } System.out.println("sieger return "+sieger); return sieger; }
klappt.
Aber wie soll ich das anstellen, dass wenn alle felder belegt sind, er zurück gibt, das es keinen sieger gibt..
ein weiteres if erstellen in Sieger oder ne schleife in dasSpiel bei der eingabe, wenn nach 9 zügen kein Sieger ist, er Sieger = z.B 0 setzt und zurück gibt?!
-
Welcher Fehler kommt, wenn du es anders machst?
Netiquette §15 beachten.
Zum neuen "Problem": Beide Möglichkeiten gehen.
Die zweite ist einfacher.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
hab das Problem schon gelöst, allerdings wollte er, dass ich die Eingabe anders mache.
mit
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/** ****************************************** * Diese Hilfsmethode wandelt einen String in eine ganze Zahl um * @return Zahlenwert des Strings, wenn gültig, sonst -1111 * * Wenn der String keine ganze Zahl ist, * z.B. „12a“ oder „12,2“ oder „12.2“ * wird der Zahlenwert -1111 zurückgegeben * * Aufruf z.B.: int i; i = asInteger(“12”); // i hat den Wert 12 ************************************************/ static int asInteger(String s) { int i; try { i = Integer.parseInt(s); } catch (Exception e) { i = -1111; } return i; }
also das er den String in ein Int umwandelt..
so allerdings, muss ich ja, wenn ich nen feld angebe 2 zahlen angeben, also z.B 12 (2 reihe, letztes Feld)
Das klappt auch soweit,
mit
Code :1 2 3 4
Eingabe = getLine(); Umwandlung = asInteger(Eingabe); reihe = Integer.parseInt(Integer.toString(Umwandlung).substring(0,1)); spalte = Integer.parseInt(Integer.toString(Umwandlung).substring(1,2));
allerdings ergibt sich das Problem,wenn ich z.B die 1 spalt (0) ansprechen will mit dem ersten oder zweiten oder dritten kästen. also 01, 02, 03 liefert der asInteger ja nur 1, 2, 3 zurück und lässt die 0 verschwinden und dann springt das Programm ausm spiel, da er für:
Code :1 2
reihe = Integer.parseInt(Integer.toString(Umwandlung).substring(0,1)); spalte = Integer.parseInt(Integer.toString(Umwandlung).substring(1,2));
keine weitere Zahl für Spalte hat.
wie kann man das lösen?!
-
Math. ist 000123 eben das Gleiche wie 123.
Ud liest die Einage per String ein,
wandelst sie i int um, wandelst das int wieder in String um,
nur um die Substrings wieder in int umzuwandeln?
Warum nicht einfach so:
Für die Strennstelle suchst du besser nach Leerzeichen oder so...Code java:
dort dann mit substring trennen.
GrußNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Das hab ich auch noch zurzeit und klappt wunderbar
Code :1 2 3
Eingabe = getLine(); reihe = Integer.parseInt(Eingabe.substring(0,1)); spalte = Integer.parseInt(Eingabe.substring(2,3));
Allerdings steht auf dem Aufgaben Blatt (pdf)
Ka wieso er das so will. Letzteres benutz ich zur Eingabe, das wars dann aber auch.Für das Einlesen des Spieler-Inputs von der Tastatur und die Umwandlung eines String in ein int verwenden Sie die gleichen Funktionen wie im Termin 6.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
3.3 Einen String in ein int umwandeln /** ****************************************** * Diese Hilfsmethode wandelt einen String in eine ganze Zahl um * @return Zahlenwert des Strings, wenn gültig, sonst -1111 * * Wenn der String keine ganze Zahl ist, * z.B. „12a“ oder „12,2“ oder „12.2“ * wird der Zahlenwert -1111 zurückgegeben * * Aufruf z.B.: int i; i = asInteger(“12”); // i hat den Wert 12 ************************************************/ static int asInteger(String s) { int i; try { i = Integer.parseInt(s); } catch (Exception e) { i = -1111; } return i; }
mit
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14
/** ****************************************** * Diese Hilfsmethode liest eine Zeile von der Konsole ein * @return eingelesene Zeile (mit Return am Schluss!) als String * Aufruf z.B.: String s; s = getLine(); // in s steht die Eingabe * ************************************************/ static String getLine() { String line =””; try{ BufferedReader Tast = new BufferedReader(new InputStreamReader(System.in)); line = Tast.readLine(); } catch(Exception e) { } return line; }
so wie ich es gerade habe, ist das so, das ich Spalte, Zahl eingebe in der Konsole. Also 0,1 z.B
btw.. 2 kleine Fragen. wie kann ich ein Array überprüfen ob alle Felder belegt sind, also nen 2 dimensionales... meins heisst,
Code :1
spielfeld[reihe][spalte]
dachte ja an einer for schleife die bis 3 geht und dann
Code :1
spielfeld[i][0]!=' '
aber find zu dem Thema auch nix.. ;PGeändert von phreeak (28.11.11 um 18:22 Uhr)
-
Zu der Einabe:
Vllt. sollst du die Zwei Zahlen ja auch komplett getrennt einlesen, nicht in der gleiche Zeile?
Zu Überprüfen des kompletten Arrays:
Code java:1 2 3 4 5 6 7 8 9 10 11 12
bool voll = true; for(int i = spielfeld.length - 1; i >= 0; i--) { for(int j = spielfeld[i].length - 1; j >= 0; j--) { if(spielfeld[i][j] == ' ') voll = false; } } ... if(voll) //Alles besetzt else //Noch was frei
Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
ahh vielen dank.
hatte es ohne getestet. kein wunder das es nicht klappte.
dachte, wenn ich nach dem
Code :1
if(spielfeld[i][j] == ' ')
es direkt zurück gebe würde es reichen.
nun klappts aber
ne in der aufgabe steht nix davon, das man es getrennt eingibt.
in dem asIntger Javadoc steht ja auch als bspl.
und 12 denk ich mal ist die 2 reihe letzte spalte mit gemeint. also sollte man es in einer Zeile schon angeben.Aufruf z.B.: int i; i = asInteger(“12”); // i hat den Wert 12
-
Ah, jetzt wieder daran erinnert, dass es ja um TicTacToe geht

Prüf zuerst, ob auch wirklich zwei Ziffern eingegeben wurden (das int ist >9 und <100).
Dann bekommst du die erste Ziffer mit "i/10" und die zweite mit "i%10".
GrußNetiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
jein oder? geht ja darum das er bei der ersten spalte meckert, weil die ja mit 00 01 02 angewählt wird und java die 0 dnn immer unterm tisch kehrt wenn er es vom string in ein int umwandelt und es als 1 2 3 sieht. oder versteh ichs grad anders?
-
Bitte die Netiquette beachten, Punkt 15. Danke.
Und doch, das geht schon. Probiers doch einfach mal aus.
Angenommen, du gibst 02 ein.
Die fertige Funktion nimmt das als String und wandelt es in int um.
Wenn du das im main etc. dann als "int i" hast,
bekommst du mit "i/10" 0 und mit "i%10" 2.
0 und 2.
02.
Du solltest nur zusätzlich noch prüfen, ob eine passende Zahl eingegeben wurde.
Nicht 89123 oder so.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
Wo finde ich die Netiquette ?! ^_^
naja habs nun geschafft..
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
public static char dasSpiel(char Spieler) { int reihe = 0; int spalte = 0; boolean EingabeCheck = false; char sieger = ' '; int Umwandlung = 0; String Umwandlung1; String Eingabe; // int Umwandlung; System.out.println("Willkommen bei Tic Tac Toe"); zeigeSpielfeld(); System.out.println("Bitte geben sie ein Feld ein mit Zahl,Zahl.. z.B 0,2"); System.out.println("0,2 ist z.B oben Rechts, 0,1 ist oben in der Mitte und 0,0 oben Links"); do { do { System.out.println("Spieler "+Spieler+" ist am Zug"); Eingabe = getLine(); Umwandlung = asInteger(Eingabe); if (Umwandlung == -1111) { System.out.println("Ungültige Eingabe. Bitte versuch es erneut"); EingabeCheck = true; } // if end else { Umwandlung1 = Integer.toString(Umwandlung); if (Umwandlung1.length() == 1) { Umwandlung1 = 0+Umwandlung1; } // if end reihe = Integer.parseInt(Umwandlung1.substring(0,1)); spalte = Integer.parseInt(Umwandlung1.substring(1,2)); EingabeCheck = EingabePruefen(reihe, spalte); } //Ende Else } // ende 2. Do while (EingabeCheck == true); spielfeld[reihe][spalte] = Spieler; Spieler = SpielerZug(Spieler); zeigeSpielfeld(); } // ende 1. Do while (Sieger() == ' '); sieger = Sieger(); if (sieger == '?') { System.out.println("Unentschieden"); } else { System.out.println("Spieler "+sieger+" hat gewonnen"); } return Spieler; }
so funktioniert alles reibungslos in der Funktion und er gibt alles zurück. Sollte vlt nurnoch ne überprüfung machen, ob reihe und spalte auch zwischen 0 2 liegen und nicht darüber. Aber davon stand nix in der aufgabe xD
Ähnliche Themen
-
Probleme mit dem IE
Von Freetoast im Forum CSSAntworten: 3Letzter Beitrag: 18.02.08, 12:33 -
Probleme mit RGB
Von julzzzzz im Forum PhotoshopAntworten: 2Letzter Beitrag: 03.04.07, 16:44 -
Probleme mit ICQ
Von Scarlett im Forum Office-AnwendungenAntworten: 1Letzter Beitrag: 18.05.04, 00:05 -
Premiere Pro Export probleme / Projekt Probleme
Von DanielT im Forum Videoschnitt, Videotechnik & -produktionAntworten: 5Letzter Beitrag: 31.10.03, 17:48 -
Probleme mit cout (War: Probleme bei meinem Programm)
Von DöDö im Forum C/C++Antworten: 6Letzter Beitrag: 21.05.03, 12:49





Zitieren

Login





