ちょっと待ったぁ!そもそもマトリックスって何?
すいません、ちょっとコトバが難しかったかも知れませんね。マトリックスとは、直訳すると「行列」のことで、タテとヨコのマス目のことです。
あ、そうか、15ゲームの場合はマス目を考えるから、コンピュータもそれを扱えないといけませんよね。
しかし他の言語と違って、Lingoにはマトリックスを扱う命令はないんですよ。
え?じゃ一体どうすればいいのですか?
そこでおなじみのリストを使って考えてみましょう。この16マスのマトリックスを一列にしてしまいましょう。全体のリストをzentaiListと名付けて、このように定義してみましょう。左上のマスを1、その隣を2、またその隣を3として考えていくと……
set zentaiList=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
でもこういう風にするとタテとかヨコとかの感覚がわかりにくくなりますね。
でも、それは人間の感覚であって、コンピュータが計算するときにはあまり違いはないみたいですよ。例えばタテ1列目とは4で割ると1あまりますね。またタテ2列目は4で割ると2余りますよ。同様にヨコ1列目はリストでは1〜4、ヨコ2列目は5〜8になります。そう考えると、一列のリストになってしまってもマトリックスの概念は入るわけですね。
じゃ、たとえばこのような場合、4番がクリックされたら、どのように判断すればよいのですか?
まず空白(つまり16のところ)がどこにあるかを判断しましょうね。リストの中にその値が一つしかなければgetOne(リスト名,値)という命令でその場所を探すことができますね。それで場所を特定します。何か変数にでも代入しておくと後々便利ですね。
put getOne(zentaiList,16) into target
とでも書いておきましょう。この場合target=16となります。で、問題はそこからですよね。まずクリックされた場所(今回は4番)が空白のマス(16番目)とタテ、もしくはヨコで同じ位置にあるかを判断しましょう。
あ、そこでさっきの4で割ったら余りがいくつか?という考えを利用すればいいのですね。
そうですね。そのチェックをする前に、targetがどの列の何番目なのかをはっきりさせておくといいかもしれませんね。targetがタテ何列目にあるのかという値をtargetTate、ヨコ何列目にあるのかという値をtargetYokoとしておきましょう。それを求めるには以下のように書きます。
set targetTate = ((target-1) mod 4)+1
set targetYoko = integer((target-1) / 4 )
としましょう。
ねぇねぇ、modって何?初めて見るんだけど……それにintegerも何?
お、よい質問ですね。凛さん。modとは割られる数 mod 割る数という書式で用いて、その計算の余りを求めるのですよ。例えば 10 mod 3の場合は1が答えになります。15 mod 3は割り切れるから0になりますね。そしてintegerですけど、これはinterger(何らかの数)という書式で使って、何らかの数の整数部分だけを返します。例えばinteger(16.2323)だと16が返されます。では今回の場合はどうなりますか?
ええと、targetTateは((16-1) mod 4)+1だから……4になるのね。そしてtargetYokoは(16-1)/4つまり15/4だから3.75、整数部分だけとるから3になるのね。あれ?でも何故1を引くの?
おお、それもよい質問ですよ。targetYokoの計算を例に挙げて考えてみましょう。例えば1を引かない場合を考えてみましょうね。一番下の段を例に挙げて考えてみましょう。たとえばtarget=13だった場合はどうですか?順番に考えてみて下さい。
こうなるのね
targetの値 | target/4の値 | 整数部分 (targetYokoの値) |
---|---|---|
13 | 3.25 | 3 |
14 | 3.5 | 3 |
15 | 3.75 | 3 |
16 | 4.0 | 4 |
targetの値 | (target-1)/4の値 | 整数部分 (targetYokoの値) |
---|---|---|
13 | 3.0 | 3 |
14 | 3.25 | 3 |
15 | 3.5 | 3 |
16 | 3.75 | 3 |
targetの値 | (target-1)/4の値 | 整数部分 (targetYokoの値) |
---|---|---|
1 | 0 | 0 |
2 | 0.25 | 0 |
3 | 0.5 | 0 |
4 | 0.75 | 0 |
人間にとっては変な感じがしますが、ま、計算するのはコンピュータの方なので「別にいいって感じぃ」でほっておきましょう。
豪さん……ちょっとその言い回しは無理があるのでは……
…………
「ではその判断式を詳しく考えていきましょう」っていいたいんでしょ?
つづく