Name Typ Von
Schiebepuzzle (3x3) Definition AFRLme

Dieses Skript erzeugt und steuert ein Schiebepuzzle in einem 3x3-Raster. Das Skript setzt Visionaire Studio 5.1.9.1+ voraus. Es ist nur ein einfaches Beispiel; du kannst es leicht auf andere Rastergrößen anpassen. Mit einer Tabelle bekannter, lösbarer Kachelpositionen lässt sich auch eine zufällige Startreihenfolge erzeugen. Außerdem könntest du einen Zugzähler einbauen oder die Zahl der Züge begrenzen, um das Rätsel schwerer zu machen.

Ausführlichere Informationen zum Design von Schiebepuzzles findest du auf dieser Website.

Anweisungen

1. Füge das Hauptskript im Skripteditor von Visionaire Studio hinzu und lege es als Definitionsskript fest.
2a. Trage zuerst in den Tabellen t[1] bis t[9] die richtigen x- und y-Positionen ein, an denen die einzelnen Kacheln liegen sollen (Pixel oben links).

 t[1] = { .. x = 288, y = 221

2b. Lege dann die Startreihenfolge der Kacheln fest. Aber Vorsicht: Bestimmte Reihenfolgen machen das Puzzle unlösbar.

 t[1] = { .. name = nil
 t[2] = { .. name = "anim_p1"
 t[3] = { .. name = "anim_p3"

2c. Lege anschließend im Abschnitt move jeder Tabelle fest, wohin die jeweilige Kachel geschoben werden darf. Das Diagramm unten zeigt, wie ich ermittelt habe, welche Kachel wohin darf.

t[1] = { .. move = {2,4} -- grid position 1
t[2] = { .. move = {1,3,5} } -- grid position 2
t[3] = { .. move = {2,6} } -- grid position 3
t[4] = { .. move = {1,5,7} } -- grid position 4
t[5] = { .. move = {2,4,6,8} } -- grid position 5
t[6] = { .. move = {3,5,9} } -- grid position 6
t[7] = { .. move = {4,8} } -- grid position 7
t[8] = { .. move = {5,7,9} } -- grid position 8
t[9] = { .. move = {6,8} } -- grid position 9
Sliding puzzle grid.png

3. Lege eine Bedingung puzzle_solved an. Sie zeigt an, ob das Puzzle gelöst ist und ob die Kacheln noch bewegt werden dürfen.
4. Um zu prüfen, ob ein Kachelplatz frei ist oder eine Kachel bewegt werden kann, legst du in einer Aktion Linksklick (sofort) einen Aktionsteil Skript ausführen an mit ...

canMove(i) -- replace i with the tile slot number.

5. Lege zum Schluss in den Szenenaktionen der Puzzle-Szene eine Aktion von anderer Aktion aufgerufen an und nenne sie puzzle_solved. Darin kommen die Aktionsteile, die nach dem Lösen ausgeführt werden sollen, etwa die Bedingung puzzle_solved auf true setzen und einen Sound als Erfolgssignal abspielen.

Hauptskript

--[[
Sliding Puzzle (3x3) [v4] (28/04/2022)
Written by AFRLme [Lee Clarke]
-- + --
afrlme@outlook.com | https://afrl.me | patreon.com/AFRLme | ko-fi.com/afrlme
-- + --
This script is donation optional. In game credit is non-negotiable.
You are free to: ¹ use it in your game(s). ² modify the script.
Do not remove - or edit - this comment block.
--]]

-- * tables * --
local t = {} -- init local table for storing tile coordinates, names, & move positions

-- * function for initializing tiles * --
function initPuzzle()
 -- + initialize the grid properties + --
 t[1] = { x = 96, y = 77, name = nil, move = {2,4} }
 t[2] = { x = 246, y = 77, name = "anim_p1", move = {1,3,5} }
 t[3] = { x = 396, y = 77, name = "anim_p3", move = {2,6} }
 t[4] = { x = 96, y = 187, name = "anim_p4", move = {1,5,7} }
 t[5] = { x = 246, y = 187, name = "anim_p2", move = {2,4,6,8} }
 t[6] = { x = 396, y = 187, name = "anim_p5", move = {3,5,9} }
 t[7] = { x = 96, y = 297, name = "anim_p7", move = {4,8} }
 t[8] = { x = 246, y = 297, name = "anim_p8", move = {5,7,9} }
 t[9] = { x = 396, y = 297, name = "anim_p6", move = {6,8} }
 -- + move tiles to correct position if in wrong position + --
 for i = 2, 9 do ActiveAnimations[ t[i].name ]:to(0, { CurrentPosition = { x = t[i].x, y = t[i].y } }) end
end

-- * function used to determine if player wins * --
function puzzleState(v)
 for i = 1, 8 do
  if t[i].name == "anim_p"..i then v = v + 1 end
  if i == 8 and v == 8 then startAction( game.CurrentScene.Actions["puzzle_solved"] ) end
 end
end

-- * function for updating tile positions * --
function canMove(v)
  for i = 1, #t[v]["move"] do
   if t[ t[v]["move"][i] ].name == nil and not Conditions["puzzle_solved"].Value then moveTile(v, t[v]["move"][i], 200, easeLinearOut); break end
  end
end

-- * function that is used to move the animation from one position to another with delay & easing * --
function moveTile(a, b, delay, easing)
 ActiveAnimations[ t[a].name ]:to(delay, { CurrentPosition = {x = t[b].x, y = t[b].y} }, easing)
 t[b].name = t[a].name; t[a].name = nil; puzzleState(0) -- update tile position names & check puzzle state
end

Ressourcen

Name Beschreibung
3x3_sliding_puzzle_(v4).zip Ein funktionierendes Beispiel des Skripts in Aktion. Visionaire Studio 5.1.9.1 + erforderlich, um die enthaltene .ved-Datei auszuführen.