Casio Basic入門4

Casio Basic入門
<目次>

誤字脱字・記載ミスや分かりにくい表現は随時追記・修正します
最終:2014/11/19


 4. CasioBasicを使ってみる(続き)

Chapter 1 - 初級
GetkeyLocate コマンドを使いこなす

前回: Casio Basic入門3


◆ Chapter 1 の目標: キーコードを調べるプログラムを作る

Chapter 1-2 までに作ったプログラム

プログラム名: CH1-2-2
Lbl 0
Getkey→K
Locate 2,1,"  "
        (" " の中はスペース1つ:2014/11/19 追記)
Locate 1,1,K
Goto 0


このプログラムは、何かキーを押している時は、画面の左上にキーコードを表示し、押していない時は 0 を表示し続けます。

キーコードを調べて表示するプログラムは、実は私自身が、プログラムを作る時にあったら便利だと思って作ったものです。キーを離したらキーコードが消えてしまうのはチョット不便で、別のキーを押すまでは前のキーコードを表示しておいて欲しいと思うのです。

好みの問題もあるでしょうが、プログラムの完成度を上げてゆきますので、お付き合いください。




Chapter 1-3
繰り返し処理:Doループ

キーを離しても Getkey コマンドが返す 0 を表示しないようにする方法ですが、ここでは「Getkey が 0 を返す間はプログラムを先へ進めないようにし、0 以外を返した時にプログラムを先へ進める」 というように、プログラムを変更してみます。

[ 何かの条件が成り立つ場合] に 処理を繰り返すコマンドがあるので、これを使うとピッタリです。

Do ループ

Do ループの書式は、以下のように決まっています。

Do
[ 繰り返したい処理 ]
LpWhile [ 繰り返しを行う条件 ]



今やりたいことは、、

Do
Getkey→K
LpWhile [ K=0 が成り立つ場合 ]


となります。


具体的に書くと、以下になります。

Do
Getkey→K
LpWhile K=0


はい、スッキリしましたね。

プログラム編集画面で、LpWhile K=0 の = 記号を入力できますか?

= 記号は比較演算子なので、プログラム編集画面で、[FUNCTION] キーを押し、出てくるメニューで 「3:PROG」を選び([3] キーを押し)、[▼]キーを1回押すと、メニューに 「1:=」 が現れますね。ここで、[1] キーを押してこれを選択します。


それでは、プログラム CH1-2-2 を以下のように改造して、プログラム CH1-3 とします。

プログラム名 CH1-3
Lbl 0
Do
Getkey→K
LpWhile K=0
Locate 2,1,"  "
        (" " の中はスペース1つ: 2014/11/19 追記)
Locate 1,1,K
Goto 0


改造したプログラムを実行してみてください。意図した通りに、次のキーを押すまで、最後に押したキーのキーコードが表示されますね。

K=0 である限り Getkey→K が繰り返され、K=0 以外になると(つまり、何かキーが押された時に)繰り返し処理をやめて、Locate コマンドが実行され、キーコードが表示されます。



プログラムの説明

プログラムは何か特別の指示が無い限り、上から下へ止まらず、連続的に実行される、これは重要ですから繰り返します。その上で、プログラム CH1-3 の Do ループの細かい動きをみてゆきましょう。

1) プログラムが上から実行されてきて、

2) Do にたどり着くと、そのまま LpWhile が出てくるまで下へ進み、

3) LpWhile が見つかると、その右に書かれている [条件]をチェック!

4-1) 書かれている [条件] が正しい時は、Do までジャンプし、

4-2) 書かれている [条件] が正しくない時は、LpWhile の下へ進む。



自分で書いたプログラムが意図した通りに動かない時は、このように1つづつ確認する必要がありますので、細かいところまで分かっておくことが大切です。

と言うのも、Do ループと似たようなコマンドに、While ループがあります。


While ループの書式

