プチコンで遊ぼう! (はてなブログ版)

任天堂3DSのプチコンで遊ぼう! [twitter:@eida_s]

はてなダイアリーから移行しました。 はてなダイアリーのURLを開いても自動的にこちらにリダイレクトされますのでご了承ください。

式を用いたX座標の移動処理について

コメントにて質問がありましたので、移動処理を1画面プログラムなどで短縮記述するときの考え方を説明します。

(2014/01/22 本記事へのコメントに基づき一部追記・修正)

左右の十字キーを押すと、それに応じてプレイヤーキャラが左右に移動するとします。簡略のため画面端の検出処理は省略します。


(1)基本的な移動処理

短縮記述でないごく普通の書き方でX方向の移動処理を書くと以下のようになるでしょう。

IF BUTTON()==4 THEN X=X-1
IF BUTTON()==8 THEN X=X+1

(2)論理式を使った書き換え

短くプログラムを書く時の基本的な手段である論理式はぜひ覚えておきましょう。

(1)でIF文の条件として書いた BUTTON()==4 という条件は、実は、これ自体が値を返す式になっています。このようなものを論理式といいます。

論理式(BUTTON()==4)の値は、左キーを押している時は1、左キーを押していないときは0になります。
(BUTTON()==8)の値は、右キーを押している時に1、押していない時に0です。
0をXに足したり引いたりしても、Xの値は変わらないので、この論理式をXに足したり引いたりすると、キーを押した時だけ、Xに1を足したり1を引いたりできます。
これを使うと、(1)のIF文は以下のように書き換えることができます。

X=X-(BUTTON()==4)
X=X+(BUTTON()==8)

よく見るとこれは単なる四則演算の式になっているので、さらに式を合体してしまうと以下のように書くことができます。

X=X-(BUTTON()==4)+(BUTTON()==8)

これが論理式を使った書き方の基本です。



(3)剰余等の計算式を使った書き換え

論理式での書き方は、理解してしまえばそれほどむずかしいことをやっているわけではないことはわかったかと思いますが、条件ごとに一つの論理式を書かざるを得ないため、それ以上の短縮は望めません。
それ以上は、ケース・バイ・ケースで方法を編み出す必要があるので、若干のヒラメキが必要となってきます。
ヒラメキと書きましたがある程度の定石はあり、特にメジャーな方法としては剰余を使う方法があります。

剰余はプチコンでは X % 3 などと書きます。
これは X を 3 で割った余りを表します。
剰余を使うと、大きな数値を自分が思った範囲の中に押し込めることができます。

例えば、上記の X % 3 は、Xが正の整数である限り、0,1,2のいずれかの値だけをとります。
これを -1 すると、 -1,0,1のいずれかの値をとることになり、この X % 3 - 1 という式がキャラのX座標を±1するのに使えそうです。
後はこの式の中に入るXを調整するだけです。

BUTTON()の左右がとる値は、左が4、右が8、何も押さないと0です。

まずそのままX=BUTTON()として、(BUTTON()) % 3 - 1 という式で考えてみます。
十字キー右の時、BUTTON()は4 なので 4 % 3 は 1 で、-1 すると 0
・同じく左の時、BUTTON()は8 なので 8 % 3 は 2 で、-1 すると 1
・同じく押してない時、BUTTON()は0 なので 0 % 3 は 0 で、-1すると -1
となってしまいうまくいきません。

そこでX=BUTTON()+1としてみます。
全体としての式は (BUTTON()+1) % 3 - 1 となります。
十字キー右の時、BUTTON()は4 なので (4+1) % 3 は 2 で、-1 すると 1
・左の時、BUTTON()は8 なので (8+1) % 3 は 0 で、-1 すると -1
・押してない時、BUTTON()は0 なので (0+1) % 3 は 1 で、-1すると 0
となりました。

しかし、これだと左を押した時にXに+1、右を押した時にXに-1することになり、左右逆になってしまっています。

そこで、全体にマイナスをかけて、 -1*((BUTTON()+1) % 3 - 1)とすると、
十字キー右の時、(4+1) % 3 は 2 で、-1 すると 1、さらに-1をかけて -1
・左の時、(8+1) % 3 は 0 で、-1 すると -1、さらに-1をかけて 1
・押してない時、(0+1) % 3 は 1 で、-1すると 0、さらに-1をかけて 0
となり、思った数値を得られました。

したがって、

X=X-1*( (BUTTON() + 1) % 3 -1)

で思った結果を得られることがわかりました。
この式を変形すると、

X=X-(BUTTON()+1)%3+1

になります。

以上です。