ok, habs glaub ich gerafft.
Ich denke die grafische Umsetzung ist erstmal nebensächlich, denke aber auch, dass es mit Animation und entsprechenden Frames am sinnvollsten ist.
Wir kümmern uns auch erstmal rein um das Aufdecken und Austauschen der Felder, behalten aber im Hinterkopf, dass wenn Wasser im jeweiligen Feld ist dieses nicht mehr ausgetauscht werden kann.
Jedes Feld hat also folgende Eigenschaften:
typ: gerade n-s, gerade w-e, kurve n-e , kurve e-s , kurve s-w, kurve w-n
aufgedeckt: true, false
wasser: true, false
wasser_eintritt: n,s,w,e
Es gibt 25 Felder + 1 Austauschfeld
Du legst also ...Achtung...eine Lua Tabelle an mit 25 Feldern:
Dann willst du natürlich 25 Felder mit content Füllen. Dabei ist bis jetzt nur zufällig welcher Typ/Art diese Felder haben. Der Rest ist beim Start statisch.
Also gehst du eine for-Schleife durch, die 25x ein neues Feld dem Spielfeld hinzufügt und eine zufälligen Typ zuordnet. für das Feld type rufen wir eine Funktion auf, die uns die Art des Feldes auslost. Ich habe sie mal "select_type()" genannt. Sie gibt später eines der oben genannten typen zurück.
function create_table()
for i=1 , 25 , 1 do
local field = {
["type"] = select_type(),
["revealed"] = false,
["water"] = false,
["water_from"] = nil
}
table.insert(gametable, i, local field) --fügt das kreierte feld dem spielfeld hinzu
end
end
Du fragst dich jetzt bestimmt wie die Felder nun miteinander verknüpft sind, da es ja ein 5x5 Spielfeld ist, aber meine Tabelle 25 nebeneinander/untereinander liegende Felder hat.
Nunja. Wenn man das Feld aufteilt in 5er schritten:
01 02 03 04 05
06 07 08 09 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
, dann ist natürlich der Weg von Feld 13 nach 12 "-1" bzw. nach 14 "+". Will das Wasser später nach oben oder unten -also auf Feld 08 oder 18, rechne ich einfach "-5" oder "+5".
Dazu aber später mehr. Ich will hier nur darauf hinweisen, dass es im Hintergrund dieses Feldes um eine reine Tabelle handelt, die keinerlei 2 Dimensionen hat.
Soweit so gut. Die select_type() funktion wird nun 25x innherlab der create_table() aufgerufen. Hier weiß ich jetzt nicht, ob es für dich egal ist, welches Feld zufällig kommen soll, oder ob es pro Typ auch noch begrenzte Elemente gibt. Sprich dass es im ganzen Spiel nur 6 geraden gibt, der rest sind kurven oder so. Dann müsste man das innerhaln dieser Funktion tracken und ggf. den Zufallswürfel nochmal werfen, wenn eine Maximalgrenze erreicht wurde und ein anderes Feld gelost werden soll.
Innerhalb der select_type könntest du die math.random funktion verwenden, um eine Zufallszahl zwischen 1 und 6 wählt. Je nach zahl gibt es das entsprechende typ wieder.
function select_type()
local type = math.random(1,6)
local typename
if type == 1 then
typename = "gerade n-s"
elseif type == 2 then
typename = "gerade w-e"
elseif type == 3 then
...
end
return typename
end
wo ich das gerade jetzt sehe würde ich sogar lieber auf zahlen zurückgreifen. Sprich Type einfach nur 1-6, dann brauchst du auch keine select_type() funktion und kannst direkt beim anlegen der Tabelle math.random(1,6) nutzen, fertig. Aber falls du wie gesagt noch begrenzte typen machen willst, wo manche rohrstücke nur bestimmt oft vorkommen dürfen, macht eine exra funktion Sinn.
So jetzt hast du erstmal ein 5x5 Feld mit zufälligen Typen.
Für das Austauschfeld kannst du ebenfalls eine funktion schreiben, die folgendes hat beinhaltet:
global change_field = {
["type"] = select_type()
}
Hier brauchen wir ja eigentlich nur den Typ.
Etwas zur grafischen Umsetzung:
Erstelle auf einem Interface oder Szene ein Feld mit 5x5 Objekten, dessen Feld per Leftclick Aktion anklickbar ist. Hier brauchst du eine Execute script Action Part, welches das angeklickte Feld gegen das im Austauschfeld austauscht.
Wir kreieren also (später eine Funktion, die dies tut. Nennen sie switch_field(i)
Feld 1 oben Links hat die ID1, Feld 5 oben Rechts ID 5 , usw... ID25 ist unten Rechts.
Im Execute Script Action Part für Feld 1 kommt also rein:
das Feld oben rechts bekommt
verpasst, usw.
(hier müsste man später noch eine condition drumbauen, dass dies nur passiert, wenn KEIN Wasser im Feld ist bzw. das Feld erstmal aufgedeckt sein muss)
Zurück im Lua Workspace legen wir also eine Funktion switch_field(i) an, wobei i die ID des angeklickten Feldes ist:
function switch_field(i)
local mixer = {["type"] = gametable[i].type} --used to swap the contents
gametable[i].type = change_field[type]
change_field[type] = mixer[type]
end
Da noch kein Wasser durchfließt, ist ja das einzige, was sich ändert der Typ.
Du tauschst also hier nur inhalt von tabellenfeldern miteinander aus. Hier wird nichts bewegt oder Positionen abgefragt
Das ganze ist jetzt erstmal ausm Kopf und untested, sollte aber schonmal das Spielfeld mit den einzelnen unterfeldern austauschbar machen. Hier und da könnte man jetzt mit einem print() das ausgeben, was im hintergrund passiert, da du ja noch keinerlei grafische Darstellung hast.
Ich mach jetzt erstmal schluss für heute. Kopf raucht
Aber ich hoffe ich konnte einigermaßen den Gedankengang hinter meinen Ansatz erläutern.
Grüße
Sebastian