Hilfe bei Vier Gewinnt
-
hey akari haste mich vergessen???
ich versteh bei deinem code
for (int Lv = 0; Lv < 4; Lv++) if(feldwerte[cy -Lv][cx] == pcolor) return(true)wie der dann die einzelnen felder durchfragt... ich blick des net...
greetz
morphY
-
Hallo
was soll ich da noch erklären? Wenn ich mir dein Code aus dem vorletzten Post anschaue, denk ich doch, du weißt was es mit der Schleife auf sich hat.
Vielleicht hilft die diese Aufdröselung, es zu verstehen:int help; for (int Lv = 0; Lv < 4; Lv++) { Help = cy -Lv; // aktuellen um 1 verringerten Spaltenindex berechnen if(feldwerte[Help][cx] == pcolor) return(true); } // oder auch for (int Lv = cy; Lv > cy -4; Lv--) if(feldwerte[Lv][cx] == pcolor) return(true);Ich glaube, du solltest dir noch mal den Alogithmus an sich durch den Kopf gehen lassen. Ich blicke da nämlich nicht durch.
bis bald
akari
-
was des macht habsch schon verstanden...
nur mein problem ist es damit weiterzuarbeiten...
weil der gibt ja nun immer true zurück...
und sobald ich ein stein setze hat der gleich gewonnen... es hapert wohl eher daran das ich nicht mit dem true oder false weiterkomme...
//gewinnfestellung bool TVierGewinnt::viergewinnt(int cx, int pcolor) { for(int cy=MAXY; cy>=0; cy--) { for (int cv = 0; cv < 4; cv++){ if(feldwerte[cy -cv][cx] == pcolor)return(true); } }//ende for schleife }void __fastcall TVierGewinnt::btn_zweiClick(TObject *Sender) { fuellen(counter2, xwert+1); counter2--; weristdran(); if(viergewinnt(xwert+1, start) == True) ShowMessage(start); // wer gewónnen hat... }hast du ne mailadresse? da kannsch dir das ja mal schicken

greetz
morphY
-
Hallo
du mußt noch die richtigen Steine zählen
//gewinnfestellung bool TVierGewinnt::viergewinnt(int cx, int pcolor) { int count = 0; for(int cy=MAXY; cy>=0; cy--) { count = 0; for (int cv = 0; cv < 4; cv++){ if(feldwerte[cy -cv][cx] == pcolor) count++; } if (count == 4) return(true); count = 0; // nächste Überprüfung }//ende for schleife return(true); }bis bald
akari
-
ich weiss echt net was da net stimmt... der macht es immernochnet richitg...
hab des so gemacht
//gewinnfestellung bool TVierGewinnt::viergewinnt(int cx, int pcolor) { int count = 0; for(int cy=MAXY; cy>=0; cy--) { count = 0; for (int cv = 0; cv < 4; cv++){ if(feldwerte[cy -cv][cx] == pcolor) count++; } if (count == 4) return(true); count = 0; // nächste Überprüfung }//ende for schleife return(false); }und unten frag ich des dann so ab!
void __fastcall TVierGewinnt::Bbtn_einsClick(TObject *Sender) { fuellen(counter1, xwert); counter1--; weristdran(); if(viergewinnt(xwert, start) == true); ShowMessage(start); }und der sagt immer sobald ich ein stein setze das die farbe die grade gesetzt gat gewonnen hat !
was mach ich nur falsch
greetz
morphY
-
Hallo
if(viergewinnt(xwert, start) == true); // << Semikolon weg! ShowMessage(start);bis bald
akari
-
hmm danke geht soweit

hab noch nen fehler bei mir gefunden... ist aber behoben ^^
veränder den start wert ( also wer grade dran ist) zu früh)
also fragt der mit dem falschen wert ab...jetzt habsch nurnoch ein problem ^^ der sagt schon bei 3 das vier gewinnt ist ^^ aber ich debugge mal schnell und dann werd ich den fehler schon finden
greetz
morphYfettes merci nochmal