While [繰り返しを行う条件]
[繰り返したい処理:
WhileEnd



似たようでいて、これらは微妙に違いがあります。

Do ループをおさらいすると、Do に出くわした時は、そのまま下へ処理を進め、LpWhile が出てきた時に、繰り返すをするかどうかの判断を行います。つまり、繰り返し処理の最後で条件判断を行います。

一方、Whileループでは、Whileに出くわした時、先ず最初に繰り返しの条件判断を行います。条件が会えば、Whileの下へ処理が進み、WhileEndまできたら無条件でWhileまでジャンプします。つまり、繰り返し処理の最初で条件判断を行うのです。

別の言い方をすれば、Doループでは、DoとLpWhileの間に書かれている処理を最低1回は実行します。一方、Whileループでは、WhileとWhileEndの間に書かれている処理を1度も実行しないことが有り得ます。

Whileループについては、後で実際に使ってみます。今はDoループの詳しい動作を忘れずにいてください。

※ CasioBasicコマンドリファレンス
      - Do~LpWhile
      - While~WhileEnd


さて、プログラム CH1-3 は、画面がそっけないですね。プログラムの名前や、今何を表示しているのかの説明や操作方法などが表示されると、プログラムのクォリティーが向上します。


仕上がりの目標は、以下のようなものです。


プログラム起動時の表示:

1-GetKeycode 


キーを押した時の表示:

2-GetKeycode 


次回までに、ご自分で試しに作ってみると良いかもしれません。


なお、Chapter 1 では、この写真のような表示を実装した後、もう少し面白い機能を追加してみる予定です。


つづく...

⇒ CasioBasic入門5 / 目次




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


カシオプログラム関数電卓 FX-5800P-Nカシオプログラム関数電卓 FX-5800P-N
(2006/09/22)
CASIO(カシオ)

商品詳細を見る



keywords: fx-5800PCasioBasicプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: Do~LpWhile

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-G50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
2015/01/09 更新

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
Do ~ LpWhile (Doループ)

◆概 要:
ループ処理を行う。

◆書 式:
Do
[繰り返したい処理]
LpWhile [ループ継続条件]



繰り返し処理を行いたい時に使います。

ループ継続判定を行う位置が、Doループと Whileループで異なります。Doループは、ループの終わりで条件定を行いますが、Whileループは、ループの始まりで条件判定を行います。従って、Doループは最低でも一回実行されるが、Whileループは1度も実行されないことがあります。




ループ継続判定条件について

ループ継続判定条件は、それが 「真 (True)」 であればループを継続し、「偽 (False)」 であればループから抜けます。
ループ継続判定には、関係演算式、論理演算式、計算式、関数、変数、戻り値を返すコマンド、数値 を指定できます。

関係演算式を用いる場合
LpWhile K≠0LpWhile X>Y  などのように、式が成り立つ(真である)か? あるいは成り立たない(偽である)か?で判定されます。

論理演算式を用いる場合
LpWhile X And Y や LpWhile X Or Y などのように、結果が真(1)か? あるいは 偽(0)か? で判定されます。

計算式・関数・戻り値を変えるコマンドを用いる場合
LpWhile A-BLpWhile sin(D)LpWhile Getkey などのように、これらの結果が、0でない(真)か? 0である(偽)か? で判定されます。

変数を用いる場合
LpWhle C などのように、変数が、0でない(真)か? 0である(偽)か? で判定されます。

数値を用いる場合
LpWhile 1 などとすると、常に真になるので、Doループはエンドレスループになります。Casio Basic が動作する電卓では、[AC] キーを押せばプログラムが強制終了されるので、このような使い方は有用性である。Lbl / Goto ループでも同じである。




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800PCasioBasicDo~LpWhileプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: Lbl / Goto

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
2015/01/22 更新

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
Lbl / Goto

◆概 要:
プログラム実行位置をジャンプさせる。

◆書 式: Lbl n / Goto n  (n は、0~9の数字、および A~Zのアルファベット)


条件分岐の結果、処理内容を変更する時に使います。

さらに、ジャンプ命令をうまく組み合わせることでループ処理に使うと便利です。



使用例1: 条件分岐処理

Cの値が0の時、あるいは0以外の時で、処理を変える例です。

If C=0
Then Goto A
Else Goto B

IfEnd
Lbl A
[Cが0の時の処理]
Lbl B

[Cが0でない時の処理]




使用例2: カウントダウン・ループ処理

ループを100回繰り返す処理。所定の待ち時間を作る時に有用です。

100→C
Lbl 0
Dsz C
Goto 0
[次の処理]


この例では、条件ジャンプ命令 Dszをうまく利用しています。
Dsz  C はCを1つ減らし、その結果がCが0でないなら次の処理を実行し、Cを1つ減らした結果Cが0の時は次の処理を飛ばして、2つめの処理へジャンプします。
つまり、Cが100から2の間は Goto 0 により Lbl 0 へ戻って繰り返し、Cが1になると、Dsz C の結果Cが0になるので、Goto 0を飛ばして [次の処理] へジャンプするので、100回繰り返し間が待ち時間となります。



使用例3: 条件ループ処理

変数Lが0でない間はループを継続し、Lが0になったらループをを終了させ、次の処理へ進む:

Lbl D
[必要な処理]
L⇒Goto D

[次の処理]


ここでは、条件ジャンプ命令 ⇒ をうまく使っています。
L が0でない時は ⇒ の右の処理を行い、L が0になると ⇒ の右の処理を飛ばして、その次の処理へジャンプします。



使用例4: 無限ループ処理

単純に以下のようにすると、無限ループになります。

Lbl G
[必要な処理]

Goto G


CasioBasic では、[AC] キーを押せば無条件にプログラムを終了するので、[AC] との組み合わせを前提とすれば、無限ループも使えます。



[2015/01/22 追記]
Goto / Lbl ループの処理速度について

Casio プログラム関数電卓では、古くから Goto / Lbl が採用されています。Casio では、古くからのユーザーに対して、プログラム動作の互換性を重視しており、そのため 新世代 Casio Basic で新たに採用されているコマンドとのプログラム動作の互換性を維持するために Goto の内部動作に、Goto 専用スタックを仮スタックとして使っていて、本スタックと比較したりジャンプ先の修正を行っています。そのため、プログラムの制御構造(プログラムの分岐やループによるジャンプ動作)が複雑になり、そこに Goto が使われていると、処理時間が大幅に長くなります。プログラムにもよりますが、Goto / Lbl ループを WhileDo によるループに変えるだけで、処理時間が半分になることもあります。

Lbl / Goto がペアになっているだけの単純なループでは、単純な WhileDo ループとほぼ同じ処理速度ですが、機能追加によりプログラム規模が大きくなったり、制御構造が複雑になる場合は、無限ループには、While / WhleEndDo / LpWhile の使用を勧めます。




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800PCasioBasicLbl/Gotoプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: Getkey

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
2015/01/12 更新

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
Getkey

◆概 要:
押されたキーのキーコードを取得する。[AC]キー以外の全てのキーにはそれぞれ異なるキーコードが割り当てられている。

◆書 式: Getkey

◆引 数:なし

◆戻り値:
押されたキーのキーコードを返す。キーが押されていない場合は0を返す。

※ 互換性: キーコードはハードウェア(機種)に依存し、fx-5800P と fx-9860GII や fx-CG20/50ではキーコードが異なります。一方で、fx-9860GII と fxCG20/50 は全く同じです。

キーコードを知るには、取扱説明書を見るか、キーコード取得プログラムを実行してください。

取扱説明書キーコード取得プログラム
fx-5800P99 ページプログラムライブラリ - キーコード取得
fx-9860GII8-17 ページ
fx-CG20/508-20 ページ



Getkey を使うと[AC]キー以外のキーが押された時に、そのキーの判別ができます。

Getkeyはプログラムの実行を止めて、キー入力を待つ機能は備わっていません。Getkey はキーが押される時に実行されなければなりません。従って、キー入力を待ち受けるために、繰返し処理(ループ)の中に Getkey を記述する必要があります。

例えば、Do~LpWhile ループを使い、

Do
Getkey→K
[必要な処理]
LpWhile K=0

[押されたキーに応じた処理]


とします。このプログラム例は、Getkey0を返す時(キーが押されていない時)は繰返し処理が継続され、0以外を返す時(何かキーが押された時)は、繰り返し処理を終える動作をします。

入力命令?を使うと、入力確定のために [EXE] キーを押す必要がありますが、Getkey を使えば [EXE] キーを押さずに、リアルタイムでキー入力に反応するプログラムを作れます。

fx-5800Pでは、キーが押された瞬間から所定の時間の範囲なら、Getkey でキーコードを取得できるようです。つまり、キーが押された、まさにその瞬間に Getkey が実行されていなくても、一定の時間的猶予が与えられます。

Lbl 0
0→C
Do
Getkey→K
LpWhile K=0
Locate 1,1," "
Locate 1,1,K
Goto 0


これを実行すると、最初に表示されるキーコードKの値は、プログラム実行開始で押さなければならない [EXE] キーの47となります。つまり、[EXE] が押された瞬間ではなくて、押されてから一定時間内で(短い時間ですが...)キーコードを取得していることがわかります。

次に、上のコードの冒頭のLbl 0 の上に、次のように赤文字で示した4行のコード(1000回ループ)を追加して、一定の待ち時間がかかるようにします。

1000→A
Lbl 1
Dsz A
Goto 1

Lbl 0
0→C
Do
Getkey→K
LpWhile K=0
Locate 1,1," "
Locate 1,1,K
Goto 0


すると、プログラム実行開始で押された [EXE] のキーコードを取得できないまま、キー入力待ちになります。つまり、キーが押されてから所定時間を経過すると Getkey はキーコードを取得できないことがわかります。

非常に長いループ(多くの処理が記述されていて、ループ1回がまわるのに時間がかかるループ)の内で Getkey でキー入力を監視すると、キーの取りこぼしが起こり得ます。キー入力監視は極力短めのループを使うようにすると良いでしょう。

fx-9860GII ではプログラムの実行が速いので、上記のような現象の違いを確認できません。むしろ実行速度が速いために、プログラムによっては、キーリピートを抑制するコード(赤文字部分)が必要になります。

While Getkey
WhileEnd

Do
Getkey→K
LpWhile K=0


赤文字の2行が、キーリピート抑制の働きをします。Getkey の戻り値が 0 でない限り、つまりキーがが押されている限り、このループが継続します。そして、キーが離れたら Getkey は 0 を返すのでループを脱出して次のキーコード取得が行われます。




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800PCasioBasicGetkeyプログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: ? (入力命令)

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro では互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。
2015/10/24 更新

fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
? (入力命令)

◆概 要: キー入力した結果を変数に代入する。

◆書 式

? 単独で使う書式
(fx-5800Pのみで使え、fx-9869GII、 fx-CG10/20/50 では使えない。fx-FD10 Pro では使えるという情報有り)

 1) ?[変数]
 2) [文字列]?[変数]
