ROBOBASIC講座(解りやすく?修正しやすく?カッコ良く?スマートに書くためには)
コードを書く時は、後で見て解りやすい様に、修正しやすい様に、書けるといいですよね。言語ごとで、書き方の基本、決まりみたいなものはあるかと思いますが、自分なりにルールを作って、そのルールに則って書く癖を付けるといいですね。
書式のルール(例)
- (グローバルな)変数は小文字のgを付ける
ROBOBASICでは、グローバルな変数しかない
(以下のコードではgは付けてない) - 定数には小文字のkを付ける
名前はその数値が意味する名前にする。
長過ぎる名称も逆に解りにくくなるので注意
とはいいつつ、数値のままの方が解りやすい場合もあったりする
CONSTは、プログラムのサイズに影響しないので、気兼ねなく使ってOK - サブルーチンの仕切り線
goto, gosubで仕切り線を変えてもいいかも
ラベル名にもルールを決めて、gotoのラベルはtを、gosubのラベルにはsを付けるとかしてもいいかも - IF文、FOR...NEXT文のタブの入れ方
ダブを上手に使って、スッキリさせましょう
長いIF〜ENDIFや、FOR〜NEXTの場合、同じコメントの線で囲むといい
それから、なかなかできないことなんですが、
コメントは
- 説明はできるだけ書込む
後から見ると必ず、コメント書いておけば良かったと後悔する時がよくあります。 - 修正した箇所には、修正日を入れておくといい
修正前のコードも消さずに、しばらくはコメントにして残しておく。バグは思わぬ所に潜んでいるものです。修正したコードがちゃんと動くことを確認してから消去する。いつも上書き保存するのでなく、コードを大きく書き換えた場合は、別名(バージョン名、日付)で保存する。 - ざっと見て、パットわかることが大切なので、日本語で書いておくといい
フォントを日本語フォントに設定しておく必要がある
など、兎に角、面倒くさがらずに、できるだけ書く癖を付けるといいかなぁ
サンプルとして、夢現工房さんのページにある
Template Plogram For GameCon(Version1.09 20070515).bas
の
'*************************************************
ADGET:
....
....
....
RETURN
'*************************************************
の間を、解りやすく?修正しやすく?カッコ良く?スマートになるように、以下のように書き換えてみました。ご興味のある方は、この部分を入れ替えて試してみて下さい。なお、※斜めに倒した時の感度にも、少し手を加えています。※日本語のコメントを使っているので、フォントの変更が必要になるかもしれません。※既存のコードを元に、このサブルーチン部分だけを書き換えたので、根本的に書き換えれば、もっと良いコードが書けるかもしれません。
なお、以下のプログラムをRZ1Basicを使って、コンパイル、または、シミュレーションする場合は、最新のver 0.3.1をご使用下さい(説明)。
'*************************************************
'感度
CONST kMIN_A=20
CONST kMAX_A=235
CONST kMIN_B=60
CONST kMAX_B=195
'解析番号
CONST kRightStick=0
CONST kLeftStick=1
'傾けた向き
CONST kNONE=0
CONST kStk_Up=1
CONST kStk_Left=1
CONST kStk_Down=2
CONST kStk_Right=2
'通信
CONST kRightStkLR=&H43'="C"
CONST kRightStkUD=&H44'="D"
CONST kLeftStkLR=&H45'="E"
CONST kLeftStkUD=&H46'="F"
'結果
CONST kUp=1
CONST kDown=2
CONST kRight=3
CONST kLeft=4
CONST kRightUp=5
CONST kRightDown=6
CONST kLeftUp=7
CONST kLeftDown=8
'通信速度
CONST kExSpeed=19200
DIM ADV1 AS BYTE
DIM ADV2 AS BYTE
DIM ADTV AS BYTE
DIM CASV AS BYTE
'#############################
'斜め具合を調べる
CHECK_DIAGONAL:
IF CASV<kMIN_B THEN
CASV=1
ELSEIF kMAX_B<CASV THEN
CASV=2
ELSE
CASV=kNONE
ENDIF
RETURN
'#############################
'結果を割り当てる
ASSIGNED_STICK_RESULT:
IF ADV1=kStk_Up AND ADV2=kNONE THEN
ADTV=kUp
ELSEIF ADV1=kStk_Down AND ADV2=kNONE THEN
ADTV=kDown
ELSEIF ADV1=kNONE AND ADV2=kStk_Right THEN
ADTV=kRight
ELSEIF ADV1=kNONE AND ADV2=kStk_Left THEN
ADTV=kLeft
ELSEIF ADV1=kStk_Up AND ADV2=kStk_Right THEN
ADTV=kRightUp
ELSEIF ADV1=kStk_Down AND ADV2=kStk_Right THEN
ADTV=kRightDown
ELSEIF ADV1=kStk_Up AND ADV2=kStk_Left THEN
ADTV=kLeftUp
ELSEIF ADV1=kStk_Down AND ADV2=kStk_Left THEN
ADTV=kLeftDown
ENDIF
RETURN
'############################################
'ゲームパッドのアナログスティックの状態を取得
ADGET:
'<<シグナルを取得する>>
ADSET=kRightStkLR '"C"
ETX kExSpeed,ADSET
ADGET1:
ERX kExSpeed,ADR2,ADGET1
ADSET=kRightStkUD '"D"
ETX kExSpeed,ADSET
ADGET2:
ERX kExSpeed,ADR1,ADGET2
ADSET=kLeftStkLR '"E"
ETX kExSpeed,ADSET
ADGET3:
ERX kExSpeed,ADL2,ADGET3
ADSET=kLeftStkUD '"F"
ETX kExSpeed,ADSET
ADGET4:
ERX kExSpeed,ADL1,ADGET4
'<<シグナルを解析する>>
' I=0 右スティックの解析
' I=1 左スティックの解析
'右スティックの値をセットする
ADV1=ADR1
ADV2=ADR2
FOR I=kRightStick to kLeftStick
'傾き具合を調べる
IF ADV1<kMIN_A THEN
ADV1=kStk_Up
CASV=ADV2
GOSUB CHECK_DIAGONAL
ADV2=CASV
GOSUB ASSIGNED_STICK_RESULT
ELSEIF kMAX_A<ADV1 THEN
ADV1=kStk_Down
CASV=ADV2
GOSUB CHECK_DIAGONAL
ADV2=CASV
GOSUB ASSIGNED_STICK_RESULT
ELSEIF ADV2<kMIN_A THEN
ADV2=kStk_Left
CASV=ADV1
GOSUB CHECK_DIAGONAL
ADV1=CASV
GOSUB ASSIGNED_STICK_RESULT
ELSEIF kMAX_A<ADV2 THEN
ADV2=kStk_Right
CASV=ADV1
GOSUB CHECK_DIAGONAL
ADV1=CASV
GOSUB ASSIGNED_STICK_RESULT
ELSE
ADV1=kNONE
ADV2=kNONE
ADTV=kNONE 'ここで0にしちゃう!
ENDIF
'結果を整理
IF I=kRightStick THEN
'右スティックの結果は10の位
PSDT=ADTV*10
'左スティックの値をセットする
ADV1=ADL1
ADV2=ADL2
ENDIF
NEXT I
'最終結果:右左の結果を足す
PSDT=PSDT+ADTV
RETURN
'*************************************************
----------------
にほんブログ村
| 固定リンク
「ROBOBASIC講座」カテゴリの記事
- IF文の中のIF文(2008.10.31)
- 制限の勧め(2008.10.09)
- ROBOBASIC講座(GYROSET, GYRODIR, GYROSENSE)(2008.09.21)
- ROBOBASIC講座(MOVEPOS、POS)(2008.08.21)
- ROBOBASIC講座(TIPS: FILL文)(2008.07.15)
この記事へのコメントは終了しました。
コメント