Unity スライドパズル(15パズル)を考えてみる

ピースの回転を使ったパズルは、一応できたので
次はスライド系のパズルを作ってみたいと思います。

定番のスライドパズル(15パズル)がいいかと思います。

検索でスライドパズルの事を調べてみると
情報が出てないんですよね~

これからゲームを作って行くのに、
これくらいは作れるようにならないと話にならないので
自力でコードを考えてみたいと思います。


AssetStoreには
SPuzzle1.jpg

スライドパズルの完成モデルが無料で公開されています。
わざわざ作らなくても…


いえいえスクリプトの勉強にもなるので、
ここは自力で作ってみたいと思います。

果たして完成するのやら(;^_^A


まず、スライドパズルの条件を考えてみます。

・4×4のマスで15ピースが稼働する
・空きマスにピースを動かすことで移動できる
・15ピースが正規の位置にくるとクリアとなる

こんな感じですかね~

まずは、ピースを動かす事を考えてみます。

SPuzzle2.jpg
Sceneにボタンを配置して、押すと動くようにします。
移動にはDOTWeenを使います。


using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;

public class PieceManager : MonoBehaviour {

//トランスホーム用変数
private RectTransform rect;

// Use this for initialization
void Start () {

//ピースボタンのトランスホームを取得
rect = this.gameObject.GetComponent();
}

// Update is called once per frame
void Update () {

}

//ピースボタンを押した処理
public void PuPiece()
{
//ピースボタンをX座標400まで移動させる 移動時間0.5秒
rect.DOLocalMove(new Vector3(400f, 0f, 0f), 0.5f);
}
}


このスクリプトをButtonオブジェクトにアタッチして、
ButtonオブジェクトのOnClickにPuPieceメソッドを割り当てて


ここまでは簡単なのですが、
Pieceは4方向に移動する
隣に空きマスがある時のみ

この条件をどうするか…


ポジションを16個用意して、空きマスをtrueとして判断する。
隣接するポジションがtrueなら、そこへ移動する。

とりあえず、これで様子見です。

ポジション用のbool型配列変数と座標のリストを用意して、
ピースを15個にして…
SPuzzle3.jpg

スクリプトを書き始めて気が付いたんですが、
どのピースが押されたかが分からない…

とりあえずpublic void PuPiece(int BtNo)に変更して…

あれ?
ピースがどこにあるか分からない…

空きマスだけ分かっても意味がない o(ToT)o ダー


ならばピースの位置も空きマスも分かるように、
ポジションをbool型からint型に変えて、番号を振ってみるとか…

イメージは
ベース1.jpg

ポジションを決めてそこにピースNoを格納する

空きマスを0にして、ピースは1~15を入力して、
Pos0に空きがあれば、Pos0=0 みたいな…

変数を用意して、初期位置も確定して
さて移動メソッドを…

ピースが移動したら、どうやってポジションを確認するんだ?
「(ーヘー;) え~と


スライドパズルくらい簡単やろ!
と考えていましたが、む、むつかしい

少し知恵を絞ってみます。
( ̄~ ̄;) ウーン

この記事へのコメント