4 gewinnt
-
Jab, hab ich mir auch schon gedacht schreibs einfach mal mit ue!!!
-
danke...
dumme sache das...tztztz
-
nun ncoh etws...
die einzelnen felder sind mit einem 2d array gemacht.
wenn cih das spielfeld als funktion haben will, wie soll das aussehen das die ausgb richtig ist.
mein ding:
char fach[5][6]={ {' ',' ',' ',' ',' ',' '},{' ',' ',' ',' ',' ',' '},{' ',' ',' ',' ',' ',' '},{' ',' ',' ',' ',' ',' '},{' ',' ',' ',' ',' ',' '} }; cout << " 1 2 3 4 5 6 " << endl; cout << "+---+---+---+---+---+---+" << endl; cout << "| " << fach[4][0] << " | " << fach[4][1] << " | //usw
und so stell ich es mir vor:
cout << " 1 2 3 4 5 6 " << endl; cout << "+---+---+---+---+---+---+" << endl; cout << "| " << fach[4][0] << " | " << fach[4][1] << " | //usw
als funktion
wobei bei fach[4][0] natürlich der wert von: char fach[5][6]={ {' ',' ',' ',' ',' ',' '} ausgegebn werden soll
hoffe das ist verständlich.
ws sch wissen sollte ist:
welche werte muss cih der funktion mitgeben?
und
wie muss in der funktion fachè[][] formuliert werden, damit die ausgabe stimmtnochmals danke
-
Was meinst du mit "Funktion"? Verstehe ich nicht so ganz. Oder meinst du der Code ist in deiner Funktion? Ich denke, du willst das Array nacheinander ausgeben. Für dies nimmste am besten eine for-Schleife. So sollte es eigentlich funktionieren (kurz getippt):
#include <iostream> int main() { char fach[5][6]; for(int i = 0; i < 5; ++i) for(int j = 0; j < 6; ++j) fach[i][j] = ' '; std::cout << " 1 2 3 4 5 6 " << std::endl << "+---+---+---+---+---+---+" << std::endl; for(int i = 0; i < 5; ++i) { for(int j = 0; j < 5; ++j) std::cout << "| " << fach[i][j] << " | "; std::cout << std::endl; } }
Viel Glück beim Testen.
-
was ich meine ist sowas in der art:
void ausgabe(char x[5][6]); //Hauptfunktion int main(void) { char fach[5][6]={ {' ',' ',' ',' ',' ',' '} }; ausgabe(char fach[5][6]); } void ausgabe(char fach[5][6]) { cout << " 1 2 3 4 5 6 " << endl; cout << "+---+---+---+---+---+---+" << endl; cout << "| " << x[4][0] << " | " << x[4][1] << " | " << x[4][2] << " | " << x[4][3] << " | " << x[4][4] << " | " << x[4][5] << " |" << endl; cout << "+---+---+---+---+---+---+" << endl; cout << "| " << x[3][0] << " | " << x[3][1] << " | " << x[3][2] << " | " << x[3][3] << " | " << x[3][4] << " | " << x[3][5] << " |" << endl; cout << "+---+---+---+---+---+---+" << endl; cout << "| " << x[2][0] << " | " << x[2][1] << " | " << x[2][2] << " | " << x[2][3] << " | " << x[2][4] << " | " << x[2][5] << " |" << endl; cout << "+---+---+---+---+---+---+" << endl; cout << "| " << x[1][0] << " | " << x[1][1] << " | " << x[1][2] << " | " << x[1][3] << " | " << x[1][4] << " | " << x[1][5] << " |" << endl; cout << "+---+---+---+---+---+---+" << endl; cout << "| " << x[0][0] << " | " << x[0][1] << " | " << x[0][2] << " | " << x[0][3] << " | " << x[0][4] << " | " << x[0][5] << " |" << endl; cout << "+---+---+---+---+---+---+" << endl;
-
Übergeben tus du das Array so und ausgeben am besten mit ner Schleife:
#include <iostream> void ausgabe(char fach[5][6]) { std::cout << " 1 2 3 4 5 6 " << std::endl << "+---+---+---+---+---+---+" << std::endl; for(int i = 0; i < 5; ++i) { std::cout << "| "; for(int j = 0; j < 6; ++j) std::cout << fach[i][j] << " | "; std::cout << std::endl << "+---+---+---+---+---+---+" << std::endl; } } int main() { char fach[5][6]; for(int i = 0; i < 5; ++i) for(int j = 0; j < 6; ++j) fach[i][j] = ' '; ausgabe(fach); }
-
muss sagen..sieht gut aus
nur verstehe ich es nciht ganz.könntest du oder sonst wer das etwas kommentierwn?
ud was bedeutet std::?
am liebsten wäre mir eine lösung mit meiner vorlage...da ich in der lehre ncoh icht weiter als so bin.
-
ChrissiB schrieb:
Übergeben tus du das Array so und ausgeben am besten mit ner Schleife:
#include <iostream> // Ausgabe (cout) void ausgabe(char fach[5][6]) { // Array wird übergeben an Funktion std::cout << " 1 2 3 4 5 6 " << std::endl << "+---+---+---+---+---+---+" << std::endl; // Ausgabe der Zahlen und des Musters for(int i = 0; i < 5; ++i) { // for-Schleife, wird 5 mal durchgelaufen, d.h. Code wird so oft wiederholt, d.h. du sparst dir Tipparbeit u.a. std::cout << "| "; // für mehr Infos schau in deinem C++ Buch nach ;) for(int j = 0; j < 6; ++j) // s.o. (6-mal) std::cout << fach[i][j] << " | "; // ein Element im 2-D Array wird ausgeben std::cout << std::endl << "+---+---+---+---+---+---+" << std::endl; // nach jeder Reihe kommt das Muster wieder rein } } int main() { char fach[5][6]; // neues 2D-Array for(int i = 0; i < 5; ++i) // Schleife, s.o for(int j = 0; j < 6; ++j) // dito fach[i][j] = ' '; // jedes Element im Array auf ' ' setzen ausgabe(fach); // Funktion aufrufen }
Ich hoffe, das hilft nun mehr..
std ist der Namensraum, in dem alles liegt. Du kannst es ihn auch per "using namespace std;" öffnen. Da das hier aber nicht gemacht wird, schreibst man vor z.b. cout ein std:: (:: Bereichsoperator) -> std::cout
-
ich danke dir...
is super detailiert...damit komm ich schnell weiter
ps. ich weiss deine mühe zu schätzen..danke
-
#include <iostream> //Angabe, welchen Namensraum man nutzen will. Hier: Standard (std). using namespace std; void eingabepruefungausgabe(int *x); void ausgabe(char x[5][6]); //Hauptfunktion int main(void) { char fach[5][6]={ {' ',' ',' ',' ',' ',' '},{' ',' ',' ',' ',' ',' '},{' ',' ',' ',' ',' ',' '},{' ',' ',' ',' ',' ',' '},{' ',' ',' ',' ',' ',' '} }; int wahl; eingabepruefungausgabe(&wahl); wahl--; for(int n = 0; n < 4; n++) { if(fach[n][wahl] == ' ') { fach[n][wahl] = 'X'; break; } } ausgabe(fach); return 0; } void eingabepruefungausgabe(int *x) { int fwahl; bool eingabe = 1; cout << "bitte Wählen sie... "; while (eingabe = 1) { cin >> fwahl; if (fwahl > 0 && fwahl < 7) { eingabe = 0; break; } else { cout << "Fehl Ausgabe! Versuchen sie es erneut... "; break; } } *x = fwahl; } 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; } }
1 2 3 4
+---+---+---+---+//
| | | | |//
+---+---+---+---+//
| | | | |//
+---+---+---+---+//
| x | | | |// so sollte es bei der eingabe von "1" aussehen
+---+---+---+---+//+---+---+---+---+//
| x | | | |// is aber spiebel verkehrt^^
+---+---+---+---+//
| | | | |//
+---+---+---+---+//
| | | | |//
+---+---+---+---+//irgend wo steckt ncoh ne kleinigkeit
THX
-
1. Deine Eingabefuntkion gefällt mir überhaupt nicht. (Ich habe aber auch gerade keine Lust, diese zu schreiben)
2. Könntest du mit bisschen überlegen herauskriegen, wie du das "X" nach unten bekommst. (in dem du mit dem Index arbeitest) Achte aber, damit dir es nicht um die Ohren fliegt. (siehe unten)
3. gibts noch Segfaults, wenn man ungültig eingibtProgram received signal SIGSEGV, Segmentation fault. 0x0804884b in main () at test.cpp:18 18 if(fach[n][wahl] == ' ')
Was auch wohl klar ist.
-
hab zwar keine ahnung was dein code unten zu bedeuten hatt...
aber ich nehms mir zu herzen... werd schon finden...danke!
-
DerDa schrieb:
hab zwar keine ahnung was dein code unten zu bedeuten hatt...
aber ich nehms mir zu herzen... werd schon finden...danke!
Das ist die Ausgabe meines Deuggers ;), nachdem ich in dein Programm "8888" eingegeben habe. (gdb) Das Problem ist in Zeile 18, wie dort steht.
Zu dem Spiegel-verkehrten:
mache es so:// main.. // zuvor alles gleich eingabepruefungausgabe(&wahl); // achtung: kein --wahl; !! for(int n = 0; n < 4; n++) // wozu eigentlich die schleife? { if(fach[5 - wahl][n] == ' ') // 5 - wahl, vielleicht .at() benutzen oder eingabe besser checken { fach[5 - wahl][n] = 'X'; // hier das selbe break; } } // so wie sonst
-
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