※ この書式では、[変数] に格納されている数値を表示する。変更の必要が無ければ [EXE] を押すだけで入力確定可能。


? と → を組み合わせて使う書式
(fx-5800P、fx-9860G/GII、fx-CG10/20/50 で使える)

 3) ?→[変数]
 4) [文字列]?→[変数]

※ この書式では、[変数] に格納されている数値の表示はされないので、必ず数値入力し [EXE] で入力確定する。


入力命令 ? は、Casio Basic 独特のもの。

プログラムが一時停止され、キー入力できる。入力後 [EXE] キーを押すと、入力が確定され、一時停止が解除され、入力した結果が画面表示され、指定した変数に代入される。入力の際は、数字、式、関数 を入力できて、式や関数の場合は [EXE] キーを押すと、その計算結果が変数に代入される。



・書式1: ?N (fx-5800P のみて使える。fx-FD10 Pro でも使えるという情報有り)
画面には、

N?

と表示され、プログラムが一時停止します。変数Nに既に値(例えば123)が代入されている場合は、

N?
             123


のように、代入されている値を示します。
456とキー入力して [EXE] で確定すると、一時停止が解除され、入力結果(数)がNに代入されます。


・書式2: "INPUT"?N
画面には、

INPUT?

と表示され、プログラムが一時停止されます。変数Nに既に値(例えば123)が代入されている場合は、

INPUT?
             123


のように、代入されている値を示します。
キー入力以降の動作は、書式1と同じです。


・書式3: ?→N
画面には、

?

と表示され、プログラムが一時停止されます。変数Nに値が代入されているかどうかで、画面表示に違いはありません。キー入力以降の動作は、書式1と同じです。


・書式4: "INPUT"?→N
画面には、

INPUT?

と表示され、プログラムが一時停止されます。変数Nに値が代入されているかどうかで、画面表示に違いはありません。キー入力以降の動作は、書式1と同じです。



プログラム事例: 

"CALC"?→X

を実行して、表示された画面で、1234 x 5678 と式を入力して、[EXE] で確定すると、この式の計算結果 7006652 が変数Xに代入されます。


[2015/01/13 更新]
" " 命令による画面表示動作が、fx-5800P と fx-9860GII や fx-CG10/20/50 で異なることから、?→ による表示結果も異なります。

Locate 10,1,"RIGHT"
"LEFT"?→A


を実行すると、以下のような違いがあります。

<fx-5800P>
INPUT?   RIGHT
[入力行]


<fx-9860GII>
INPUT?
[入力行]


 ⇒ fx-9860GII への移植 - 厄介な旧来の命令

fx-5800P 搭載 Casio Basic は特別な仕様になっていて、プログラミングの柔軟性が高いようです。





応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800PCasioBasic入力命令、?プログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

Casio Basic: → (代入命令)

Casio Basic
コマンドリファレンス

Casio fx-5800P、fx-9860GII、fx-CG20、fx-CG50 で確認をとっています。Casio fx-FD10 Pro でも概ね互換性はあると考えられますが、実機で確認していないので「可能性」としてご覧ください。

2015/01/09
fx-5800P / fx-9860GII / fx-CG20 / fx-CG50
→ (代入命令)

◆概 要: 変数に値を代入する。

◆書 式: [代入する内容]→[変数]


代入命令 は、Casio Basic 独特のコマンド。
HPなどの他社の電卓搭載言語でも代入にが用いられるケースがある。

の右辺には必ず変数を指定する。

の左辺は、数字、変数、式、関数、戻り値のあるコマンド を指定する。文字および文字列を左辺に指定することはできない(fx-5800Pでは文字および文字列変数を扱えないため)。


※TIPS: プログラム編集時に、[FUNCTION] [3] [2] とすると  (代入命令)を入力できる。[SHIFT] [RCL] と2ステップで  (代入命令)を入力でき、自動的にアルファベットモードになるので、変数入力で [ALPHA] キーを押す必要がない。



・数を代入: 0→C
 変数の初期化などで多用します。

・変数を代入: X→Y
 Xに代入されている数を Yに代入しています。プログラムの中で多用します。