//edit
habs
bool TVierGewinnt::viergewinnt(int cx, int scolor) { int count = 0; for(int cy=MAXY-1; cy>=0; cy--)//MAX=8 muss aber 7 sein ^^ array geht ja nur von 0-7 ^^ also minus 1 und es geht :) { count = 0; for (int cv = 0; cv <= 4; cv++){ if(feldwerte[cy -cv][cx] == scolor) count++; } if (count == 4) return(true); count = 0; // nächste Überprüfung }//ende for schleife return(false); }hmm ich mach jetzt noch auf jeden fall die waagerechte und dann ist erstemal schluss für heute

ich meld mich ncohmal wenn es probleme gibt

-
So meine gewinnprüfung läuft nun fehlerfrei...
das visuelle fallen der steine habsch nun auch gelöst und die ganzen kleinigkeiten sind nun auch erledigt...hat jemand ne idee wie ich es am besten löse das er sich die letzten 5 züge speichert, damit man später zuge zurücknehmen kann???
greetz
morphY
-
Hallo
indem ein weiteres Array über ints aufmachst, in dem beim Setzen eines neuen Steines in die erste Position der Wert der neueste Spalten kommt, während alle anderen Positionen um eins nach hinten rutschen und der letzte wegfällt.
Eventuell bietet die STL einen passenden Container, ansonsten ist sowas auch leicht selbst gemacht.bis bald
akari
-
//züge zurücknehmen
ja das mit dem array habsch mir auch schon überlegt...
aber ich brauch ja nen y und nen x wert... und die beiden werte kannsch ja nicht in einen speicher tun...
will das man 5 züge zurückgehen kann...
ich könnte entweder 2 arrays nehmen einmal für x und einmal für y oder
oder des array doppelt so groß machen...
aber da es da leichter zu fehlern kommen kann wär es doch angebrachter 2 zu nehmen oder??//Exe erstellung
und noch ne frage... wenn ich des spiel über f9 starte... dann erstellt er mir ja auch eine exe das ist ja aber nur ne kleine... wenn ich die auf anderen computern ausführe geht die ja nicht...
wie mach cih das das es eine "richtige" ist die alle erforderlichen infos enthält???was ist STL???
-
Du brauchst nur einen Wert, den der Spalte. Du kannst immer nur den obersten in der Spalte wieder rausnehmen.
EXE: Sieh mal in die FAQ unter Standalone EXE.
STL: Schau mal in die Hilfe Deines BCB.
-
so nun wieder zeit für cpp

ich brauch trotzdem 2 werte.. weil ich muss ja wissen welche spalte er ist und in welcher reihe er ist.
weil wie soll ich herrausfinde welches der oberste ist ???
was soll mir STL bringen???
also die hilfe hat mir net wirklich was Gebracht....//nochwas nebenbei...
kann man den code zur gewinnabfrage so lassen?wenn er so ok ist mach ich des struktogramm dafür
//Gewinnfeststellung--------------------------------------------------------- bool TVierGewinnt::viergewinnt(int countx, int scolor) { int count=0, count2=0, count3=0, count4=0; for(int cy=MAXY-1; cy>=3; cy--)//beginn der diagonalen von rechts { for (int cx = MAXX-1; cx >= 3; cx--) { count4 = 0; for(int cv = 0; cv<=3; cv++) { if(feldwerte[cy-cv][cx-cv] == scolor) count4++; } if(count4 == 4) return(true); count4 = 0; } }//ende for schleife //ende der diagonalen von rechts for(int cy=MAXY-1; cy>=3; cy--)//beginn der diagonalen von links und der senkrechten { for (int cx = 0; cx<=4; cx++) { count3 = 0; count2 = 0; for(int cv = 0; cv<=3; cv++) { if(feldwerte[cy-cv][cx+cv] == scolor) count3++; if(feldwerte[cy][cx+cv] == scolor) count2++; } if(count2==4 || count3==4) return(true); count3 = 0; count2 = 0; } }//ende for schleife //ende der diagonalen von links for(int cy=MAXY-1; cy>=0; cy--)//beginn der senkrechten { count = 0; for (int cv = 0; cv <=3; cv++){ if(feldwerte[cy -cv][countx] == scolor) count++; } if (count == 4) return(true); count = 0; //ende der senkrechten }//ende for schleife if(start==0) start++; else start--; return(false); }
-
Hallo
ich brauch trotzdem 2 werte.. weil ich muss ja wissen welche spalte er ist und in welcher reihe er ist.
weil wie soll ich herrausfinde welches der oberste ist ???
In dem besagten Array brauchst du nur einen Wert, den der Spalte (also den Wert, auf den du die Gewinnüberprüfung machst). Denn genau so wie du immer nur von oben einen neuen Stein setzen kannst, kannst du auch immer nur einen Stein von oben wieder wegnehmen.
Um jetzt den obersten Stein einer Spalte zu finden, gehst du nur die betreffende Spalte von unten nach oben durch und suchst den letzten Stein der Spalte, das heißt das nächste Feld der Spalte ist leer.nochwas nebenbei...
kann man den code zur gewinnabfrage so lassen?wenn er so ok ist mach ich des struktogramm dafür
Funktioniert denn der Code, so wie du willst? Es geht erstmal nicht darum, das der Code perfekt ist, sondern das du weißt wie er funktioniert.
bis bald
akari
-
In dem besagten Array brauchst du nur einen Wert, den der Spalte (also den Wert, auf den du die Gewinnüberprüfung machst). Denn genau so wie du immer nur von oben einen neuen Stein setzen kannst, kannst du auch immer nur einen Stein von oben wieder wegnehmen.
Um jetzt den obersten Stein einer Spalte zu finden, gehst du nur die betreffende Spalte von unten nach oben durch und suchst den letzten Stein der Spalte, das heißt das nächste Feld der Spalte ist leer.also speicher ich im prinzip die xachse von mienem array und suche von unten ab die erste 2 (2 = leer) und lösche ein feld darunter und mach dies auch gleich weiss...
hmm muss ich mal gucken wie ich des mache... setz mich gleich mal ran
//------------------------------------------------------------------
Funktioniert denn der Code, so wie du willst? Es geht erstmal nicht darum, das der Code perfekt ist, sondern das du weißt wie er funktioniert.
der code funktioniert genauso wie ich will könnte net besser laufen

und verstehen tu icH IHn auch
hab ja jetzt mittlerweile die anwendung von bool drauf
greetz
morphY
-
wow morphY, dann bist duanscheinend schon fertig

wird wohl ne 1 beim master-g ^^
-
@apfelsaft
jo bestimmt
@all
hab jetzt auch den button zum zurücksetzen drinne
ud er funzt optimal 
@akari
hast du icq? oder email? email haste bestimmt ^^ willste mir die mal geben?
will dir nen code schicken... soll aber halt net jeder sehen da es einige gibt die des gleiche game programmieren ^^ net das die dann den gleichen code haben ^^