4 gewinnt
-
danke für die hilfe...
ich wende mcih nun mal andern dingen zu und werde das morgen weiter führen...
ps. in dem spiel kannste die steine ja nciht über den rand stapeln ...
angenommen dies spielfeld hatt eine grösse von 4x4 kasten und nu wirfst nach einander 3steine in die spalte 1 so so liegt der erste stein ganz unten der 2the darüber usw.. bis max4 steine aufeinande...
-
ich denke du hast mich nciht ganz verstanden darum werde ich es nochals genau erleutern.
wahl-1 1 2 3 4 5 6
| +---+---+---+---+---+---+
| |4.0|4.1|4.2|4.3|4.4|4.5|
| +---+---+---+---+---+---+
| |3.0|3.1|3.2|3.3|3.4|3.5|
| +---+---+---+---+---+---+
| |2.0|2.1|2.2|2.3|2.4|2.5|
| +---+---+---+---+---+---+
| |1.0|1.1|1.2|1.3| 14| 15|
| +---+---+---+---+---+---+
| |0.0|0.1|0.2|0.3| 04| 05|
| +---+---+---+---+---+---+
|_________________________________nalso...
wenn der spieler nn eine 1 eingibt soll das X bei 0.0 erscheinen wenn bei 0.0 bereits eins ist kommt es nach 1.0 usw.
nun kommt das x aber nach 4.o anstatt nach 0.0 ergo muss beim spielfelt auf bau die nummerierung falsch sein.
meiner meinung nach, liegt der fehler hier:
void ausgabe(char x[5][6]) { cout << " 1 2 3 4 5 6 " << endl << "+---+---+---+---+---+---+" << endl; for(int i = 0; i < 5; ++i) { cout << "| "; for(int j = 0; j < 6; ++j) cout << x[i][j] << " | "; cout << endl << "+---+---+---+---+---+---+" << endl; } }
die ausgabe beginnt ja links oben vom spielfelt...also eigentlich bei 4.0.
nach diesem muster wird da aber die 0.0 hingeschrieben.bei eingabe von 1 kommt das x also nach spalte 1 ganz oben (0.0)
bei eingabe von 2 kommt das x ebenfalls nach spalte 1 direkt darunter usw.nun habe ich viel herumgespielt und hab sogar fehlermeldungen produziert (meine ersten^^) bin aber leider nciht weiter gekommen.
im kopf ist die lösung da..nur sehe ich den weg nciht klar.
nun noch schnell wies denn funktionieren soll:
(bezug aufs koordinaten system ganz oben)eingabe sollOrt
1 0.0
2 0.1
3 0.2
4 0.3
5 0.4
usw.bin über jede hilfe dankbar
-
Achso meinst du das.. Schau mal hier:
#include <iostream> void add(int, char[][6]); bool check(int); int input(); void print(char[][6]); int main() { char field[4][6]; for(int i = 0; i < 4; ++i) for(int j = 0; j < 6; ++j) field[i][j] = ' '; while(true) { int choice = input(); if(!check(choice)) // bei Falsch-Eingabe breaken break; add(choice, field); } print(field); } void add(int choice, char field[4][6]) { for(int i = 4; i >= 0; --i) { if(field[i][choice - 1] == ' ') { field[i][choice - 1] = 'X'; break; } } } bool check(int choice) { return choice > 0 && choice < 7; } int input() { int input; std::cout << "bitte Wählen sie...: "; std::cin >> input; return input; } void print(char field[4][6]) { std::cout << " 1 2 3 4 5 6 " << std::endl << "+---+---+---+---+---+---+" << std::endl; for(int i = 0; i < 4; ++i) { std::cout << "| "; for(int j = 0; j < 6; ++j) std::cout << field[i][j] << " | "; std::cout << std::endl << "+---+---+---+---+---+---+" << std::endl; } }
Sollte so nun funktionieren, ich hoffe auch, du hast dabei was gelernt.
-
das sag ich dir sobald ich dein code durch hab...
danke
-
was haste aus meminem code gemacht?
oder haste (was ch eher vermute) alles koplett neu geschrieben?
sorry aba mit dem code kann cih nicht viel anfangen.
void print(char field[4][6]) { std::cout << " 1 2 3 4 5 6 " << std::endl << "+---+---+---+---+---+---+" << std::endl; for(int i = 0; i < 4; ++i) { std::cout << "| "; for(int j = 0; j < 6; ++j) std::cout << field[i][j] << " | "; std::cout << std::endl << "+---+---+---+---+---+---+" << std::endl; }
der teil wo ch dachte liegt der fehler ist unverändert?
void add(int, char[][6]);
solch komplexe variabel benennungen hatten wir bis jetzt noch nicht (erklärung wär toll)
while(true) { int choice = input(); if(!check(choice)) // bei Falsch-Eingabe breaken break; add(choice, field); }
bin blutiger anfänger^^ man kann mir nicht einfach n code vorhalten...
ausserdem muss mein ding ja auch nciht perfeckt sein...darum lerne ich es ja ncoh.aba nun mal ehrlich...musste man meinen code so derbe überarbiten? ich meine brächte man es nicht auch so hin?
ps. deine arbeit und mühe..schön und gut..bin dir auch dankbar..ich könnts ja kopieren...aba das will cih nicht.
bin nun leider noch ratloser als vorhin...
.........................................................................meiner meinung nch hätte man nur die adressierung der kästchen aners machen müssen..
nur wie? mehr wollte ich gar nciht wissen^^
-
DerDa schrieb:
was haste aus meminem code gemacht?
oder haste (was ch eher vermute) alles koplett neu geschrieben?
Nicht viel neugeschrieben, bloß so angepasst, wie ich es persönlich besser finde. Wie es oben gepostet worden ist, sollte es genau das tun, was du willst, oder? Als vorlage nahm ich jedoch deinen Code.
sorry aba mit dem code kann cih nicht viel anfangen.
Mist, das ist nicht gut.
void print(char field[4][6]) { std::cout << " 1 2 3 4 5 6 " << std::endl << "+---+---+---+---+---+---+" << std::endl; for(int i = 0; i < 4; ++i) { std::cout << "| "; for(int j = 0; j < 6; ++j) std::cout << field[i][j] << " | "; std::cout << std::endl << "+---+---+---+---+---+---+" << std::endl; }
der teil wo ch dachte liegt der fehler ist unverändert?
Nein, es wurde abgeändert und nein, da versteckt sich kein Fehler.
Wo denn auch? Ich habe nur die Arraygröße geändert, so das es ein "klassiches" Vier-Gewinnt-Spiel wird.void add(int, char[][6]);
solch komplexe variabel benennungen hatten wir bis jetzt noch nicht (erklärung wär toll)
Das ist nicht schwer zu verstehen. Das ist einfach nur eine Funktiondeklaration, die 2 Argumente erwartet. Bei ner Deklarartion gibt man aber normalerweise noch keine konkrete Namen an. Bei dem 2D-Array muss man bei der Deklaration nur die 2 Dimension angeben, die erste ist unwichtig.
while(true) { int choice = input(); if(!check(choice)) // bei Falsch-Eingabe breaken break; add(choice, field); }
Hier wird einfach nur eine Endlos-Schleife gestartet. Jedes Mal kommt der Return-Wert von input() in die Variable Choice. (kein Pointerübergabe mehr) Dann wird in der if-Abfrage die Funktion check() aufgerufen, die überpürft, ob die Eingabe korrekt ist. Ist diese nicht, geht er aus der Schleife raus und zeigt später alles auf der Konsole. D.h. man gibt so oft Werte ein, bis man eine Fehlangabe emacht hat. (Das habe ich nur kruz eingebaut, kannst natürlich auch ändern)
bin blutiger anfänger^^ man kann mir nicht einfach n code vorhalten...
ausserdem muss mein ding ja auch nciht perfeckt sein...darum lerne ich es ja ncoh.Ich kann auch einfach alles lassen und dich mit deinem Problem alleine lassen, aber das willst du doch auch nicht.
Perfekt ist dieser Code-Schnipsel auch nicht, ich finde ihn nur besser und übersichtlicher. Die Aufgaben sind besser unterteilt, z.B.
aba nun mal ehrlich...musste man meinen code so derbe überarbiten? ich meine brächte man es nicht auch so hin?
Klar muss man das nicht. Man kann es auch ähnlich machen, wie du es willst. Aber dazu habe ich keine Lust, ich mache es lieber, wie ich es für besser halte, als hier Code zu posten, den ich persönlich schlechter finde, als eine andere Alternative, die ich kenne.
ps. deine arbeit und mühe..schön und gut..bin dir auch dankbar..ich könnts ja kopieren...aba das will cih nicht.
Das ist gut. Kopieren ist nicht gut, du musst es verstehen. Das ist sozusagen ja nur eine Vorlage, sie ist ja bei weitem noch nicht fertig. Es ist eine Möglichkeit, wie du das Problem angehen kannst. Natürlich gibt es noch duzent mehr davon.
bin nun leider noch ratloser als vorhin...
Das wollte ich nicht erreichen.
.........................................................................
meiner meinung nch hätte man nur die adressierung der kästchen aners machen müssen..
nur wie? mehr wollte ich gar nciht wissen^^
Das kannst du ja aus meinem Code herauslesen. Ich habe nun ein
char field[4][6]; // Spielfeld
genommen. D.h. es gibt insgesamt 4 Reihen nach unten und 6 Spalten nach rechts. Ich denke, so ist es üblich bei einem 4-Gewinnt, habe es schon lange nicht mehr richtig gespielt.
So das wars nun wieder. Hoffe, geholfen zu haben.
Schaue dir den Code einfach mal an und versuche ihn besser zu verstehen.
-
danke für deine fixen antworten!
ich pröble dann noch etwas rum...ewas noch...
es wurde nie konkret gesagt WO genau der knakpunkt ist...
wär nett wenn das ncoh kommen könnte
-
Bei deinem Code gibt es 2 Probleme.
- die Schleife wird nei wiederholt, d.h. du gibts bloß eine Zahl ein
- das hinzufügen der neuen "X"e funktioniert bei dir nicht, so wie du es gewünscht hast
Beides hast du in meinem Code, den ich überischtilcher finde.
Du kannst auch aus beiden das Wichtigste für dich herausholen.
Z.B. ist die neue Feldgröße und das Hinzufügen( also die for-Schleife mit dem Checken) sehr wichtig für dich, damit es richtig eingetragen wird und später angezeigt wird (daher wird print() auch zu ändern sein, oder bei dir ausgabe())
Ich verwende halt lieber englische Bezeichnungen.
-
HALLO ich bin wieder da!
nun habe ich den code soweit bearbeitet das ich weiter machen kann...
wurde auch zeit denn morgen muss er fertig werden.nun denn gleich zum eingemachten:
while (true) { while(true) //Eingabe, Prüfung und Ausgabe schleife { int wahl = eingabe(); if(pruefen(wahl)) { hinzufuegen(wahl, fach); break; } } ausgabe(fach); *PLATZHLTER1" }
die ganze schleife wurde nochmals in eine weitere gepackt, damit ich das spiel später leicht verlassen kann (zu diesem zeitpunkt egal)
was ich nun brauche ist eine funktion die den spieler wechselt.
bei "PLATZHALTER1* soll jedesmal einen wert verändert werden, damit die funktion merkt welcher spieler dran ist.zb könnte man den "PLATZHALTER1* von 2an nach oben zählen lassen und die funtion prüft ob der wert durch 2 teilbar (gerade ungerade halt)
void hinzufuegen(int wahl, char fach[5][6]) { for(int i = 5; i >= 0; --i) { if(fach[i][wahl - 1] == ' ') { fach[i][wahl - 1] = 'X'; break; } } }
hier soll die funktion dann bei 'X' aufgerufen werden.
was ich brauche ist nicht die vorgekaute funktuion, aber die lösung mit dem wert "platzhlter1* und wie ich prüfe ob dieser gerade oder ungerade ist.
natürlich bin ich über andere vorschläge glücklich und wenn sie einfacher durchzuführen sind ists um so besser
greez
-
DerDa schrieb:
was ich brauche ist nicht die vorgekaute funktuion, aber die lösung mit dem wert "platzhlter1* und wie ich prüfe ob dieser gerade oder ungerade ist.
Prüfen, ob es eine gerade oder ungerade Zahl ist kannst du mit dem Modula.
Beispiel:if(8 % 2 == 0) std::cout << "gerade" << std::endl; else std::cout << "ungerade" << std::endl;
-
nun habe ich folgende fehler meldung:
[linker error] undefined reference to `eingabe()'
char xo = 'X'; void spieler(int (zahl), char *xo);
meine neue variable und die anmeldung der funktion
spieler(zahl, &xo);
so rufe ich die funktion auf
void hinzufuegen(int wahl, char fach[5][6]) { for(int i = 5; i >= 0; --i) { if(fach[i][wahl - 1] == ' ') { fach[i][wahl - 1] = xo; break; } } }
so soll das x oder das o ausgegeben werden gut möglich das der feler hier is)
void spieler(int zahl, char *xo) { if(zahl % 2 == 0) { *xo = 'X'; } else { *xo = 'O'; } }
die neue funktion
mehr worte brauchts glaub ich nicht.
-
- In deiner Funktion würde ich ansatt Zeiger, Referenzen nehmen.
- warum der Linkererror kommt, weiß ich nicht. Aus deinem geposteten Code kann man dies nicht erahnen
- in hinzufuegen() ist oe unbekannt, du musst es als 3. Argument übergeben
- vielleicht eher so lösen:
// in hinzufuegen() // .. fach[i][wahl - 1] = choosePlayer(count); // .. // erhöhen irgendwo, wo es passt ++count; // .. // choosePlayer() dann so implementieren: char choosePlayer(int count) { return count % 2 == 0 ? 'X' : 'O'; // alles in einer Zeile zurückgeben }
-
fach[i][wahl - 1] = choosePlayer(count);
so hab ichs auch est proiert ging dann aber mit der selben meldung nicht...
mal schaun obs so geht
-
2 fehler
void hinzufuegen(int wahl, char fach[5][6]) { for(int i = 5; i >= 0; --i) { if(fach[i][wahl - 1] == ' ') { [b]fach[i][wahl - 1] = spieler(zahl);[/b] break; } } }
einmal hier
void spieler(int zahl) { [b]return zahl % 2 == 0 ? 'X' : 'O';[/b] }
und einmal hier
-
Natürlich musst du die Funktionsnamen noch anpassen. Ich dachte, das wäre klar.
Wie es scheint, läuft das nun auch.
-
sind doch angezeigt. wo lieg das problem?
nmen sind so wie sei sein sollten...denke ich
-
DerDa schrieb:
sind doch angezeigt. wo lieg das problem?
nmen sind so wie sei sein sollten...denke ich
CHAR^^ ich trottel is klar muss ne char funktion sein
aber wenn ich nun in beiden orten von void auch char wechsle gehts nciht
-
gib dir keine mühe...
ich bin zu dumm^^
hab der funktion eingbe ncoh int zahl mitgegeben.
nun funktionierts.DANKE DANKE DANKE
weiss deine mühe echt zu schätzen.
dass solte bis morgen mal reichen (vorstellungsgespräch)
ich verde später noch eine weitere prüfungn einbauen damit das programm merkt wenn einer gewonnen htt und die ausgiebt...
wär toll wenn du da auch mal was zu sagen würdest..
-
DerDa schrieb:
dass solte bis morgen mal reichen (vorstellungsgespräch)
Willst du das "Spiel" zu einem Vorstellungsgespräch etwa mitnehmen??
ich verde später noch eine weitere prüfungn einbauen damit das programm merkt wenn einer gewonnen htt und die ausgiebt...
wär toll wenn du da auch mal was zu sagen würdest..
Du musst das halt checken lassen, mathematisch. Ne Suchmaschine könnt dir da helfen, du schaust anderen Sourcecode an oder du versuchst es on your own.