・式を代入: C+2→C
 Cを2だけ増やしています。ループ(繰り返し処理)などで多用します。

・式を代入: x2→Y
 xの2乗をYに代入しています。

・関数を代入: Int(X)→N
 Int( )関数を利用して、変数X の整数部を 変数Nに代入しています。

・コマンドの戻り値を代入: Getkey→K
 押されたキーのキーコードを変数Kに代入しています。

・複数の変数に一括代入: 0→A~Z
 アルファベット順に複数の変数を ~  で指定。上の例では 変数 A から 変数  Z に 0 を一括代入。変数の初期化に役立ちます。




例外事例: 

配列変数の初期化を行うために、

[数字]→DimZ

と書きます。
これは指定した数字の分だけ、配列変数を確保するのであって、数を変数 DimZ に代入するのではありません。
(fx-5800P のみ)



応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800PCasioBasic代入命令プログラミング入門プログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

fx-5800P:矢印キーの活用

fx-5800P用のゲーム Hit&Blow を、3~5桁に自由に変更して遊べるバージョンを作りました。

fx-5800P:Hit&Blow【完成版】

3桁に固定したHit&Blowの最初の画面は以下のようでした。
HB-Start 


この限られた表示の中で、3~5桁を自由に変更できるようにするため、以下のようにして空いている1行を活用します。

hb_Start4 hb_Start5 hb_Start3 

空いた1行には、桁数を表示させ、上矢印[▲]キーと下矢印[▼]キーで、3桁、4桁、5桁と自由に選べるようにしました。

  <UP:DN>

は、矢印キーを使って変更することを示しています。[▲]キーを押せば桁数の数字が増えますが、5 の時に[▲]キーを押すと 3 に戻ります。一方、[▼]キーは桁数を減らしますが、3 の次は 5 になります。このように 3、4、5 を循環します。 

矢印キーで、3、4、5、のいずれかを選んでもらうインターフェースは、3~5以外を設定される心配がなく、プログラムの中で入力チェックが不要になり、想定外の入力に対する再入力の処理も不要になります。

限られた表示スペースで効率的なインターフェールを実現するには、矢印キーは有用で、出来たプログラムの品質も向上します。

今回は、矢印キーを活用して、使いやすく動きのあるプログラムを作るメリットを紹介します。



桁数選択の仕様

最初は3桁の設定にするので、最初の画面では以下のように表示します。

 3 DIGITS  <UP:DN> 

ここで、[↑]キーを押すと、桁数を増やして、表示を

 4 DIGITS  <UP:DN>

と変化させます。

ここで、[↓]キーを押すと、桁数が減るようにして、表示を

 3 DIGITS  <UP:DN>

に戻るようにします。


さて、表示が以下のように5桁になっている場合、

 5 DIGITS <UP:DN> 

[▲]キーを押すたとき、6にはならず、3に戻したいので、

3  ⇒ 4 ⇒ 5 ⇒ 3 ⇒ 4 ⇒ 5・・・

と循環して変化させます。

[▼]キーでも同様に、

3 ⇒ 5 ⇒ 4 ⇒ 3 ⇒ 5 ⇒ 4・・・

と循環させます。

これを実現するための、プログラムの例を紹介してゆきます。



プログラムの構造

先ず、矢印キーを押したことをリアルタイムで知る必要があります。これには Getkeyコマンドが有用です。

※ Casio Basic の優れている点の一つが Getkeyコマンドを使いこなせるところにあります。


[▲]のキーコードは84、[▼]のキーコードは85なので、

If 文を用いて、


Getkey→K

If K=84:Then
[必要な処理]
IfEnd

If K=85:Then
[必要な処理]
IfEnd



といった、記述をすれば、それぞれのキーを押した時に異なる処理をさせられます。ここでは、Getkeyで得られたキーコードを変数Kに入れておき、それを If 文で 判別して必要な処理を行います。

リアルタイムで[▲]キーと[▼]キーが押された事を検知して、リアルタイム処理を行うためには、ループ(繰り返し)処理と組み合わなければいけません。ここでは、Do ~ LpWhile と組み合わせてみます。


Do

Getkey→K

If K=84:Then
[必要な処理]
IfEnd

If K=85:Then
[必要な処理]
IfEnd

LpWhile [ループ継続条件]



※ LpWhileは、おそらく Loop While の略です。英語のWhileには 「~している間は」 と言う意味がありますから、LpWhile [ループ継続条件] となります。英語の意味さえ分かれば Basic の理解に役立ちます。


ここで留意すべきは、このDo~LoWhileのループが回っている間は、[▲]キーと[▼]キーを押した時の処理のみが行えると言うことです。矢印キーを押す以外にリアルタイムで必要な処理を行う必要がある場合は、その処理を Do ~ LpWhile ループ内に記述しなければなりません。

普通は、矢印キーで必要な選択を行わせ、選択が終了すると、その選択を確定させるために、何かキーを押させるようなユーザーインターフェースを考えます。

そこで、ここでは [EXE] キーを押した時に選択を確定することにします。つまり、この Do ~ LpWhileのループでは、[▲]キーと[▼]キーに加えて、[EXE]キーが押されることを監視するようにします。

[EXE]キーのキーコードは47なので、キーコード K が47でない場合はループを継続するようにしておけば、Kが47の時にループを抜けることができ、Dp ~ LpWhile ループの次の処理へ移ることができます。


Do

Getkey→K

If K=84:Then
[必要な処理]
IfEnd

If K=85:Then
[必要な処理]
IfEnd

LpWhile K≠47





あとは、各矢印キーが押された時の処理を書けば終わりです。

今回は、この処理の工夫がメインテーマです。



矢印キーが押された時の処理を考える

ここで記述する処理は大きく分けて2つあります。

・表示

・桁数の循環を実現する
 [▲]キーを押した時、3⇒4⇒5⇒3⇒4⇒5・・・・・・
 [▼]キーを押した時、3⇒5⇒4⇒3⇒5⇒4・・・・・・



ここでは、桁数を格納する変数と G とし、Gの初期値を3とします。すると初期表示は、

 HIT And Blow
3 DIGITS <UP:DN>
 <EXE>:START
 < ? >:ANSWER


となります。

では、Gの初期値を3とし、上の表示を含めると、以下のようなプログラムになります。


