できるがな(4)-3
もどる すすむもどる                  すすむ

「できるな」

15ゲームを作りたい!(3)

では先ほどの処理を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
clickTargetYoko(クリックした段)=0
ZureYoko(段のずれ数)=3
clickTarget(クリックした場所)=2
target(空白部分の場所)=14
ですよね。では一番ややこしいrepeat文を解説してみましょう。
●1順目
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番目の値を入れるのです。
で、repeat文を抜け、setAt,zentaList,clickTarget,16ですから、クリックされた場所に16を入れるので、zentaiListの2番目が16になります。
これでほら不思議、全部の入れ替えが終わってしまいましたね。

あら、不思議、本当に全部入れ替わってしまったわ。こんな場合や、こんな場合にも上手く動いてくれそうね。これは便利ね。で、もう完成ですか?

いいえ、とんでもない。こんな場合はどうなってしまうと思いますか?

あれ?これではエラーがでてしまうんじゃないですか?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順目
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番目の値を入れるのです。
で、repeat文を抜け、setAt,zentaList,clickTarget,16ですから、クリックされた場所に16を入れるので、zentaiListの14番目が16になります。

ふぅん、なるほどねぇ。上手くできていますねぇ。で、これで完成ですか?

いや、申し訳ない。まだまだ続くのですよ。今度はヨコが同じ場合を考えないとねぇ。

え〜まだあるの?

ちょっと変更してやればいいだけのことですよ。こんな風に書いてみましょうね。

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
これでタテの場合はおしまいです。あとはさきほどのタテ・ヨコの判断を加えてやればおしまいです。簡単でしょ。

え?じゃ、これで全部終わりなんですね。じゃ、実際に作ってみましょう!

つづく


1997/04/27更新
© Akira SAno 1997
All rights reserved.
homeできるなメニューにもどる