第4回:Small Basicを使ってみよう

こんにちは。「50歳からのプログラミング講座」を担当する JLabo(ジェイラボ)です。
前回は、ブロック崩しの基本になるグラフィック画面上でボールが動くプログラムを作りました。合わせてタイトルや得点を表示するテキスト画面も作りました。今回はボールを打ち返すパッドを追加していきます。これでやっとゲームっぽくなります。

進め方ですが、ボールを打ち返すパッドを配置して左右に動くようにしてみます。特定のキーを押すことによって画面が反応するという概念を勉強します。このプログラムが出来たら前回勉強したプログラムに追加して、ボールを打ち返すところまで仕上げます。ブロック崩しのブロックはまだ出てきませんが、気長にお待ちください。

それでは始めていきましょう。まずはSmall Basic の開発環境を起動します。「新規」をクリックしてください。

第4回:Small Basicを使ってみよう

以下のプログラムですが、実は肝心の所が抜けています。ここではとりあえずコピーして貼り付けてください。

幅1 = 640  'パッドの移動範囲を限定するためのゲームエリア幅を設定します
ボールサイズ = 16  'パッドの位置はボールの大きさも考慮するので設定しておきます。
パッド幅 =128 'パッドの幅を設定します
オレンジ="orange"
GraphicsWindow.BrushColor = オレンジ ' ' 図形の塗りつぶしに使うブラシの色
パッドの横 = 幅1/2-ボールサイズ/2
箱の幅 = 64
' 指定された横幅と高さで四角形を追加します
パッド = Shapes.AddRectangle(パッド幅, 12)

増分 = 0.01
ゲームStart:
Shapes.Move(パッド, パッドの横 - パッド幅/2, GraphicsWindow.Height - 12)
'最後に押されたキーを「入力Key」 に割り当てます。
入力Key=GraphicsWindow.LastKey
If 入力Key= "Space" Then
パッドの横 = パッドの横 + 増分
EndIf

goto ゲームStart

このプログラムでは、スペースキーを押すとパッドがゆっくり左に移動するはずです。もしエラーが出て動かない場合は、エラーコードに表示されている行番号を見て修正してください。入力されたキーに対応するためには各キーに入力Key= “Space” のように割り当てられた定義が必要です。

本題から少しそれますが、結構重要なのでご紹介しておきます。キーに対応したプログラム上の定数を示しています。