3→G
Cls
Locate 2,1,"HIT And BLOW"
Locate 1,2,G
Locate 3,2,"DIGITS"

Locate 2,3,"<EXE>
:START"
Locate 2,4,"< ? >:ANSWER"

Do

Getkey→F
If F=84:Then
[必要な処理]
IfEnd

If F=85:Then
[必要な処理]
IfEnd

LpWhile F≠47




ここで、上から2行目のCls は、画面表示を全てきれいに消去(クリア)します。Cls は Clear Screen から来ています。

次に、[必要な処理] の具体的な内容は、次の2つです。
(既に上で述べていますが、念のため...)

・リアルタイムに桁数を循環させる
・リアルタイムにGの値の表示を変更する


Gの値は、3、4、5が順に変化するので、矢印キーを1回押した時、基本的にはG+1 か G-1 をすれば良い。そして、循環させるために、5から3へ変化させる、或いは3から5へ変化させるところを工夫すれば良いわけです。

最も簡単な方法は、If 文の利用です。

[▲]キーを押した時の処理として、
If G≧5
Then 3→G
Else G+1→G
IfEnd


[▼]キーを押した時の処理として、
If G≦3
Then 5→G
Else G-1→G
IfEnd


そして、Gの表示を更新するには、

Locate 1,2,G

を上記のそれぞれのIf文の中に追加すれば終わりです。

If ~ Then ~ Else ~ IfEnd で出てくる ThenElse は、その英語の意味が分かっていれば、非常に分かりやすくなります。Then は 「そうならば...」と言う意味があり、Else は 「それ以外」 と言う意味があります。
もし G≦3 ならば、5→G (5をGに入れ)、それ以外の場合は G-1→G (Gから1を引き算して G に入れる) と言う理屈を、そのまま英語で表現しただけです。このように Basic は英語の意味さえ分かれば、非常に理解が楽になります。



※ "→" 命令は、Casio Basic 独特の代入命令です。パソコンの Basic では、代入命令に "=" を使って、G=5 などと記述します。


Locateコマンドは、必要な位置に必要な表示を行えるので、他の表示はそのままで桁数だけを書き直すことが出来る、大変便利なコマンドです。

※ Casio Basic の優れている点の1つに、Locateコマンドによる柔軟な表示能力があります。


3→G
Cls
Locate 2,1,"HIT And BLOW"
Locate 1,2,G
Locate 3,2,"DIGITS"

Locate 2,3,"<EXE>
:START"
Locate 2,4,"< ? >:ANSWER"

Do

Getkey→F
If F=84:Then
If G≧5
Then 3→G
Else G+1→G
IfEnd
Locate 1,2,G

IfEnd

If F=85:Then
If G≦3
Then 5→G
Else G-1→G
IfEnd
Locate 1,2,G

IfEnd

LpWhile F≠47





もう一つ、同じことを行うための別のプログラムを紹介します。いきなり例を挙げますが、ここでは僅か2行で [必要な処理] を実現しています。

個人的には、この方がエレガントなので、好きです。


3→G
Cls
Locate 2,1,"HIT And BLOW"
Locate 1,2,G
Locate 3,2,"DIGITS"

Locate 2,3,"<EXE>
:START"
Locate 2,4,"< ? >:ANSWER"

Do

Getkey→F
If F=84:Then
4+G-3Int((G+1)÷3)→G
Locate 1,2,G

IfEnd

If F=85:Then
2+G-3Int((G-1)÷3)→G
Locate 1,2,G

IfEnd

LpWhile F≠47



循環する桁数を 式として表現できるので、このようなプログラムも可能になるわけです。

この式の基本的な考え方は、「どんな整数でも3つの連続した整数にグループ分けすること出来る」 ことに基づいています。ここでは「剰余系」と言う考え方を利用しています。どんな整数でも3で割った時の余りは、0、1、2のどれかになります。これを3の剰余系と言います。

※ 5つにグループ分けしたい場合は、5の剰余系、つまり5で割った時の余りの数で分類すれば良いので、汎用性のある考え方です。


[▲]キーを押した時、基本的には G を1つ増やす、つまり G+1 とします。そして、この G+1 は、3、4、5のどれかに対応させるために、3の剰余系を利用しています。

整数 N を 3 で割った時の余りは、N - [3×Int(N ÷ 3)] で得られます。例えば、N=25 の時は、この式は 1 になります。


この式は、25÷3 = 8 余り 1 となることから、余りの 1 を求めています。少し細かくみていきます。

Int(N÷3)
は、253 で割って、整数部分を取り出しています。25÷3 = 8.3333333..... なので、整数部分は になります。余りの部分まで 3 で割っているので、.3333333.......と小数が現れています。そこで、8 を 3 倍して元に戻して、25 から引けば、余りが出てくるわけです。


或いは、中学レベルの数学の力を借りて、別の簡単な説明を試みます。

25 は、3の倍数 3A と 余り M を使えば、25 = 3A + M と現せます。
これを一般的に書くと、整数 N は、

N = 3A + M, (Aは整数)

この式を変形して、

M = N - 3A          [式1]

つまり、余りが求められます。

今、Mを求めたいのですが、A が何かは分かりません。但し、M0, 1, ,2 のいずれかです(これを利用します)。

N
3 で割り算すると、

N/3 = A + M/3

M0, 1, 2 のいずれかなので、M/3 は必ず 1 よりも小さい小数 0.xxxxx となります。つまり、
N/3 は、A.xxxxxxxx という小数になります。

そこで、N/3 の整数部を取り出せば、それは A となります。つまり、

A = Int(N÷3)         [式2]

となります。ここでは、M = 0, 1, 2 であることを利用しました。

[式1][式2] から、

M = N - 3×Int(N÷3)

と、余りが求められます。

このように、剰余系 と言う考え方は、プログラムで利用できるので、覚えておくと便利だと思います。

※ 剰余系 を数学的に厳密に説明すると、とたんに馴染みにくい、分かりにくい説明となります(Googleなどで検索すると、頭が痛くなる説明に出くわします、例えばここ)。要するに、整数はその余りによってグループ分けができると言うこと!! 3の剰余系は 0, 1, 2 の3つのグループ、5の剰余系は 0, 1, 2, 3, 4 の5つのグループに分けられて、どのグループに分けられるかは、簡単な式で現せる、ということです。



