Vergleiche ala Vier gewinnt und co

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

PhillipK

Betreff: Vergleiche ala Vier gewinnt und co

BeitragFr, Jun 24, 2011 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Community!

Ich hänge grade ein wenig fest und brauch einen Denkanstoß.
Es bezieht sich auf vergleiche, wie Vier gewinnt etc.

Das ganze wird Horizontal und Vertikal benötigt und ich muss die Position rausfinden können, welche Felder 'ein Treffer' sind.

Das ganze bezieht sich auf einen 2D Array mit zahlen, welche gleich sein können, also nichts allzu schweres.

Mein jetziger ansatz beruht auf einer Rekursiven Methode für jede Richtung, die dementsprechend ausgewertet wird. Allerdings hapert es bei der Auswertung, weil mir das schlichtweg zu viel ist, in Vier richtungen zu denken.

Bisheriger ansatz (grob abgeschrieben)

BlitzMax: [AUSKLAPPEN]
Global Feld:Int[,] 'hier sind die werte drin!

For Local x:Int = 0 Until 10
For Local y:Int = 0 Until 10
Print "PosX: "+x+" PosY: "+y+" Compare:"+CompareLinks(X,y)
Next
Next

Function CompareLinks:Int(PosX:Int,PosY:Int)
If Feld[PosX,PosY] = Feld[PosX-1,PosY] Then
Return 1+CompareLinks(PosX-1,PosY)
Else
Return 0
End Function


Das ganze habe ich in alle vier richtungen und füge sie in einer anderen funktion zusammen.

Eine Funktion checkt alle vier richtungen und bastelt daraus 2 Werte. (CompareLinks() shl 16) | CompareRechts()
und (CompareOben() shl 16) | CompareUnten() und gibt mir diese als Vars zurück.

Im nächsten schritt zerpflücke ich sie wieder und versuche, die stelle von POSITION "abzuzählen"

Das klappt irgendwie, aber ist mehr wie nur unschön.

Gibt es einen Simpleren ansatz? Zb nur Check Horizontal und Check Vertikal ?
Im prinzip müsste es auch gehen, wenn ich nur nach rechts und nach unten prüfe, da das alle Treffer einschließt.
Nur weiß ich im jetzigen augenblick noch nicht, wie ich "doppelte" findungen vermeide.

Grund meiner Rekursiven funktion ist, das ich zwischen 3 und 5 in einer reihe als "Match" haben kann. Das es 6 nicht geben kann, ergibt sich von selbst, wenn 3 schon als match zählen Wink

Ana

BeitragFr, Jun 24, 2011 21:42
Antworten mit Zitat
Benutzer-Profile anzeigen
ich bin mir nich sicher ob es das tut was du willst, aber als "Anstoß" sollte es vielleicht was bringen

BlitzMax: [AUSKLAPPEN]
Function StartMatching:Byte(x:Int,y:Int)
vertikal:Int = MatchingAtDirection:Int(x,y,-1,0,0) + MatchingAtDirection:Int(x,y,1,0,0)
horizontal:Int = MatchingAtDirection:Int(x,y,0,1,0) + MatchingAtDirection:Int(x,y,0,-1,0)

If (vertikal Mod 3 = 0 Or vertikal Mod 5 = 0 Or horizontal Mod 3 = 0 Or horizontal Mod 5 = 0) Then Return True
Return False
End Function

Function MatchingAtDirection:Int(x:Int,y:Int,dirx:Int,diry:Int,Count:Int)
If Feld[x +dirx,y+diry] = Feld[x,y]
Return MatchingAtDirection(x +dirx,y+diry,dirx,diry,Count + 1)
Else
Return count
EndIf
End Function
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
 

PhillipK

BeitragMo, Jun 27, 2011 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmpf. Ich bin ein Idiot.

Erstmal: Ich habe ewig auf ewig auf eine Antwort gewartet, und die kam schon nach wenigen minuten? Hab hier nicht reingeguckt, weil keine Antwort 'gekennzeichnet' war.

Nun, so in etwa stelle ich mir das vor, danke Ana Smile

Schon ein wenig arm, das ich nicht von selbst auf Direction-offsets gekommen bin Sad So spar ich mir die ganze 3 Methoden und ein paar abfragen :3

Allerdings kann ich einen Codestück noch nicht wirklich durchdenken:

Arrow Finden eines Matches (3,4,5 steine in Reihe!) und diese identifizieren, am besten per 'slot'

Grund für das ganze ist immernoch ein wenig Lernen und Tüfteln Smile
Eine unendliche landschaft war erstmal zu schwer *g*

Ich versuche einen Klon von 'Chop Sushi' vom iPhone zu schreiben.

Das Spiel funktioniert so, das abwechselnd spieler einen stein aus dem Feld rausnehmen & am rand einfügen, sodass ein match entsteht.
Je nach Typ der Reihe kriegt der Gegner schaden oder sonstige effekte werden ausgelöst.

Davon habe ich nun 2 Versionen geschrieben, beide mit ihrem eigenen Makel - Eine Scheiterte am Sliden der Teile oder am abgleich für einen Treffer (fehler war nicht genau feststellbar, es lief einfach katastrophal Very Happy) und die andere funktioniert Prächtig bei den übereinstimmungen, nur das Sliden ist verhunzt Sad
 

PhillipK

BeitragMo, Jun 27, 2011 11:59
Antworten mit Zitat
Benutzer-Profile anzeigen
[Edit] Mein mist internet hat mal wieder zugeschlagen.. dieser post kann, aufgrund von 2x Selben text posten, entfernt werden >.< Tut mir leid Sad
  • Zuletzt bearbeitet von PhillipK am Mo, Jun 27, 2011 13:35, insgesamt einmal bearbeitet

