2Danke
ERLEDIGT
JA
JA
ANTWORTEN
8
8
ZUGRIFFE
291
291
EMPFEHLEN
-
21.12.11 20:08 #1
- Registriert seit
- Nov 2011
- Beiträge
- 148
Mein Problem ist das wenn ich das Programm(TicTacToe) starte und den Mehrspieler Modus wähle und dann das Feld ein aussuche das das Feld ein nicht auf x gesetzt wird sonder Falsch Eingabe gemeldet wird. Um es besser zu verstehen eben selber Compilieren.
Ich hab mit bei der Setzen Funktion ganz schön verhaspelt und wollte fragen wie ihr das gemacht hättet.
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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
#include <iostream> #include <conio.h> #include <Windows.h> using namespace std; void Render(char *f); char Setzen(char eingabe, char *f, bool player_turn); int main() { //********************************************// //Variablen //********************************************// bool player_turn = true; int gewinn = 0; char ki; char eingabe; char zeichen; bool exit = false; char f[9]; for(int i = 0; i < 9; i++) { f[i] = i+49; } cout << "TicTacToe" << endl; cout << "Waehle eine Spiel Modus aus:" << endl << "0: mehr Spieler Modus" << endl << "1: gegen Computer einfach" << endl << "2: gegen Computer schwerer als einfach" << endl << "3: gegen Computer mittel" << endl << "4: gegen Computer leichter als schwer" << endl << "5: gegen Computer schwer" << endl; ki = getch(); //********************************************// //Game_Loop //********************************************// if(ki == '0') { while(!exit) { system("cls"); Render(f); if(player_turn == true) { cout << "Spieler 1 ist dran. Bitte waehle ein Feld: "; zeichen = 'x'; } if(player_turn == false) { cout << "Spieler 2 ist dran. Bitte waehle ein Feld: "; zeichen = 'o'; } eingabe = getch(); Setzen(eingabe, f, player_turn); } } else if(ki == '1') { while(!exit) { } } else if(ki == '2') { while(!exit) { } } else if(ki == '3') { while(!exit) { } } else if(ki == '4') { while(!exit) { } } else if(ki == '5') { while(!exit) { } } return 0; } void Render(char *f) { cout << f[0] << "|"<< f[1]<< "|"<< f[2]<< endl; cout << "-" << "+" << "-" << "+" << "-" << endl; cout << f[3] << "|"<< f[4]<< "|"<< f[5]<< endl; cout << "-" << "+" << "-" << "+" << "-" << endl; cout << f[6] << "|"<< f[7]<<"|"<< f[8]<< endl; } char Setzen(char eingabe,char *f, bool player_turn) { if(eingabe == f[eingabe]) { if(player_turn == true)f[eingabe] = 'x'; if(player_turn == false)f[eingabe] = 'o'; } else { while(true) { system("cls"); Render(f); cout << "Bitte wähle ein anderes Feld da diese besetzt ist: "; eingabe = getch(); if(eingabe >= 49 && eingabe <= 57) { if(f[eingabe] == eingabe) { if(player_turn == true)f[eingabe] = 'x'; if(player_turn == false)f[eingabe] = 'o'; break; } } else { system("cls"); Render(f); cout << "Falsche eingabe! Bitte wähle ein Feld von 1-9: "; eingabe = getch(); } } } return eingabe, *f; }
Mit freundliche GrüßenGeändert von CodeCrafterCpp (21.12.11 um 20:31 Uhr)
-
Schau mal auf die if-Verzweigung in Zeile 120: if(eingabe == f[eingabe])
eingabe ist ja char. Du vergleichst jetzt das char mit f[eingabe]. In eingabe ist aber keine Zahl im Format 1 gespeichert, sondern im Format '1'! Es wird also das Zeichen 1 gespeichert und nicht die 1 selbst. Du müsstest die Eingabe noch in int konvertieren, dann kannst du damit auf Arrayelemente zugreifen. Z.B.:
Code :1 2 3
int zahl; zahl = eingabe - 48 // So kommst du vom Zeichen auf die Zahl selbst
Jetzt kannst du mit zahl auf die Arrayelemente zugreifen.
P.S.: Ich habe den restlichen Code nocht nicht angeschaut, versuch mal wie das Programm jetzt läuft.
Lg
-
Hi
was ich anders gemacht hätte:
main:
Statt 49 '1' nehmen.
Variablendefs zusammenfassen ( char a, b, c; )
Unnötige Variablen weg
Die einzelnen Modi in eigene Funktionen auslagern
Statt x==true und x==false einfach x und !x verwenden
Bei den KI-Modi keine Endlosschleife, sondern vorerst eine Fehlermeldung
Render: Schleifen
Setzen:
Dein Fehler: Beim ersten if nicht vergessen, dass '1' ja 49 ist und als Index ungeeignet
Die Falschprüfung nicht so umständlich, mit zwei verschiedenen Meldungen etc.
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, ...?
-
21.12.11 21:11 #4
- Registriert seit
- Nov 2011
- Beiträge
- 148
Ok danke euch beiden wo ich mir es so anschaue macht es ja auch sinn.