従って、G+1 を 3 で割った時の余りは、

(G+1) - 3Int( (G+1) ÷ 3)


で得られ、0、1、2 のどれかになります。これを 3、4、5 のどれかにするには、単純に 3 足せば良いですね。

よって、G+1 を 循環する 3、4、5 に対応させる式は、


3 + (G+1) - 3Int((G+1)÷3) = 4 + G - 3Int((G+1)÷3)


となるので、プログラムでは、この計算結果をGに代入します。



同様に、[▼]キーを押す時は、基本は G-1 となり、 その3の剰余系をを考えます。G-1 を3で割った時の余りは、

(G-1) - 3Int( (G-1) ÷ 3)

で得られ、0、1、2のいずれかになります。これを 3、4、5 のいずれかにするには、3を足せば良いので、G-1 を循環する 3、4、5に対応させる式は、

3 + (G-1) - 3Int(G-1)÷3) = 2 + G - 3Int((G-1)÷3)



となるので、プログラムでは、この計算結果をGに代入します。



If文を用いる方法式で計算する方法のどちらが良いかは、ケースバイケースです。

If文を使う方が、プログラムが分かりやすいので、バグが出にくいメリットがありそうです。式を使うと処理が速くなりそうですので、スピードが大切なゲームのプログラムでは、式を使った方が良いかも知れません。

今回の上記のプログラムの場合は、実際に比較してみると、処理速度はそれほど変わりません。If文による条件分岐が単純なのがその理由でしょう。処理速度が変わらないのならば、分かりやすい If 文を使った方が良さそうです。


プログラムによっては、If 等を用いた条件分岐が煩雑になると、明解な式を用いた時の処理速度が優位になる場合もありますので、私は式によるアプローチも試みるようにしています。



脱線してしまいました。

限られた画面スペースを有効に利用した入力方法には、矢印キーは非常に利用価値が有ることがお分かりだと思います。




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800Pプログラミング矢印キープログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

プログラム電卓ファンによる海外のコミュニティー

海外のコミュニティーは英語ですが、欧米だけでなく中東、アジアからの参加者もあります。読むだけでも日本では入手できない面白い話題が結構あります。

情報発信は、チョット気が重いのですが、私も Universal Casio Forum (UCF) でネタを提供してみています(Handle name: Krtyski)。
今のところ具体的なコメントは少ないのですが、レビュー数は確実に伸びているので、まぁ海外のプログラム電卓ファンにも気になる話題なのだろうと勝手に想像しています。

http://community.casiocalc.org/forum/44-your-projects/


そこで、これらの海外コミュニティーを紹介します。


Casiopeia

Universal Casio Forum (UCF)

CEMETECH (ケメテックと呼びます)




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800PCasioBasicプログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

fx-5800P:Locateコマンド【桁数のコントロール】

fx-5800P に搭載されている Casio Basic には、柔軟な表示を行うための Locateコマンド が備わっています。


fx-5800PLocateコマンド

書式Locate [x座標],[y座標],[表示内容]

引数
   [x座標]:1~16の範囲の値。これ以外を指定するとエラーとなる。

   ・[y座標]:1~ 4の範囲の値。これ以外を指定するとエラーとなる。

    ※ [x座標]、[y座標] には、表示内容の最初の文字の位置を指定する。
    ※ [x座標]、[y座標] には、数値、変数、式 を使える。

   ・[表示内容]文字列、数値、変数、式 を指定できる。

戻り値:なし



今回は、Locateコマンドの位置(座標)指定に式が使える効用を紹介します。


例えば、Hit&Blow で採用した以下の表示は、Locateコマンドを使っています。

HB-YouWin 


これは、ゲーム終了時に 6回の試行で正解が得られたことを表示しています。

プログラム内で、試行回数を格納する変数をCとしているので、この表示を行うためには以下のようなプログラムを書けば良いわけです。

Locate 5,1,"YOU WIN"
Locate 3,2,"IN"
Locate 6,2,C
Locate 8,2,"TRIES"
Locate 1,3,"<AC>:QUIT"
Locate 1,4,"<0> :TRY AGAIN"


上の画面写真は、6回の試行(C=6)で正解したケースです。


さて、試行回数10回で正解した場合、つまり C=10 の場合はどのような表示になるでしょう?

  IN 10TRIES

と、10 と TRIES が繋がって表示されます。

試行回数100回で正解した場合は(実際ここまで粘る人もいないでしょうが...)、C=100 に対してどのような表示になりますか?

  IN100RIES

このように TRIES の最初の T に 100 の最後の 0 (ゼロ)が被ってしまいますね。

これは、Locate 8,2,"TRIES" で、"TRIES"の表示開始の桁が 8 と設定されているからです。

では、C=100 のように3桁の場合に、以下のように正しく表示さるには...

  IN 100 TRIES

Locate 10,2,"TRIES" とすれば良さそうです。ところが、C=6 のように1桁の場合は以下のように間延びした表示になってしまいます。

  IN 6  TRIES

6 と TRIES の間にスペースが2つ入っています。

そこで、きれいに表示するためには、C の桁数に応じて、"TRIES"の表示開始位置を正しく設定したくなります。まぁ細かいことには拘らず、プログラムの本質には関係ないから、間延びしてもOK、と言う考えもあります。でも"簡単に"細かいことを解決できればより良いですね。


ところが、数の桁数を正しく分からないと、プログラムが正しく動作せずに困ることもあります。

例を挙げます。Hit&Blow プログラム(完成版)においては、予め指定された桁数よりも、大きい桁を入力すると、桁数が違うと言うエラー表示をして、再入力を促すようにしています。

入力した数の桁数を調べて、それが予め指定された桁数と同じかどうかをチェックしているわけです。桁数を3~5桁に自由に設定できるので、桁数チェックは重要になります。正しく数の桁数をチェックしなければゲームそのものの動作に大きく影響してしまいます。「まぁいいか」と言うわけにもゆきません。



数の桁数を調べるコマンドや関数があれば、それを使えば良いですね。



実は、fx-5800P に内蔵されている Casio Basic や内蔵関数には数の桁数が一発で分かる便利なものは有りません。そこで、桁数を調べる式を作って使います。

