Selbst wenn dieses Problem dann behoben ist, dürfte das ganz noch immer nicht funktionieren.
Ich gehe das ganze mal etwas langsamer an:
Du hast bei dir sehr viele Strukturen, die in ihrem Aufbau eigentlich gleich sind. Ein erster schritt wäre es, nur 1 einzige Struktur zu verwenden, da der Sinn einer Struktur die wiederverwendbare Sammlung von Werten ist, die in einer gewissen Beziehung stehen. Bei "Größenangaben" (Größe eines Fesnters, Größe eiens Buttons) hätte man beispielhaft eine Struktur, die die Höhe und die Breite speichert. In deinem Fall wäre die Gemeinsamkeit aller Spalten, dass sie 6 Orte haben und die Eigenschaft besitzen, ob alle Orte gefüllt sind. (Dir sollte an dieser Stelle auffallen, dass der Typ deiner Spalten jetzt durchweg der einen Struktur entsprechen sollte, die du jetzt noch hast.)
Nachdem du jetzt also nur noch eine einzige Struktur "Spalte" hast, solltest du dir diese nochmal genauer angucken. Sie besteht aus mehreren Orten und aus einem Wert, der angibt, ob alle Orte gefüllt sind. An der Formulierung meines letzten Satzes kann man schon merken, dass evtl. auch eine Art von Auflistung (ein Array) verwendbar wäre, um die Orte darzustellen. Außerdem könnte man merken, dass sich der Wert von "bVoll" anhand der anderen Werte der Struktur ergibt. Du könntest also die Orte in einem
char[] zusammenfassen.
Nun solltest du also eine einzige Struktur mit 1
char[] (und evtl. noch dem boolean) haben. Wenn man sich Vier Gewinnt mal genauer ansieht, stellt man fest, dass es Reihen und Spalten gibt. Die Reihen und die Spalten sind relativ gleichwertig, allerdings kann man nicht für beides jeweils eine Struktur anlegen. Daher könnte man überlegen, ob man ein 2-dimensionales Array verwendet, um die Orte des Spielfelds darzustellen. Jedes einzelne Feld innerhalb des Arrays entspricht einem Feld des Spielfelds und somit jedem "Ort" der "Spalte"-Struktur, deshalb sind die darin enthaltenen Werte die gleichen, wie bei den Orten (ich vermute, dass der Standardwert für einen
char '\0' oder
0 ist). Da du intern
'O' als Wert verwendest, wenn sich in einem Feld kein Stein befindet, solltest du dein Array auch mit vielen
'O's befüllen.
Ich denke, solltest du das soweit umgesetzt haben, ist das schonmal ein guter Anfang. Du kannst dir weiterhin noch überlegen, wie man den restlichen Code vereinfachen kann. Du hast sehr viel Code, der sich massiv wiederholt. Damit du noch genug zum selbst gucken hast, würde ich nur die Verbesserung der Stelle ab Zeile 217 nennen:
Es gibt dort sehr, sehr viele Bedingungen, die fast gleich aufgebaut sind, nur dass sich die verwendete Spalte unterscheidet. Sobald du für die Struktur "Spalte" gesorgt hast, kannst du dies bereits vereinfachen, indem du in einer weiteren Spalte-Variable die Spalte zwischenspeicherst, die ausgewählt wurde und dann alle Prüfungen darauf ausführst. Berücksichtigen musst du dabei, dass eine Kopie der spalte angelegt wird, da es sich um eine Struktur handelt (sollte ich hier falsch liegen, bitte berichtigen). Wenn du an der Kopie etwas änderst, ändert sich nichts an dem Original und du müsstest am Ende für das zurückkopieren sorgen. Solltest du ein Array von Spalten oder ein Array von char-Arrays verwenden, kannst du die eingegebene Zahl, wenn sie sich im gültigen BEreich befindet, direkt als Index verwenden und hast es dadurch ein wenig einfacher, weil nicht erst kurzzeitig eine Kopie angelegt wurde.
Weiterhin gehst du dir Orte zwar der Reihe nach durch, weil sie aber nicht in einem gemeinsamen Array liegen, kannst du dies nicht mit einer Schleife machen. Da dirt aber ohnehin geraten wurde, mindestens alle Felder als char-Array zu halten, kannst du dieses durchgehen und auf diese Art deine Prüfungen durchführen.
Und als letztes noch: Du prüfst, ob das Zeichen des Spielers dem Zeichen des 1. Spielers oder dem Zeichen des 2. Spielers entspricht, um dann das Zeichen des 1. oder 2. Spielers (je nach Ergebnis) an die entsprechende Variable zuzuweisen. Warum weist du nicht direkt
cSymbol zu? (Solltest du später mit Arrays arbeiten, müsstest du die Variable an der richten Stelle im Array einfügen, was aber kein sonderliches Problem sein sollte.)
Ich würde die Empfehlen, deinen Code noch auf 2 Lösungsarten umzuschreiben:
- Du hast die Struktur Spalte, die ein char[] für die "Orte" beinhaltet, und ein Spalte[]
- Du hast ein char[][]
Ich denke mal, dass du dadurch noch ein wenig Erfahrungen sammeln kannst.
Später, wenn du soweit bist (also wahrscheinlich nachdem du die beiden Varianten umgesetzt hast und noch ein wenig was anderes entwickelt hast), kannst du dich mit der Objektorientierung beschäftigen und gucken, ob in dem Fall Klassen geeignet wären (wie bereits erwähnt, ob eine Spalte gefüllt ist, hängt davon ab, ob jedes Feld gefüllt ist und an welcher Stelle man ein Stein einfügen kann, hängt davon ab, wie viele Steine bereits in der Spalte vorhanden sind.)
Ich wünsche dir aber schonmal viel Erfolg bei der Umsetzung.