Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

11

17.06.2013, 09:08

Hab das mal abgespalten und verschoben. Jetzt könnt ihr weiter diskutieren. :)

wunhopkuendo

Frischling

  • »wunhopkuendo« ist der Autor dieses Themas

Beiträge: 31

Beruf: Student

  • Private Nachricht senden

12

17.06.2013, 10:01

Aaaah, natürlich :)

Wird bei 2D-Arrays nicht begonnen, bei Null zu zählen?Davon bin ich ausgegangen..
Dankeschön schonmal , werde das ausprobieren :)

Ps: Wieso meinst du eigtl 6x7? wenn, dann doch 7x7, oder?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »wunhopkuendo« (17.06.2013, 10:15)


NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

13

17.06.2013, 10:22

Es wird immer bei bei Null begonnen zu zählen.
Ein Array einer Größe von 3 hat auch 3 Plätze mit den Indizes 0, 1 und 2.
Zähl sie ruhig mal durch. ;)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

14

17.06.2013, 11:10

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:
  1. Du hast die Struktur Spalte, die ein char[] für die "Orte" beinhaltet, und ein Spalte[]
  2. 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. ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

wunhopkuendo

Frischling

  • »wunhopkuendo« ist der Autor dieses Themas

Beiträge: 31

Beruf: Student

  • Private Nachricht senden

15

17.06.2013, 12:25

Eine Menge guter Tipps, danke schonmal :)
Wenn man das so liest, dann ist es echt unsinnig, 7 Strukturen zu nehmen :D

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

16

17.06.2013, 13:20

Ich würde vor allem Vorschlagen, dass du noch mal ein paar Grundlagen auffrischst. Arrays, Schleifen, etc solltest du dir auf jeden Fall noch mal angucken. Und versuch dich doch vielleicht direkt an einer Objektorientierten Lösung. Viele denken immer, dass es schwerer wäre als es eigentlich ist. Bei anderen Sprachen wird man da auch ins kalte Wasser geschmissen und meiner Meinung nach ist es nicht schwerer als ohne OO zu arbeiten. Mach dir doch zum Beispiel eine Klasse für das Spielfeld. Da drin hast du dann intern dein Spielfeld (entweder als normales Array, 2D Array, oder von mir aus auch durch irgendwelche Strukturen für Spalten) und zusätzlich Funktionen um abzufragen ob eine Spalte voll ist, um einen Stein in eine Spalte zu werfen, ob ein Spieler gewonnen hat und was du sonst noch so benötigst.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

wunhopkuendo

Frischling

  • »wunhopkuendo« ist der Autor dieses Themas

Beiträge: 31

Beruf: Student

  • Private Nachricht senden

17

27.06.2013, 02:46

Hey Leute, ich bin ein wenig weiter gekommen und bin grad dabei, die Gewinnmöglichkeiten in for-schleifen zu packen,
jedoch tritt ein kleiner Fehler auf,wenn vier in einer Reihe sind ,gibt es erst beim darauffolgenden Zug eine Gewinnausgabe.. Der Fehler ist zwar behoben wenn ich die letzte Zeile aus der inneren for-schleife lösche oder auskommentiere( feld[z][i+3] == feld[z][i] );
ich würd aber trotzdem gern wissen, wo der Denkfehler liegt. :)

Viele Grüße,
wunhopkuendo



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
char feld[7][6] = {
{spalte1.Orte[0],spalte1.Orte[1],spalte1.Orte[2],spalte1.Orte[3],spalte1.Orte[4],spalte1.Orte[5] },
{spalte2.Orte[0],spalte2.Orte[1],spalte2.Orte[2],spalte2.Orte[3],spalte2.Orte[4],spalte2.Orte[5] },
{spalte3.Orte[0],spalte3.Orte[1],spalte3.Orte[2],spalte3.Orte[3],spalte3.Orte[4],spalte3.Orte[5] },
{spalte4.Orte[0],spalte4.Orte[1],spalte4.Orte[2],spalte4.Orte[3],spalte4.Orte[4],spalte4.Orte[5] },
{spalte5.Orte[0],spalte5.Orte[1],spalte5.Orte[2],spalte5.Orte[3],spalte5.Orte[4],spalte5.Orte[5] },
{spalte6.Orte[0],spalte6.Orte[1],spalte6.Orte[2],spalte6.Orte[3],spalte6.Orte[4],spalte6.Orte[5] },
{spalte7.Orte[0],spalte7.Orte[1],spalte7.Orte[2],spalte7.Orte[3],spalte7.Orte[4],spalte7.Orte[5] }
};



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
        for(int z = 0; z < 7;++z)
                      {
              for(int i = 0; i < 3;i++){
            if(feld[z][i]     == cSymbol    && 
              feld[z][i+1] == feld[z][i]    && 
               feld[z][i+2] == feld[z][i]    && 
               feld[z][i+3] == feld[z][i]       )
                    {
                        bSpielende = true;
                    }                                                   
                }
            }

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (27.06.2013, 08:13)


Werbeanzeige