[ 整数Nの桁数 ] = 1 + Int(log(N))
 ※但し、Nが自然数(0でない正の整数 であることが条件になります.


いきなり答えを紹介しましたが、なぜこのようになるか、分かりますか?

ここでは、log (対数関数) と Int (小数部分を切り捨てて整数部分のみを得る関数) を組み合わせて使っています。
対数は高校の数学で出てきます。

log ax = x・log a

と言うように、[何か]の[何乗]と言う形から、[何乗]の部分を取り出せるわけです。

・log 1 = log (10 の 0乗) = log 100 = 0・log 10 = 0 ⇒ これは1桁

・log 10 = log (10 の 1乗) = log 101 = 1・log 10 = 1 ⇒ これは2桁

・log 100 = log (10 の 2乗) = log 102 = 2・log 10 = 2 ⇒ これは3桁

・log 1000 = log (10 の 3乗) = log 103 = 3・log 10 = 3 ⇒ これは4桁



桁数との関連が見えてきませんか?つまり、[乗数]+1 が桁数になっています。(ここで、 [何か]の0乗は、1と言う数学の決りがあります)



この例は、10、100、1000 といったキリの良い数ですが、123 の場合は、どうなりますか?

log123 は、log100 よりは大きく、log1000 よりは小さくなります(詳しく言えば、対数は単調増加関数だからこうなるのです)。

つまり...

log 100 < log 123 < log 1000

なので...

2 < log123 < 3

つまり、Log 123 は、小数で表される数で 2.xxxx となることが分かりますね。

電卓で計算させると、 log123 = 2.089905111 ですから、2と3の間にあることが確認できます。

そして、log123 の整数部分だけを取り出すと、2 となります。
で、この 2 に 1 を足すと、123の桁数3桁になりそうです。

つまり、1 + Int( log(123) ) = 3 となります。



fx-5800P には、整数部を取り出す Int() 関数が備わっていますから、この計算式をプログラムで使えます。


N が1以上10未満なら、log N は、0.xxxx、整数部に1を足すと桁数は1 

N が10以上100未満なら、log N は、1.xxx、整数部に1を足すと桁数は2

N が100以上1000未満なら、log N は、2.xxx、整数部に1を足すと桁数は3

うまくゆきますね!


従って、正の整数 N の桁数は、1 + Int( log N) ) で正しいわけです。これで桁数を求める計算式が確認されました。



入力した数Nの桁数が、正しい桁数よりも大きいかどうかをチェックして、正しい桁数よりも大きければエラーを表示するプログラムは、以下のようになります。ここで、正しい桁数は変数Gに格納されています。

If Int(log(N))+1>G
Then
Locate 12,2,"ERROR"
Locate 6,3,"EXTRA DIGIT"
IfEnd


1 + Int(log(N))Int(log(N)) + 1 も同じことです。



最後に、「間延びしないで美しい表示」を行うためには、以下のようなプログラムを書けば良いことになります。

Locate 5,1,"YOU WIN"
Locate 3,2,"IN"
Locate 6,2,C
Locate 8+Int(log(C)),2,"TRIES"
Locate 1,3,"<AC>:QUIT"
Locate 1,4,"<0>: TRY AGAIN"

Locateコマンドは、引数に [式] を使えるので、このようなことが可能になります。




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800PプログラミングLocateコマンドプログラム関数電卓

リンク集 | ブログ内マップ
関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

fx-5800P:Hit&Blow【完成版】

以前 fx-5800P【ゲーム】:Hit&Blow で取り上げ、fx-5800P で3桁の数字を当てる仕様で実際にプログラムを作りました。

その後、桁数を3桁、4桁および5桁に自由に変えて遊べる Hit&Blow を作って遊んでみました。

3桁が一番面白く、4桁は難易度が高くなりますがそれなりに面白いと思います。5桁バージョンは、難し過ぎてゲームとしてはつまらないかも知れません。

そこで、桁数を自由に変えて遊べる Hi&Blow を紹介します。


※ プログラムライブラリに収録しています ⇒ ここ


ゲームの仕様

ゲーム開始画面
1.ゲーム開始時に、数字の桁数を、3、4、5から選択・設定する
2.開始画面には、以下を表示する
  ・HIT And BLOW のゲームタイトル
  ・3~5の桁数の選択機能
  ・
:START、< ? >:ANSWER
3.開始画面で、秘密のキー(キーの同時押し)で正解を表示する


hb_Start4hb_Start5hb_Start3 
※ 桁数の選定は、矢印キー [▲] と [▼] で3~5が順次変化するようにする。
fx-5800P の16桁X4桁画面をフルに活かした画面設計にする。

ゲーム進行画面
4.電卓が出題する正解数を、△HIT、◇BLOW と言うヒントを元に当ててゆく
5.正解数は、各桁0~9各の異なる数字とし、一番左の桁は0であっても良い
6.入力する数字の桁に同じ数字があると、エラーを表示して正しい入力を促す
7.入力する数字の桁が、最初に指定した桁より多いと、エラーを表示して正しい入力を促す
8.何回目の回答かを、表示する
9.10回以内に正解すると、EXCELLENT と表示する
10.10回を超えても正解しない時は、QUIT? と表示する。
11.10回を超えて正解すると、GOOD と表示する。

hb_3d_3hb_4d_4hb_3d_bingo  

※ ゲーム進行画面は、既に作っている Hit&Blowと基本的に同じになる。


ゲーム終了画面
12.正解すると、終了画面で YOU WIN IN xx TRIES と正解するまでの回答数を表示する
13.正解できず、QUIT? の表示で[DEL]キーを押すと、終了画面で正解を示す
14.正解できずに終了すると、終了画面で YOU GAVE UP   ANSWER = xxxxx と表示する
15.終了画面では、
:QUIT、<0>:TRY AGAIN とメニューも併せて表示する

hb_FInish_win 



プログラムコード

以下の4つのルーチンから構成します。
ルーチン種別プログラム名説明
メインルーチンHIT AND BLOWプログラムの流れと表示を主に行う
サブルーチン1S1HB345入力数を各桁の数に分解する
サブルーチン2S2HB345正解の数を生成する
サブルーチン3S3HB345回答を入力させる、ゲーム本体の処理を行う
サブルーチン4S4HB345入力した数の判定及びその結果表示を行う

fx-5800P はパソコンとの通信機能が無いので、コードを手で入力するしかありません。チョット長いコードになりますが、入力して遊んでみてください。

