では先ほどの処理をLingoにまとめていきましょう!
あ……、あぁそうしましょう。
ほら、落ち込まないで。きっと何人かの人にはウケたと思いますから、元気だしてくださいよ。まずどうすればいいのですか。
そうですね、元気だします。ええと、先ほどのtargetのタテとヨコの位置の特定と同様に、クリックされた場所のタテとヨコも特定しておきましょう。クリックされた場所の値をClickTargetとでも命名しておきましょう。
じゃ、こんな風に書けばいいのですか?
set ClickTargetTate = ((ClickTarget-1) mod 4)+1
set ClickTargetYoko = integer((ClickTarget-1) / 4 )
そうですね、それで大丈夫だと思います。あとはそれをif文でチェックして、タテかヨコの同じ列にいるかを判断すればよいのですよ。
でも問題はその後なんですよね。同じ列にいるとわかっても、それから後をどうすればよいのでしょうか?リストの中身を入れ替えないといけないでしょ。うわ〜めっちゃめんどくさいやん。
そうですねぇ、落ちついて考えてみましょう。
じゃ、たとえばこのような場合、2番がクリックされたら、どのように判断すればよいのですか?

まずタテとヨコの判断ルーチンで処理してから、リストの入れ替えという作業にかかりますが、今回の例のパターンだと、タテが同じになっているパターンですね。下の図のように移動するわけです。

そうですよね。でもそれをどう処理したらいいのか……
ヨコのずれの値を計算して、役立てることはできませんか?たとえばこのように書いてみます。
put targetYoko-clickTargetYoko into ZureYoko
repeat with Y=1 to Zureyoko
setAt,zentaiList,Target-4*(Y-1),getAt(zentaiList,target-4*Y)
end repeat
setAt,zentaList,clickTarget,16
うーん頭が超パニック!
ちょっとエレガントに書きすぎてしまいましたねぇ。詳しく順を追って考えていきましょう。今回の場合、
targetYoko(空白部分の段)=3ですよね。では一番ややこしいrepeat文を解説してみましょう。
clickTargetYoko(クリックした段)=0
ZureYoko(段のずれ数)=3
clickTarget(クリックした場所)=2
target(空白部分の場所)=14
●1順目で、repeat文を抜け、setAt,zentaList,clickTarget,16ですから、クリックされた場所に16を入れるので、zentaiListの2番目が16になります。
Y=1で、setAt,zentaiList,14-4*(1-0),getat(zentaiList,14-4*1)
つまりsetAt,zentaiList,14,getat(zentaiList,10)ということですね。
zentaiListの14番目に10番目の値を入れるのです。
●2順目
Y=1で、setAt,zentaiList,14-4*(2-1),getat(zentaiList,14-4*2)
つまりsetAt,zentaiList,10,getat(zentaiList,6)ということですね。
zentaiListの10番目に6番目の値を入れるのです。
●3順目(これでラスト)
Y=3で、setAt,zentaiList,14-4*(3-1),getat(zentaiList,14-4*3)
つまりsetAt,zentaiList,6,getat(zentaiList,2)ということですね。
zentaiListの6番目に2番目の値を入れるのです。
あら、不思議、本当に全部入れ替わってしまったわ。こんな場合や、こんな場合にも上手く動いてくれそうね。これは便利ね。で、もう完成ですか?
いいえ、とんでもない。こんな場合はどうなってしまうと思いますか?

あれ?これではエラーがでてしまうんじゃないですか?Zureyokoの値がマイナスになってしまって、repeat文の途中で何かスカタンなことをしてしまうと思いますよ。
そうなんですよね。こういう場合は順番を入れ替えてやらないといけないので、別のスクリプトで処理しましょう。さきほどのスクリプトをこのように修正してみましょうね。
put targetYoko-clickTargetYoko into ZureYoko
if Zureyoko > 0 then
repeat with Y=1 to Zureyoko
setAt,zentaiList,Target-4*(Y-1),getAt(zentaiList,target-4*Y)
end repeat
else Zureyoko < 0 then
repeat with Y=1 to abs(zureYoko)
setAt,zentaiList,Target+4*(Y-1),getAt(zentaiList,target+4*Y)
end repeat
end if
setAt,zentaList,clickTarget,16
targetYoko(空白部分の段)=0ですね。では解説してみましょう。
clickTargetYoko(クリックした段)=3
ZureYoko(段のずれ数)=-3
clickTarget(クリックした場所)=14
target(空白部分の場所)=2
●1順目で、repeat文を抜け、setAt,zentaList,clickTarget,16ですから、クリックされた場所に16を入れるので、zentaiListの14番目が16になります。
Y=1で、setAt,zentaiList,2+4*(1-1),getAt(zentaiList,2+4*1)
つまりsetAt,zentaiList,2,getAt(zentaiList,6)ということですね。 zentaiListの2番目に6番目の値を入れるのです。
●2順目
Y=2で、setAt,zentaiList,2+4*(2-1),getAt(zentaiList,2+4*2)
つまりsetAt,zentaiList,6,getat(zentaiList,10)ということですね。 zentaiListの6番目に10番目の値を入れるのです。
●3順目(これでラスト)
Y=3で、setAt,zentaiList,2+4*(3-1),getAt(zentaiList,2+4*3)
つまりsetAt,zentaiList,10,getat(zentaiList,14)ということですね。 zentaiListの10番目に14番目の値を入れるのです。
ふぅん、なるほどねぇ。上手くできていますねぇ。で、これで完成ですか?
いや、申し訳ない。まだまだ続くのですよ。今度はヨコが同じ場合を考えないとねぇ。
え〜まだあるの?
ちょっと変更してやればいいだけのことですよ。こんな風に書いてみましょうね。
if targetYoko=clickTargetYoko thenこれでタテの場合はおしまいです。あとはさきほどのタテ・ヨコの判断を加えてやればおしまいです。簡単でしょ。
if ZureTate > 0 then
repeat with T=1 to ZureTate
setAt zentaiList,Target-(T-1),getAt(zentaiList,target-T)
end repeat
else if ZureTate < 0 then
repeat with T=1 to abs(zureTate)
setAt zentaiList,Target+(T-1),getAt(zentaiList,target+T)
end repeat
end if
setAt zentaiList,clickTarget,16
end if
え?じゃ、これで全部終わりなんですね。じゃ、実際に作ってみましょう!