ぱっくんフィッシング VB 2005 13 プログラムの概要 パーティゲームとして良く知られた釣りゲームです マウスで釣り糸を操作して 開閉する魚の口に餌を垂らし 魚が餌を咥えると 釣り上げ 籠の中に入れます 直ぐに口を開けて 海に逃れる魚 中々餌を離さず 籠に入らない魚と 色々なバリエーションが楽しめます 一般的に 実用プログラムに比較するとゲームプログラムは 高度なテクニックを要求される事が多い 此処では ゲームプログラムを作成する事に依り 楽しみ乍ら プログラムの制作手順を習得する事を目的として居る 制作手順としては 実際の作業過程に従い 段階的に機能を追加する方法を採用して居る 此のプログラムを土台に 更に 各自で機能を追加して行く事が望まれる 今回の課題項目 アプリケーション画面のデザイン ( 標準コントロールの利用 ) プログラムの動作原理 ( イベント駆動型のプログラム ) プログラムの構成要素 ( オブジェクトとプロパティ ) 値の代入 ( 変数 オブジェクトのプロパティ ) グラフィックスの利用 (Graphics オブジェクト ) 条件に応じた処理 (If 文の利用 ) 自動的に行われる処理 ( タイマーの利用 ) -1-
オブジェクト プロパティ一覧 パネル ラベル 1 ピクチャボックス 1 ピクチャボックス 2 ピクチャボックス 4 ピクチャボックス 5 ピクチャボックス 3 ピクチャボックス 6 ラベル 2 ラベル 3 タイマー ボタン コントロールの種類 プロパティ プロパティの設定値 フォーム Name fishing Text パックンフィッシング パネル Name pnlscreen BackColor 192, 255, 255 Size 400, 399 ラベル1 Name lblhit BackColor Black( 黒 ) ForeColor Red( 赤 ) Text HIT!! ピクチャボックス1 Name picline line.gif Size 5, 100 ピクチャボックス2 Name picfish0 fish0a.gif Size 30, 30-2-
コントロールの種類 プロパティ プロパティの設定値 ピクチャボックス3 Name picfish1 fish1a.gif Size 30, 30 ピクチャボックス4 Name picfish2 fish2a.gif Size 30, 30 ピクチャボックス5 Name picsea Imege sea.gif Location 0, 350 Size 350, 50 ピクチャボックス6 Name picbank Imege bank.gif Location 350, 316 Size 50, 83 ラベル2 Name lbltime AutoSize False BackColor Blue( 青 ) ForeColor Red( 赤 ) Text 180 TextAlign MiddleRight ラベル3 Name lblscr AutoSize False BackColor Blue( 青 ) ForeColor White( 白 ) Text 0 TextAlign MiddleRight ボタン Name btnstart Text START!! タイマー Name tmrgo Interval 1000-3-
プログラムリスト Public Class fishing Private B( 2, 1 ) As Bitmap Private P( 2 ) As PictureBox Private F( 2 ), S, T As Integer ' ゲームを初期化する自作メソッド Private Sub GameInit( ) P( I ).Top = 360 : F( I ) = 0 S = 0 : lblscr.text = "0" T = 180 : lbltime.text = T.ToString( ) 1 コード記述画面を表示して左記のコードを入力する 2 上記 1 と同様に コード記述画面を表示して 左記のコードを記述する ' フォームが読み込まれた時の処理 Private Sub fishing_load( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles Me.Load B( I, 0 ) = New Bitmap( "fish" & I.ToString( ) & "a.gif" ) B( I, 1 ) = New Bitmap( "fish" & I.ToString( ) & "b.gif" ) P( I ) = Me.pnlScreen.Controls( "picfish" & I.ToString( )) Call GameInit( ) ' パネル上でマウスカーソルが移動した時の処理 Private Sub pnlscreen_mousemove( ByVal sender As Object, _ ByVal e As System.Windows.Forms.MouseEventArgs ) Handles pnlscreen.mousemove picline.top = e.y : picline.left = e.x If F( I ) < 0 Then P( I ).Top = picline.top + 95 P( I ).Left = picline.left - 12 lblhit.visible = False ' ボタン ( スタート ) がクリックされた時の処理 Private Sub btnstart_click( ByVal sender As System.Object, ByVal e As System.EventArgs ) _ Handles btnstart.click Call GameInit( ) : tmrgo.enabled = True -4-4 3 フォーム上のコントロールを配置して居ない処をダブルクリックして コード画面を表示し 左記のコードを入力する デザイン画面で イベント画面に切り替える 其の後 MouseMove の項目をダブルクリックして コード記述画面を表示し 下記のコードを入力する 5 デザイン画面で ボタンをダブルクリックして コード画面を表示し 左記のコードを入力する
' タイマーが一定間隔で行う処理 Private Sub tmrgo_tick( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles tmrgo.tick T -= 1 : lbltime.text = T.ToString( ) If T < 1 Then tmrgo.enabled = False MsgBox( "Game Over!", MsgBoxStyle.Information, " 終了 " ) Exit Sub If F( I ) = 0 Then If Int(Rnd( ) * 2 ) = 1 Then P( I ). = B( I, 0 ) P( I ).Left = Int( Rnd( ) * 70 ) + I * 100 P( I ).Top = 333 F( I ) = 1 ElseIf F(I) = -1 Then If Int( Rnd( ) * 5 ) < 1 Then F( I ) = 0 : P( I ). = B( I, 1 ) Do Until P( I ).Top > 350 P( I ).Top += 10 : Application.DoEvents( ) System.Threading.Thread.Sleep( 100 ) If P( I ).Top > 316 Then If P( I ).Left > 350 Then S += 1 : lblscr.text = S.ToString( ) Exit Sub Loop ElseIf F( I ) > 10 Then P( I ).Top = 360 : F( I ) = 0 ElseIf ( F( I ) - 1 ) Mod 2 = 1 Then P( I ). = B( I, 1 ) : F( I ) += 1 ElseIf ( F( I ) - 1 ) Mod 2 = 0 Then P( I ). = B( I, 0 ) : F( I ) += 1 If picline.top > 238 And picline.top < 242 Then If picline.left = P( I ).Left + 12 Then F( I ) = -1 : lblhit.visible = True End Class 6 デザイン画面で タイマーをダブルクリックして コード画面を表示し 左記のコードを入力する -5-
ワンポイントアドバイス 複数行に亘るステートメント 長いステートメントは 行継続文字で有るスペースとアンダースコアの組み合わせ ( _ ) を使用して 複数行に分割して入力する事が出来る 上記の例では イベントプロシージャの宣言文で 行継続文字を用いて Handles 句以下を次の行に記述して居る ( テキストでは 紙面の都合で 此の様な記述を仕て居る事が多い ) 但し 行継続文字に続けてコメントを入力する事は出来ない 例えば 下記のコードでは 構文エラーが発生する MsgBox(" エラー番号 :" & Err.Number & vbcrlf & _ Err.Description, _ MsgBoxStyle.Critical) ' エラー番号 ' エラー詳細 コンピュータは 構造上 縦スクロールに比べて 横スクロールはスムースではない 其の為横に長いコードは 見通しが悪く成る為 此の行継続文字を使用して 横スクロールしなくても良い長さに調整する事を推奨する 1 行に複数のステートメント 逆に ステートメントが短い場合等では ステートメントをコロン ( : ) で区切り 複数のステートメントを 1 行に記述する事が出来る Scr = 0: lblscr.text = Scr.ToString( ) Los = 0: lbllos.text = Los.ToString( ) 見通しの良いコードは 開発効率も向上するので 徒にスクロールしなくても良い様にコードを記述する事が望ましい 但し コードを読み易くする為に 適宜 空行を挿入する事も 必要な事で有る 要は 読み易いコードを記述する事を心掛けると謂う事で有る -6-