Ana

BeitragMo, Jun 27, 2011 12:19
Antworten mit Zitat
Benutzer-Profile anzeigen
PhillipK hat Folgendes geschrieben:
Hmpf. Ich bin ein Idiot.


Das hättest du nich noch durch einen Doppelpost unterstreichen müssen Wink

PhillipK hat Folgendes geschrieben:

Arrow Finden eines Matches (3,4,5 steine in Reihe!) und diese identifizieren, am besten per 'slot'


Das 4 Steine auch zählen hatte ich nicht gelesen/gewusst.

Dafür sollte doch eigentlich die Zeile sein, auch wenn ihr noch ein != 0 fehlt
BlitzMax: [AUSKLAPPEN]
If (vertikal Mod 3 = 0 Or vertikal Mod 5 = 0 Or horizontal Mod 3 = 0 Or horizontal Mod 5 = 0)


Also ingesamt so:

BlitzMax: [AUSKLAPPEN]
If ((vertikal <> 0 And (vertikal Mod 3 = 0 Or vertikal Mod 4 = 0 Or vertikal Mod 5 = 0)) Or (horizontal <> 0 And (horizontal Mod 3 = 0 Or horizontal Mod 4 = 0 Or horizontal Mod 5 = 0))


Die Modulooperationen sind also Null wenn es ein Vielfaches von 3,4 oder 5 gibt. Damit natürlich auch für 3,4,5 selbst, aber halt auch für die von dir erwähnte 6 (und 8,9,10 usw.). Da 0 Modulo 3 auch 0 ist, muss der fall ausgeschlossen werden.
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
 

PhillipK

BeitragMo, Jun 27, 2011 13:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Jap, mit Mod kenne ich mich aus Smile

Das nutze ich überwiegend, um sachen auf ein raster runterzurechnen zb..
PosX:Int = 65

RasterSize:Int = 10

PosX = PosX-(PosX Mod RasterSize)
(so als beispiel)
Mit der funktion bin ich vertraut Smile
Mein problem liegt nicht daran, das ich die abfrage nicht lösen kann, mein problem liegt in meiner Denkweise.
Ich denke viel zu Komplex.
Von 200 Zeilen Code die ich schreibe, könnte man 150 zu allgemeingültigen Funktionen zusammenschreiben, die vllt 20 umfassen.
Mein Komplexes denken setzt genau da an: Ich versuche alles immer möglichst so zu lösen, das ich mit 1-2 wenigen parametern eine Routine starte, die ein Problem löst und das möglichst ohne große Abfragen etc, sondern eher mit funktionen wie Sgr() oder auch Dir-offsets Sad
Wer das selbe denken verfolgt, kennt bestimmt das problem, das man sich leicht verrennt Wink Sad

Ich werde, wenn ich meine Fahrschul-theorie hinter mir hab, mal wieder ein wenig feilen. Heute kam unerwartet der Termin für Donnerstag, da muss ich noch ein wenig Pauken Smile

Ana

BeitragMo, Jun 27, 2011 16:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ich denke viel zu Komplex


Große Worte, aber vielleicht ist auch das "komplex" manchmal einfach nur nicht zielgerichtet.
Meiner Mathenachhilfe-geb-Erfahrung nach kommt dieser Satz ziemlich häufig von jemanden der nicht lange genug nachgedacht hat und dann einen kurzen zielgerichteten Gedanken als zu einfach ab tut, um darauf zu kommen.

Dass das bei dir so ist, will ich mal nicht unterstellen, aber eine Funktion mit möglichst wenig Parametern zu haben ist meiner Meinung nach nur bedingt nützlich. Wenn du deinen Code in logische Einheiten unterteilst und innerhalb dieser Einheiten möglichst große Generalität hast, tust du dir auf dauer meistens einen großen Gefallen. Um es dann bequem nutzen zu können kannst du immer noch kleine Schnittstellenfunktion machen die dann eine spezielle Variante dieser Funktionen nutzen, damit du schnell und einfach das Problem lösen kannst. Häufig kann man auch mit Default Parametern eine Funktion simpel nutzbar machen, aber nachhinten raus auch gut erweiterbar.
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
 

PhillipK

BeitragDi, Jun 28, 2011 4:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Very Happy
Ach, mir machts nichts aus, wenn mir jemand was unterstellt.
Das problem ist mein schlechter einfluss *g*

In meinem 'Hauptprojekt' arbeite ich einer zusammen, die möglichst wenig ram/Cpu nutzen möchte, da wir eine kleine grundstruktur für ein Spiel schreiben, was im nachhinein noch einen haufen extras bekommen soll - und dennoch keine 1,7gb ram fressen sollte, wie andere 'größeren' spiele, die Hobby-Coder auf die Welt bringen. Jede idee wird mehrmals durchdacht, ausgearbeitet und stresstests unterzogen - das hat sich eingebrannt.

Meine aussage, mit möglichst 'wenig' paramentern auszukommen, ist darauf gerichtet, soviel CPU wie möglich zu sparen *g* Ausserdem sinkt die fehlerhäufigkeit, wenn man anstatt von 4 - Case - Bäumen mit relativ identischem Vorgehen einfach eine Allgemeingültige Routine schreibt, die dann direkt alles versaut oder zum klappen bringt Smile

Aber dennoch - nicht weit genug nachdenken, das kann schon sein. Wenn ich mir ein Lernziel setze, schreibe ich meist drauf los. Da setz ich mich - leider - nicht groß hin und durchdenke die programmstruktur Sad

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group