キー   LastKey
F1~F12  "F1" ~"F12"
1~0  "D1" ~"D0"
左側Windowsキー   "Lwin"
右側Ctrl "RightCtrl"
左側Ctrl "LeftCtrl"
右側Shift "RightShift"
左側Shift "左側Shift"
] "Oem6"
[ "OemOpenBlackets"
→ "Right"
← "Left"
↑ "Up"
↓ "Down" 
PgDown "Next"
PgUp "PageUp"
Backspace "Back"
Tab "Tab" 
無変換 "ImeNonConvert"
+ "OemPlus"
- "OemMinus"
, "OemComma"
. "OemPeriod"
Alt "System"
Home "Home"
Enter "Return"
Del "Delete"
スペース "Space"
Ins "Insert"

これらはネットで検索すると出てきますが、 Small Basic のHelpにはありません。今後も Small Basic でプログラムを作成するお考えの読者様用に作成したキーワード検索用アプリに登録しておけば、覚えておく必要がなく便利かと思います。

第1回でご紹介した MyHelp for Small Basic を起動して、KeyDownと入力して検索してください。

GraphicsWindow.KeyDownが Hit すると思いますので、右下の MyMemo にこのリストを貼付、保存してください。たとえば F1 で検索すると、貼り付けたリストを参照出来るようになるので便利かと思います。
第4回:Small Basicを使ってみよう

話を戻します。

ゲームStart:
Shapes.Move(パッド, パッドの横 - パッド幅/2, GraphicsWindow.Height - 12)
'最後に押されたキーを「入力Key」 に割り当てます。
入力Key=GraphicsWindow.LastKey
If 入力Key= "Space" Then 
パッドの横 = パッドの横 + 増分
EndIf

goto ゲームStart

この部分を以下に入れ替えてください

ゲームStart:
Shapes.Move(パッド, パッドの横 - パッド幅/2, GraphicsWindow.Height - 12)
入力Key=GraphicsWindow.LastKey '最後に押されたキーを「入力Key」 に割り当てます。
If 入力Key="Right" Then
パッドの横 = パッドの横 + 増分
If パッドの横 > 幅1-箱の幅 then
パッドの横 = 幅1-箱の幅/2
EndIf
EndIf
If 入力Key="Left" Then
パッドの横 = パッドの横 - 増分
If パッドの横 < 箱の幅 then 
パッドの横 = 箱の幅/2 
EndIf  
Endif 
Goto ゲームStart 

これで右矢印・左矢印に反応してパッドが動くようになったと思います。パッドが右または左端で止まるような条件式をIF文に組み込んでいます。

これで今回のパッドを横に動かすロジックを完了しますが、これではおもしろくないので一気にボールを打ち返すところまでプログラムを作ってみます。

その前に、もう一つ勉強しましよう。

Small Basic では、While~EndWhile というコマンドが用意されています。goto文と条件式を組み合わせたコマンドで同じ事ができるのですが慣れると使いやすいコマンドです。

これをプログラムのスタート用として組み込んでみました。

目印="True"        	‘目印に”真" を割り当て
While (目印)         	‘目印が "虚" になるまで繰り返す。
  If 入力Key= "Space”  Then ‘ もし入力Key が スペースキーだったら
	目印="False"  ‘  目印を "虚" に割り当てる 
 EndIf   ‘もし の条件式の終わり
Endwhile              	’条件が一致したら繰り返しをやめる。
‘True,False などわかりにくい記述をしていますが
目印=1
While (目印=1)
  If 入力Key= "Space" Then
	目印=2
  EndIf 
Endwhile
‘でも同じ事です

では、今回のパッドを左右に動かすプログラムを前回のボールが動くプログラムと合体させてみましょう。いくつかご説明していないコマンドが出てきますが MyHelp for Small Basic で確認してみてください。

'ブロック崩しサンプル 2020/09/25 ダウンロード
タイトル1="ジィジが作った"
タイトル2="太郎のブロック崩し"
 
GraphicsWindow.Title =タイトル1 + タイトル2
 
'========== 初期設定 ========
 
難易度 =2  ' 難易度の初期設定
 
初期設定開始:
 
' ==========色の定義()   ' 色の定義をします。
 
黒色="Black"
濃青="DarkBlue"
濃緑="DarkGreen"
濃水色="DarkCyan"
濃赤="DarkRed"
濃マゼンタ="DarkMagenta"
濃黄="DarkYellow"
濃白="Gray"
灰色="DarkGray"
青色="Blue"
緑色="Green"
水色="Cyan"
赤色="Red"
マゼンダ="Magenta"
黄色="Yellow"
白色="White"
オレンジ="orange"
背景色= GraphicsWindow.GetColorFromRGB(64, 64, 64)
 
'======== 寸法設定() ' 各要素のサイズを設定します。
 
幅1 = 640   'ゲームエリア
幅2 = 400   ' データ表示エリア
高さ = 480
パッド幅 =128
箱の幅 = 64 
箱の高さ = 24
 
'======= 条件設定() ' 各要素の条件を設定します。
 
ボールサイズ = 16
縦速度Max = 10
横速度Max = 5
 
増分 = 7

重力 = 0.015
反発=0.9
 
'========================================
開始ポイント:  '  開始ポイント ここから始まります。
'========================================
 
ボール座標x =   幅1 / 2 - ボールサイズ /2
ボール座標y =  箱の高さ * (10+2)
 
横速度 = 0
縦速度 = 0
 
GraphicsWindow.Clear()   '  画面を初期化のために消去する
GraphicsWindow.BackgroundColor =背景色 ' Graphics Window の背景色を取得または設定します
GraphicsWindow.BrushColor = 白色   ' 図形の塗りつぶしに使うブラシの色
 
GraphicsWindow.BrushColor = オレンジ 	' 図形の塗りつぶしに使うブラシの色
GraphicsWindow.PenWidth = 0 + 1  	'  図形の描画に使うペンの太さ
GraphicsWindow.Width = 幅1 + 幅2  'ADD   '   Graphics Window の横幅を取得または設定します
GraphicsWindow.Height = 高さ   'ADD 	'   Graphics Window の高さを取得または設定します
 
座表X1 = 幅1 + 2  ' 仕切りの線座標
座表X2 = 幅1 + 2
座表Y1 = 5
座表Y2 = 高さ
 
GraphicsWindow.PenColor = 白色  	' 	図形の描画に使うペンの色
GraphicsWindow.DrawLine(座表x1,座表y1,座表x2,座表y2)   '  点から点へ直線を描きます。
 
  
  
GraphicsWindow.BrushColor = オレンジ 	'   ' 図形の塗りつぶしに使うブラシの色
 
パッドの横 = 幅1/2-ボールサイズ/2
 
GraphicsWindow.BrushColor = オレンジ 	'   ' 図形の塗りつぶしに使うブラシの色
パッド = Shapes.AddRectangle(パッド幅, 12)	' 指定された横幅と高さで四角形を追加します
Shapes.Move(パッド, パッドの横 - パッド幅/2, GraphicsWindow.Height - 12)
 
GraphicsWindow.BrushColor = 水色
GraphicsWindow.FontSize = 30
GraphicsWindow.FontName = "Meiryo UI"
GraphicsWindow.FontBold = "False"
 
  GraphicsWindow.DrawText(700,20,タイトル1 )
GraphicsWindow.DrawText(750,50,タイトル2 )
 
GraphicsWindow.BrushColor =青色
GraphicsWindow.FontSize =20
 
 
 
GraphicsWindow.BrushColor = 白色 '   ' 図形の塗りつぶしに使うブラシの色
GraphicsWindow.PenColor = 白色	' 	図形の描画に使うペンの色
 
'====== ボールの初期位置=================
 
ball = Shapes.AddEllipse(ボールサイズ, ボールサイズ)   '  指定さ'れた横幅と高さで楕円を追加します
Shapes.Move(ball, ボール座標x , ボール座標Y)
 
 
 
 
GraphicsWindow.KeyDown =OnKeyDown
GraphicsWindow.KeyUp =OnKeyUp
 
 
目印="True"
While (目印)
  If 入力Key= "Space" Then
	目印="False"
  EndIf
Endwhile
 
ゲーム開始位置:  '==================
 
If 入力Key="Right" Then
  パッドの横 = パッドの横 + 増分
  If	パッドの横 > 幅1-箱の幅  then
	パッドの横 = 幅1-箱の幅/2
  EndIf
EndIf
 
If 入力Key="Left" Then
  パッドの横 = パッドの横 - 増分
  If	パッドの横 < 箱の幅 then
	パッドの横 = 箱の幅/2
  EndIf
EndIf
 
if 難易度 <= 2 Then if GraphicsWindow.LastKey = "Z" Then パッドの横 = ボール座標x EndIf EndIf Shapes.Move(パッド, パッドの横 - パッド幅/2, GraphicsWindow.Height - 12) If 難易度 = 1 Then パッドの横 = ボール座標x EndIf 縦速度 = 縦速度 + 重力 If 縦速度 > 縦速度Max Then
  縦速度 = 縦速度Max
EndIf
 
If 縦速度 < -縦速度Max Then 縦速度 = -縦速度Max EndIf If 横速度 > 横速度Max Then
  横速度 = 横速度Max
EndIf
 
If 横速度 < -横速度Max Then 横速度 = -横速度Max EndIf ボール座標x = ボール座標x + 横速度 ボール座標y = ボール座標y + 縦速度 Frg=0 If ボール座標x + ボールサイズ + 横速度 >= 幅1  Then  
  Frg=1
EndIf
 
If ボール座標x <= 0 Then
  Frg=1
endIf
 
If Frg=1 Then
 
  Sound.PlayClick()
  横速度 = -横速度
 
  If ボール座標x <= 0 Then
	ボール座標x = 1
  Else
	ボール座標x = 幅1 - ボールサイズ - 1
  EndIf
 
EndIf
 
If (ボール座標y <= 0) Then Sound.PlayClick() 縦速度 = -縦速度 ボール座標y = 1 EndIf パッドY = Shapes.GetTop(パッド) パッドX = Shapes.GetLeft(パッド) If ボール座標y + ボールサイズ > パッドY then
  if  ボール座標X + ボールサイズ >= パッドX then
    If  ボール座標x <= パッドX + パッド幅 Then
  
      パッドPoint = ((ボール座標x + ボールサイズ / 2) - (パッドX + パッド幅 / 2))
      縦速度 = -(縦速度 * 0.5 + (パッド幅 / 2 + ボールサイズ - Math.Abs(パッドPoint)) / 30)
      横速度 = 横速度 + パッドPoint / 20
      ボール座標y = パッドY - ボールサイズ
    EndIf
  EndIf
Endif
 
Shapes.Move(パッド, パッドの横 - パッド幅/2, GraphicsWindow.Height - 12)
 
Shapes.Move(ball, ボール座標x, ボール座標y)
 
X値1 = Math.Floor(ボール座標x / 箱の幅)
Y値1 = Math.Floor(ボール座標y / 箱の高さ)
X値2 = Math.Floor((ボール座標x + ボールサイズ) / 箱の幅)
Y値2 = Math.Floor((ボール座標y + ボールサイズ) / 箱の高さ)
 
x当たり = 0
y当たり = 0
 
 
 
If x当たり <> 0 Then
  横速度 = -横速度 * 反発
EndIf
 
If y当たり <> 0 Then
  縦速度 = -縦速度 * 反発
EndIf
 
Program.Delay (7)
 
If (ボール座標y > 高さ) Then
 
  GoTo ゲーム終了
 
EndIf
 
 
再スタート:  ' 再開用のラベル
 
Goto  ゲーム開始位置
 
ゲーム終了:
 
' Sound.PlayBellRing()
GraphicsWindow.ShowMessage("残念でした また頑張ろう", "GAME OVER")
 
GoTo 初期設定開始
 
 
Sub OnKeyDown
 
  入力Key=GraphicsWindow.LastKey
 
EndSub
 
Sub OnkeyUp
 
  入力Key=""
 
EndSub

なお、ご説明していないオプションが組み込まれています。ヒントは ”Z” です。プログラムを確認してこのオプションをお楽しみください。このプログラムは Small Basic のサイトに登録しました。コピーに失敗したり手っ取り早くソースを見たいという方は以下のIDでダウンロード出来ます。

JPL821
第4回:Small Basicを使ってみよう

インポートをクリックしてプログラムIDを入力します。 小文字でも大丈夫です。
第4回:Small Basicを使ってみよう

プログラムがインポートされるので実行ボタンをクリックするとゲームが起動します。
第4回:Small Basicを使ってみよう

スペースキーでゲームが開始しますので、左右の矢印キーで打ち返してください。結構難しいと思いますが、プログラムに記述されている定数や計算式を変更して、簡単に打ち返すにはどうしたらよいかなど、いろいろ変化させてお楽しみください。


さて、ここからは「我が家の工夫」についてご紹介させて頂きたいと思います。

DIYが好きで道具を少しずつ買い集めています。毎月1万円欲しい物を買ってその代わりに禁煙することにしたことが発端です。部品や工具だと結構いろいろそろえることが出来ます。

今回はカッターナイフをご紹介します。
第4回:Small Basicを使ってみよう
第4回:Small Basicを使ってみよう

1番目は刃厚0.2mmの超薄刃です。 切断面がきれいですが当然弱いので使いにくいです。
2番目は少し厚い刃厚0.3mmで切断面がきれいで使いやすい感じです。
3番目は刃幅12.5mm で新しい刃先が12枚使えます。このバージョンも 刃厚0.2,0.3,0.4 があり一番使いやすいタイプです
4番目は布などを切るロータリータイプです。
最後はABSやアクリル板などに深いキズをつけて折り曲げ切断するためのカッターナイフです。とても便利です。

第4回:Small Basicを使ってみよう
写真は回転型のコンパスです。ベアリングでサポートされていて穴に鉛筆を入れて回せば簡単に円が描けるのですがここに極細のカッターナイフを入れて回せばきれいに円を切ることが出来ます。

第4回:Small Basicを使ってみよう
先端が爪楊枝と同じくらいなので厚紙にはむきません。

第4回:Small Basicを使ってみよう
刃が台形のユーティリティナイフです。

第4回:Small Basicを使ってみよう
10枚の刃が内蔵されていてレバーで刃を入れ替えます。外した刃は前後を逆にして収納すると合わせて20枚の刃先が使える仕組みです。 刃がちょうど良い出量で固定されているのとホールドがしっかりしているので厚物でも安心です。

第4回:Small Basicを使ってみよう
こちらは厚物専用です。5.5mmベニアも簡単に切断出来ます。

第4回:Small Basicを使ってみよう
こちらはデザインナイフになります。上から2番目は新聞切り抜き専用でガイドがあるので1枚しか切れません。ずいぶん昔に購入しましたが今でも同じ物が売っています。一番下はセラミックのデザインナイフです。バーゲンで購入しましたがもったいないので一度も使っていません。

第4回:Small Basicを使ってみよう
パイプカッターと内バリ除去用のツールです。パイプカッターは円の刃を押しつけながら全体を回転させることできれいにパイプを切断します。内径のバリを取るバリ取りカッターはR状の刃の軸が回転することによって簡単にバリを除去出来ます。直線も可能ですがパイプの外径は処理できません。

第4回:Small Basicを使ってみよう
木工の小口には化粧テープを貼ります。天然木のテープだと厚さや木目のためにカッターナイフでは難しいしカンナでは内側は処理できません。この端面を面取りする専用カッターです。セラミックの刃を強く押しつけることによって均一な面取りをすることが出来ます。

これらは大工心得のある方なら皆、おなじみのツールと思いますがホームセンターに行っても工具コーナーには行かない方にとってはちょっとだけ珍しいかもしれない と思ってご紹介しました。

しかし、まだまだ珍しい物がいっぱいあって、そのうち欲しいなというものも少なくありません。これもまたささやかな道楽かな思っています。
では次回をお楽しみにして頂ければ幸いです。