第5回:Small Basicを使ってみよう
こんにちは。「50歳からのプログラミング講座」を担当する JLabo(ジェイラボ) です。
前回はブロック崩しゲームのメインとなる「ボールを打ち返すパッド」を作りました。ユーザーが操作することでボールを打ち返すことができ、これでやっとゲームらしくなりました。
Small Basic はグラフィック画面を使ったプログラムは簡単で高機能なのですが、テキストを表示するにはちょっと癖があります。また参考文献やサンプルプログラムを探してもあまり適当な例がありません。通常のゲームでは、テキスト画面ではなくグラフィック画面で文字を表示していますが、今回は一旦ゲームから外れてテキスト画面に特化したプログラムを勉強してみたいと思います。
昔の「MS-DOS画面」を思い出す方もいるかもしれませんが、テキストに表示する機能を習得することで「対話型のプログラム」を簡単に作ることができるようになります。
それではまず Small Basic を起動してください。以下のプログラムをコピー、貼付で「実行」ボタンをクリックします。
TextWindow.Show()
TextWindow.WriteLine("なにか入力して Enter を押してください。")
Ans=TextWindow.Read()
TextWindow.WriteLine("入力したのは " + Ans)
画面をテキストモードにする。
なにか入力して「Enter を押してください。」とメッセージを出し、データ入力を待つ。
入力されたデータを 変数 Ansに割り当てる。
入力されたら結果を表示して終了する。
原理的にはこれで完了です。
もし数字に限定した入力が必要な場合は Read() を ReadNumber() に変更します。
TextWindow.Show()
TextWindow.WriteLine("なにか入力して Enter を押してください。")
Ans=TextWindow.ReadNumber()
' 数字以外の入力は受け付けません。
TextWindow.WriteLine("入力したのは " + Ans)
画面をテキストモードにする。
なにか入力して Enter を押してください。とメッセージを出しデータ入力を待つ。
入力されたデータを変数Ansに割り当てる。
入力された値が数字でない場合は受け付けない。
入力されたら結果を表示して終了する。
座標を設定することで表示や入力の座標を固定することが出来ます。
対話型の場合はこのような配慮も必要かもしれません。
プログラムが面倒になったような気がしますが CursorLeft と CursorTop が増えただけです。
TextWindow.Show()
TextWindow.CursorLeft=3
TextWindow.CursorTop=5
TextWindow.WriteLine("数字を入力してください。Enterで終了")
TextWindow.CursorLeft=4
TextWindow.CursorTop=6
Ans=TextWindow.ReadNumber()
TextWindow.CursorLeft=5
TextWindow.CursorTop=7
TextWindow.WriteLine("入力したのは " + Ans )
' 数字以外の入力は受け付けません。
画面をテキストモードにする。
表示の横座標を設定する。
表示の縦座標を設定する。
数字を入力してください とメッセージを出し データ入力を待つ。
表示の横座標を設定する。
表示の縦座標を設定する。
入力されたデータを変数Ansに割り当てる。
表示の横座標を設定する。
表示の縦座標を設定する。
入力されたら結果を表示する。
入力が0なら終了する Enterでも終了します。
このプログラムに条件判断の機能を追加して 0 を入力するまでプログラムを継続するようにしてみましょう。
TextWindow.Show()
Start:
TextWindow.CursorLeft=3
TextWindow.CursorTop=5
TextWindow.WriteLine("数字を入力してください。Enterで終了")
TextWindow.CursorLeft=4
TextWindow.CursorTop=6
Ans=TextWindow.ReadNumber()
TextWindow.CursorLeft=5
TextWindow.CursorTop=7
TextWindow.WriteLine("入力したのは " + Ans )
' 数字以外の入力は受け付けません。
If Ans=0 Then
Program.End()
EndIf
Program.Delay(1000)
TextWindow.Clear()
Goto Start
画面をテキストモードにする
繰り返しのために番地を用意しておく
表示の横座標を設定する
表示の縦座標を設定する
数字を入力してください とメッセージを出し データ入力を待つ
表示の横座標を設定する
表示の縦座標を設定する
入力されたデータを変数Ansに割り当てる
表示の横座標を設定する
表示の縦座標を設定する
入力されたら結果を表示する
入力が0なら終了する Enterでも終了します。
1秒(1000msec) プログラムを停止する
画面を消去する
Start に飛びます。
いかがでしょうか?
このロジックを応用して簡単なプログラムを作成することができれば幸いです。
例として記憶力測定ゲームを作って見ます。数字を1000msec表示させてから消去します。その数字を入力して正解、不正解をカウントします。
例では 最大値を9999 にしています。(桁数ではありません。)
'記憶力測定プログラム 2020/11/01 Jlabo
TextWindow.Show()
正解=0
不正解=0
回数=0
最大値=9999
停止=1000
Start:
TextWindow.Clear()
textWindow.CursorLeft=0
TextWindow.CursorTop=1
数回=数回+1
Pb=Math.GetRandomNumber(最大値)
TextWindow.WriteLine(" " + 数回 +"回目 この数を記憶してください。 " + Pb )
Program.Delay(停止)
TextWindow.CursorTop=1
TextWindow.WriteLine("==========================================")
TextWindow.CursorTop=2
TextWindow.WriteLine("先ほどの数字を入力してください。")
Ans=TextWindow.ReadNumber()
If Ans=0 Then
Program.End()
EndIf
If Ans=Pb Then ' 正解
正解 =正解+1
TextWindow.WriteLine("正解です。正解=" + 正解 + " 不正解=" +不正解 )
Else
不正解= 不正解+1
TextWindow.CursorTop=3
TextWindow.WriteLine("残念 正解は"+pb)
TextWindow.CursorTop=4
TextWindow.WriteLine("不正解です。" + 正解 + " 不正解=" +不正解 )
EndIf
TextWindow.Pause()
TextWindow.CursorTop=4
'TextWindow.WriteLine("")
Goto Start
このプログラムはWebに登録してありますのでインポートから読み込むことが出来ます。
プログラムIDは GNQ489 になります。
あるサイトでこの例に関連し、正解率80%の場合の桁数による評価の記述がありました。この例題ではこの評価ができるようになっていませんが、数カ所の変更で対応可能と思われます。もしよろしければ挑戦してみてください。
桁数 | 評価 |
9 | 天才 |
8 | 秀才 |
7 | 良好 |
6 | 平均 |
5 | 老化始まり |
4 | 老化 |
3 | 痴呆始まり |
2 | 痴呆 |
挑戦される場合はぜひ第1回目でご案内した Small Basic 用支援ツール MyHelp を使って見てください。
もう1つ例題をご紹介します。
自分の誕生日を入力して何曜日かを知る方法はたくさんありますが、たとえばエクセルでは書式で ”AAA” とするだけで曜日を表現してくれます。
ではエクセルはどんな計算をしているのでしょう?
曜日の計算はとても難しい様な感じですが、簡易的な計算式を見つけました。この式を使ってプログラムを作って見ましょう。
1900年~2100年くらいはカバーしているようです。
TextWindow.WriteLine("西暦年")
A=TextWindow.ReadNumber()
TextWindow.WriteLine("月")
B=TextWindow.ReadNumber()
TextWindow.WriteLine("日")
C=TextWindow.ReadNumber()
If B-3>=0 Then
B=B+1
Else
B=13+B
A=A-1
EndIf
Yb[1]="日曜"
Yb[2]="月曜"
Yb[3]="火曜"
Yb[4]="水曜"
Yb[5]="木曜"
Yb[6]="金曜"
Yb[7]="土曜"
N=Math.Floor(365.25*A)+Math.Floor(30.6*B)+C-621049
Y=(N-Math.Floor(N/7)*7)+1
TextWindow.WriteLine("曜日は " +Yb[Y] + " です。")
Math.Floor(引数) は整数を戻す関数です。エクセルの場合は =INT(セル座標) です。
年齢、体重を入力してBMIを表示させるなどもおもしろいかもしれません。BMI=体重(Kg)÷{身長(m)×身長(m)}
計算結果の評価は
BMI | 評価 |
18.5未満 | 低体重 |
18.5~25未満 | 普通体重 |
25~30未満 | 肥満 1度 |
30~35未満 | 肥満 2度 |
35~40未満 | 肥満 3度 |
40以上 | 肥満 4度 |
今回のプログラム講座はここまでです。いかがでしたでしょうか。
次回は、今回ご紹介したTextWindowではなく、GraphicsWindow に文字を表示させる方法をご紹介したいと思います。お楽しみに!!
ではここからは恒例の「我が家の工夫」コーナー。ただ今回は工夫ではなく、様々な工具をご紹介します。
DIYで工夫をするときは様々な工具が活躍するのですが、私が持っている「板金や線を切る道具」の一部をご紹介しますね。
まず、厚い金属板だと「金切ノコ」で切りますが、薄い場合は「金切りはさみ」の出番です。刃先がギザギザになっているためちょっと不思議ですが、切断面が鋭利にならなくて安全です。
こちらの金切鋏は刃の中央がR状に逃げていて、曲線の切断に適しています。
テコになっていて少し厚めのものも楽に切断出来ます。刃も厚くプレスの様な感じでアルミ板なら2~3mm くらいは何とか大丈夫です。長さは40mm程度しか切れないのが欠点です。
こちらは金切りはさみの強力タイプで一番使いやすいと思います。
ハンドニブラーです。 板の中に四角な孔を開ける場合に使います。
手が痛くなるので最近電動のものを購入しました。
充電ドライバーに取り付けた写真です。手が3本必要です。
ドリルで穴を開ける場合にポンチでキズをつけてセンターを出します。この時使うのが小さなハンマーです。鉄ではなく銅なので、打撃が優しくてなにかと使いやすく重宝しています。
オートポンチは押しつけるだけでバネの力でセンターを出してくれるのでさらに便利です。
電線の皮むきはコツがいりますが このワイヤーストリッパーがあれば大変楽です。電線のサイズごとにスリットが用意されています。
スリットは1つですが、ねじで刃の隙間を調整出来るタイプです。
TVアンテナに使う同軸ケーブル専用のストリッパーです。カッターナイフで被覆をむくと外側の編組線(シールド線)にキズをつけショートの原因になってしまいます。挟み込んで1回転させれば被覆だけきれいに切り取れます。
ニッパーはいろいろなものを切断するのに役に立ちます。これは線材を切るのに使いやすいタイプです。
薄刃のプラスティック用です。プラモデルを作るときは必須工具です。固いものを切ると一発で刃が欠けます。
こちらは丈夫な刃先で、切るというより釘やステップラーを挟んで抜くなどの用途に使っています。
モールカッターはプラスティック用ですがラチェット式なので超強力です。怖いくらいザックリと切断できます。
以上、今回は「切る」をテーマに私の持っている道具のご紹介をさせて頂きました。
では次回をお楽しみにして頂ければ幸いです。