今回のプログラムに関連した、幾つかのプログラミングTIPS を今後紹介する予定です。何かリクエストやご提案があれば、是非お聞かせください。


メインルーチン: "HIT AND BLOW" (41行)

HB345_Code_main   

サブルーチン: "S1HB345" (24行)
HB345_Code_sub1   

サブルーチン: "S2HB345" (27行)
HB345_Code_sub2       

サブルーチン: "S3HB345" (32行)
HB345_Code_sub3       

サブルーチン: "S4HB345" (38行)
HB345_Code_sub4   



プログラムの基本構成と簡単な説明

メインルーチン: "HIT AND BLOW"
 初期設定
   ↓
 Lbl 0
   ↓
 開始画面表示
   ↓
 桁数選択と決定
   ↓
 正解数を決める <---> 正解数生成サブルーチン: "S2HB345"
   ↓
 回答の入力 <------> 回答サブルーチン: "S3HB345"
   ↓             Lbl 0
 終了画面          回答数の桁分解 <-> 桁分解サブルーチン: S1HB345"
   ↓            入力エラー処理
 Goto 0             回答数の判定 <--> 回答判定サブルーチン: S4HB345"
                 正解でない時 Goto 0
                 正解すればメインルーチンへ戻る


このように、メインルーチンと4つのサブルーチンからプログラム全体を構成します。


メインルーチン: HIT AND BLOW"
ゲーム全体の流れの制御と主なメニュー表示を行い、正解数決定サブルーチン(S2HB345) と  回答サブルーチン(S3HB345) を呼び出す。

最初の画面の<?>:ANSWER のメニューで正解を知るための秘密のキーは、キーコードが1桁になるようなキー入力をすれば良い。そのためには、複数のキーの同時押しを行う。例えば[4]と[7]のキーを同時押しする。詳しくは
ここ を参照してください。

最初の画面で決めた桁数は変数Gに格納される(G = 3, 4, 5)。

回答サブルーチン で正解表示フラグが1 (D=1) になってメインルーチンへ戻ってきた場合は、"YOU GAVE UP" の表示及び正解表示 "ANSWER = xxx" を行う。


正解数作成サブルーチン: "S2HB345"
決定された桁数(3、4、5桁)に従って、正解数を決定する。全ての桁が異なる数になるようにするところがポイント。

桁数(G)に応じた桁数で正解を生成する。整数乱数を生成する関数 IntRan#()を使用し各桁ごとに任意の1桁の数を得る。ここではDoループを用いて、各桁で同じ数になる場合はDoループ回し続け、全ての桁が異なる数になる時にDoループを抜ける。

メインルーチンで<秘密のキー>を押すと変数Dに1が入り、このルーチンにおいてD=1の時には正解を表示する。


回答サブルーチン: "S3HB345"
ゲーム進行画面を表示し、数字の入力をさせ、各桁の数を得るための桁分解サブルーチンと、入力された数の回答判定サブルーチンを呼び出す。正解が得られるまで処理を繰り返し、正解が得られたらメインルーチンへ戻る。

入力したn桁(n = 3, 4, 5)の数で同じ数が含まれる場合は、桁分解サブルーチンがエラーグラフEに1を格納する。このルーチンでは E=1 の時、「同じ数が含まれている(ERROR SAME NUMBER FOUND IN DIGITS)」とエラー表示をして、再入力させる。

このルーチン全体をDoループの中に収める。桁数Gでヒット数がGになれば正解となるので、H≠Gである限り、Doループで回答サブルーチンを回し続け、H=Gになった場合だけメインルーチンへ戻る(return)。つまり、このルーチンがゲーム本体となる。


桁分解サブルーチン: "S1HB345"
入力された数を、各桁の数に分解する。桁数(G)に応じた3つのルーチンを含む。入力したn桁(N = 3, 4, 5)の数で同じ数が含まれる場合は、エラーフラグ(変数E)に1を格納する。


回答判定サブルーチン: "S4HB345"
入力された数に対して、HIT数とBLOW数の判定を行い、その結果を表示する。結果が表示されたら、[EXE]キーを押させて 回答サブルーチン(S3HB345)へ戻る。

10回以内で正解が得られると "EXELLENT" と表示する。11回以上で正解が得られると "GOOD" と表示する。11回以上で正解が得られない時は "QUIT?"(やめますか?) "<DEL>"と表示する。[DEL]キーを押すと正解表示フラグ(変数D)に1を格納してメインルーチンへ戻る。



主な変数

G:桁数(3,4,5のいずれか)

A:正解のn桁数
K:数Aの1番左の桁の数
L:数Aの左から2桁目の数
M:数Aの左から3桁目の数
I:数Aの左から4桁目の数
J:数Aの左から5桁目の数

N:回答するn桁数
X:数Nの1番左の桁の数
Y:数Nの左から2桁目の数
Z:数Nの左から3桁目の数
V:数Nの左から4桁目の数
W:数Nの左から5桁目の数

H:ヒット数
B:ブロー数

C:回答回数
D:正解表示フラグ:
 D=0:正解表示をしない
 D=1:正解表示する
E:回答数エラーフラグ:
 E=0:エラーなし
 E=1:同じ数の桁があるエラー

K:取得したキーコード




応援クリックをお願いします。励みになるので...

人気ブログランキングへ


FC2ブログランキングへ


keywords: fx-5800PゲームプログラミングHit&Blowプログラム関数電卓

リンク集 | ブログ内マップ

関連記事

テーマ : プログラム関数電卓
ジャンル : コンピュータ

最新記事
最新コメント
カテゴリ
C# (3)
検索フォーム
Visitors
Online Counter
現在の閲覧者数:
プロフィール

やす (Krtyski)

Author:やす (Krtyski)
since Oct 30, 2013


プログラム電卓は、プログラムを使ってナンボ!

実際に触って気づいたこと、自作プログラム、電卓プログラミングについて書いています

おもしろい・役に立つならクリックしてください。励みになります。
にほんブログ村 IT技術ブログ 開発言語へ
にほんブログ村


人気ブログランキングへ


FC2ブログランキングへ


写真: 「4駆で泥んこ遊び@オックスフォード郊外」

リンク
月別アーカイブ
Sitemap

全ての記事を表示する

RSSリンクの表示
最新トラックバック
ブロとも申請フォーム

この人とブロともになる

QRコード
QR