@sheel Unnötige Variablen weg******** Es kommt ja noch ein bsschen an Quelltext oder meinst du was jetzt schon sinnlos ist?
Und das beim Render eine Schleife benutzt were jetzt ja sinnlos und in der Konsole sieht das dann doof aus.
Aber sonst danke.
-
Und noch was: Ich habe ja selbst vor cirka einem Monat mein TicTatToe mit KI programmiert und ich würde sagen, es ist ziemlich sinnlos, 5 verschiedene Schwierigkeitsgrade zu programmieren. Sonst endet das nur so, dass der schwerste immer alle Angriffe blockt, der zweitschwerste dann halt das selbe, nur dass er zum Beispiel einen besonderen Fall nicht beachtet usw...
Am besten mach einen Computergegner und den gibst du dafür alles, was er braucht um die Gegner ins Schwitzen zu bringen
-
@Render-Schleife: Warum soll wegen einer Schleife die Konsole anders ausschauen?
@Sinnlos-Variablen: Wenn du die im noch fehlenden Code brauchst, ok. Bin ja kein Hellseher
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, ...?
-
22.12.11 14:34 #7
- Registriert seit
- Nov 2011
- Beiträge
- 148
@Render-Schleife Weil es eine Konsole eigendlich nicht für Spiele gemacht ist und somit kein Doppel Buffering (oder wie das noch heißst) hat. Wenn ich jetzt sagen wir mal jede Sekunde Zeichne blitzt mir das Spielfeld nur auf und das ist ja ziemlich doof. Also es kann auch sein das ich das mit deiner Schleife falsch verstanden habe.
mfG
-
Meinte nur, das:
durch zB. sowas zu ersetzen:Code cpp:1 2 3 4 5
cout << f[0] << "|"<< f[1]<< "|"<< f[2]<< endl; cout << "-" << "+" << "-" << "+" << "-" << endl; cout << f[3] << "|"<< f[4]<< "|"<< f[5]<< endl; cout << "-" << "+" << "-" << "+" << "-" << endl; cout << f[6] << "|"<< f[7]<<"|"<< f[8]<< endl;
Code cpp:1 2 3 4 5 6
for(int i = 1; i <=9; i++) { cout << f[i - 1]; if(!(i % 3)) cout << endl << "-+-+-" << endl; else cout << "|"; }
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, ...?
-
22.12.11 14:50 #9
- Registriert seit
- Nov 2011
- Beiträge
- 148
@Sheel Achso ok das ist ja gut. Hab das so verstanden das man eben pro Sekunde 28 mal Render wie bei ein richtigen 3D Spiel.
Geändert von CodeCrafterCpp (22.12.11 um 14:57 Uhr)
Ähnliche Themen
-
Permissions beim File schreiben setzten
Von xrax im Forum JavaAntworten: 2Letzter Beitrag: 21.07.11, 09:55 -
[Visio] Beim Shape erstellen: Steuer-/Kontrollpunkte setzten?
Von Syrill im Forum Office-AnwendungenAntworten: 0Letzter Beitrag: 28.01.11, 12:15 -
Mit ant beim compilieren Pfade setzten?
Von reweiss im Forum JavaAntworten: 3Letzter Beitrag: 30.09.08, 14:40 -
Eigene visuelles Objekt, fehler beim kompilieren, bzw. beim Einfügen durch den Design
Von w_digger im Forum .NET Windows FormsAntworten: 0Letzter Beitrag: 10.07.08, 16:29 -
Probleme beim setzten einer Umgebungsvariablen
Von Hawkings im Forum Linux & UnixAntworten: 4Letzter Beitrag: 12.06.07, 17:25





Zitieren

Login






