« HSPTV!メルマガ 第36号 | メイン | 【講座】HSP3ワンポイントテクニック 第18回 »

2007年04月03日

【講座】HSPよく使うフレーズ 第27回 15パズルのこと

今回は”kuroさん”からの質問。

”HSP ゲームプログラミング・クックブック ”のスクリプトに
関する内容だ。

ちょっと専門的?な質問だから”よく使うフレーズ”には
あまりふさわしくないかもね。

分からなくても落ち込まなくてイイタイプのテクニックです。

------------
はじめまして。 kuroと申します。

HSPゲームプログラミングクックブックの中に、「15パズル」のサンプル
スクリプトがあります。
その中の71-81行目、問題作成のため入れ替える場所を決める

rnd a,2
rnd b,3
if a{
cx=nx :cy=(ny+b+1)&3
}else{
cy=ny :cx=(nx+b+1)&3
}

【 秀和システム『HSPゲームプログラミング・クックブック』
”15パズル”P85 より引用 】

の部分のスクリプトの意味がよく分かりません。
どうして、空のマスに重ならず、かつ空のマスに接触するマスを
選ぶことができるのでしょうか。
------------

どうも!メールありがとう!

さて、どのようになってるか説明します。

空のブロックの座標はnx、nyです。
クリック対象の座標はcx、cy。

最初に変数aの乱数で、クリックする場所が、"xが同じ"か"yが同じ"か
を振り分ける。

クリックするにはXかYが、空のブロックと同じ必要があるからです。

構造は同じなので「cx=nx :cy=(ny+b+1)&3」の解説をします。

この場合はクリックするx座標は空の場所と同じ。
y座標は「(ny+b+1)&3」
分解すると
ny 空の座標
b 0から2
1 数値1
&3 0-3に変換する命令

となります。

■最初は&3なしで考えます。

ny=0の場合、bが0だと1
0   1  2  3
0【 】【空 】【 】【 】
1【 】【b=0】【 】【 】
2【 】【b=1】【 】【 】
3【 】【b=2】【 】【 】

という並びになります。(今回1の列だけを考えます。)
nyは0から3の可能性があるのですが、どの値の場合でもスタート位置が
ずれて、数値が循環するというのは分かりますか?

仮にny=3なら



【空 】
<ブロックここまで
【b=0】
【b=1】
【b=2】

このようにはみ出てしまいます。

■次に&3があると、はみ出た数値をうまく戻す処理がうまくできます。

2進数は

000
001
010
011
100
101
110
111

という値の増え方をします。

右側の2桁だけをみると同じパターンを繰り返しているのが分かります。

"2桁だけをみる処理"これが「&3」です。
(&「AND」は2桁を切り取るような結果になります。)

&3で

00、01、10、11 このループになるので、
はみ出た部分がぐるっともどります。

【b=0】
【b=1】
【b=2】
【空 】

こんな感じになります。


(バックナンバーの公開ページは図解入りだよ。)

以上です。

というワケでクックブックをもってないとわかりにくいネタで
ゴメンナサイ。

いまでも売ってるといいんだけどねぇ。

(うすあじ)

投稿者 usuaji : 2007年04月03日 00:56

口臭チェッカー市場