インベーダープログラム

Similar documents
ブロック パニック

ルーレットプログラム

ブロック崩し風テニス

かべうちテニス

データアダプタ概要

倉庫番

VB実用⑦ エクセル操作Ⅰ

相性占いプログラム

グラフィックス

ドッグファイト

神経衰弱ゲーム

Userコントロール

占領双六ゲーム

ICONファイルフォーマット

VB.NET解説

3D回転体プログラム

プロシード

ファイル操作-インターネットキャッシュ

バスケットボール

NotifyIconコントロール

パラパラ漫画

回文作成支援プログラム

回文作成支援プログラム

Visual Basic 資料 電脳梁山泊烏賊塾 コレクション初期化子 コレクション初期化子 初めに.NET 版の Visual Basic では 其れ迄の Visual Basic 6.0 とは異なり 下記の例の様に変数宣言の構文に 初期値を代入する式が書ける様に成った 其の際 1 の様に単一の値

わにわにパニックプログラム

VB 資料 電脳梁山泊烏賊塾 音声認識 System.Speech の利用 System.Speech に依るディクテーション ( 音声を文字列化 ).NetFramework3.0 以上 (Visual Studio 2010 以降 ) では 標準で System.Speech が用意されて居るの

ListViewコントロール

ファイル操作

ドライブは安全運転で in 滋賀♪

Microsoft Word - VB_10.doc

回文作成支援プログラム

平成 30 年度 プログラミング研修講座 岩手県立総合教育センター

万年暦プログラム

ウィンドウ操作 応用

アプリケーション

チャットプログラム

回文作成支援プログラム

画像閲覧プログラム

はるよちゃんっ!

プロセス間通信

モグラ叩きプログラム

ファイル監視

草競馬プログラム

スロットプログラム

(Microsoft Word \203v\203\215\203O\203\211\203~\203\223\203O)

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 関数とメソッド 関数とメソッド Python には関数 (function) とメソッド (method) が有る モジュール内に def で定義されて居る物が関数 クラス内に def で定義されて居る物がメソッドに成る ( 正確にはクラスが

Prog2_12th

VB実用⑩ エクセル操作Ⅳ

万年暦プログラム

占領双六ゲーム

VB実用⑬ 印刷Ⅲ(PrintFormメソッド)

相性占いプログラム

万年暦プログラム

回文作成支援プログラム

通信対戦プログラム

プラグイン

ファイル操作-バイナリファイル

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

VB実用⑧ エクセル操作Ⅱ

データベースⅠ

データベース1

C 資料 電脳梁山泊烏賊塾 構造体 C++ の構造体 初めに 此処では Visual Studio 2017 を起動し 新しいプロジェクトで Visual C++ の Windows デスクトップを選択し Windows コンソールアプリケーションを作成する 定義と変数宣言 C++ に

構造体

グラフィックス 目次

回文作成支援プログラム

GUIプログラムⅣ

正規表現応用

スレッド操作 タイマー

ハッシュテーブル

CodeGear Developer Camp

3D回転体プログラム

パラパラ漫画

データベース1

万年暦プログラム

グラフィックス 目次

VB実用Ⅲ⑩ フリーデータベースⅡ

神経衰弱ゲーム

ランボール

Microsoft Word -

画像閲覧プログラム

Prog2_15th

LogisticaTRUCKServer-Ⅱ距離計算サーバ/Active-Xコントロール/クライアント 概略   

キー操作

チャットプログラム

ウォームアップ講座 17~30

相性占いプログラム

VB実用⑯ 印刷Ⅵ(Excel)

Visual Studio2008 C# で JAN13 バーコードイメージを作成 xbase 言語をご利用の現場でバーコードの出力が必要なことが多々あります xbase 言語製品によっては 標準でバーコード描画機能が付加されているものもあるようで す C# では バーコードフォントを利用したりバー

LogisticaTRUCKServer-Ⅱ距離計算サーバ/Active-Xコントロール/クライアント 概略   

通信対戦プログラム

エクセル詳細 アドイン

データベースⅡ

何時何処で誰が

Microsoft Word - VB.doc

API 連携方式 外部 DLL の呼び出し宣言 外部 DLL の呼び出し宣言のサンプルコード (Microsoft Visual C#.NET の場合 ) プログラムコードの先頭で using System.Runtime.InteropServices; が必要 クラスの内部に以下のような外部 D

DAOの利用

PYTHON 資料 電脳梁山泊烏賊塾 PYTHON 入門 ゲームプログラミング スプライトの衝突判定 スプライトの衝突判定 スプライトの衝突判定の例として インベーダーゲームのコードを 下記に示す PYTHON3 #coding: utf-8 import pygame from pygame.lo

チア ダンス


Prog2_4th

Transcription:

インベーダーゲーム VB 2005 5 プログラムの概要 テレビゲームの流行の魁と成る懐かしのゲーム インベーダー を作成する 先ず FIGHT!! ボタンをクリックすると インベーダーが左右に移動し乍ら 降下して来るので 自機を左右のカーソルキーで移動させ スペースキーでミサイルを発射する インベーダーが 最終ライン迄 降下して 侵略される前に 総てのインベーダーを撃墜しなければ ゲームは終了する 此処では ゲームプログラムを作成する事に依り 楽しみ乍ら プログラムの制作手順を習得する事を目的として居る 制作手順としては 実際の作業過程に従い 段階的にを追加する方法を採用して居る 今回の課題項目 アプリケーション画面のデザイン ( 標準コントロールの利用 ) プログラムの動作原理 ( イベント駆動型のプログラム ) プログラムの構成要素 ( オブジェクトとプロパティ ) 値の代入 ( 変数 オブジェクトのプロパティ ) 値の演算 ( 算術演算子 ) 条件に応じた処理 (If 文の利用 + If 文のネスト ) 自動的に行われる処理 ( 複数のタイマーの利用 ) サブルーチン ( ジェネラルプロシージャ ) -1-

オブジェクト プロパティ一覧 フォーム ラベル 1 ラベル 2 ピクチャボックス 1 ピクチャボックス 2 ピクチャボックス 4 ピクチャボックス 3 タイマー 1 タイマー 2 ボタン コントロールの種類 プロパティ プロパティの設定値 フォーム オブジェクト名 invader FormBorderStyle FixedSingle KeyPreview True MaximizeBox False StartPosition CenterScreen Text インベーダー パネル Name pnlsky BackgroundImage cloud.gif( 非常に遅く成るので 確認後削除 ) Size 500, 300 ピクチャボックス1 Name picbase0 Image invader1.gif Size 24, 16 Visible False ピクチャボックス2 Name picbase1 Image invader2.gif Size 24, 16 Visible False -2-

コントロールの種類 プロパティ プロパティの設定値 ピクチャボックス3 Name picgun BackColor TransParent Image gun.gif Location 230, 260 Size 24, 20 ピクチャボックス4 Name picmissil BackColor TransParent Image missil.gif Location 240, 244 Size 5, 16 ラベル1 Name lblscore AutoSize False BackColor Transparent Font MS 明朝 太字 12 Size 100, 19 TextAlign MiddleRight ラベル2 Name lblmes AutoSize rue BackColor Transparent ForeColor Red Font HG 創英角ポップ体 太字 20 Text Game Over ボタン Name btnstart Font MS 明朝 太字 12 Text FIGHT!! タイマー 1 Name tmrmove Interval 500 タイマー 2 Name tmrmissil Interval 100 デザイン時の注意 ピクチャボックス 3 とピクチャボックス 4 及び ラベル 1 とラベル 2 は 必ず パネルの内部に配置する事 一旦 パネルの外部に配置した後 パネルの上に移動しようと仕ても パネルの背面に隠れて 前面に現れ無い事が有る 其の為 ツールボックスでピクチャボックスやラベルを選択した後 パネルの上でドラッグして配置すると良い -3-

プログラムリスト Public Class invader ' フォームクラスレベルでグローバルな変数の宣言 Private IX, IY, DR, GX, GY, SC As Integer Private Iv( 11 ) As Label 1 コード記述画面を表示して左記の コードを入力する Private Sub invader_load( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles Me.Load For I As Integer = 0 To 11 Iv( I ) = New Label( ) Iv( I ).Size = New Size( 24, 20 ) Iv( I ).BackColor = Color.Transparent Iv( I ).Image = picbase0.image Me.pnlSky.Controls.Add( Iv( I )) Next Call GameInit( True ) ' ゲームを初期化するジェネラルサブププロシージャ Private Sub GameInit( ByVal F As Boolean ) For I As Integer = 0 To 11 Iv( I ).Visible = True Next IX = 0 : IY = 0 : DR = 1 : Call DispInvader( ) If F Then GX = 230 : GY = 260 : Call DispGun( ) : SC = 0 lblmes.visible = False 2 フォーム上のコントロール を配置して居ない処をダブルクリ ックして コード記述画面を表示 し 左記のコードを入力する 3 上記 1 と同様に コード記述画面を表示して 左記のコードを記述する ' インベーダを表示するジェネラルサブププロシージャ Private Sub DispInvader( ) Dim X As Integer = IX * 30 + 10 Dim Y As Integer = IY * 20 + 30 For I As Integer = 0 To 11 If IX Mod 2 = 0 Then Iv( I ).Image = picbase0.image Else Iv( I ).Image = picbase1.image Iv( I ).Left = X + ( I Mod 4) * 30: Iv( I ).Top = Y + ( I 4 ) * 20 Application.DoEvents( ) Next ' 砲台を表示するジェネラルサブププロシージャ Private Sub DispGun( ) picgun.setbounds( GX, GY, 24, 20 ) 4 上記 1 と同様に コード記述画面を表示して 左記のコードを記述する 5 上記 1 と同様に コード記述画面を表示して 左記のコードを記述する ' ゲームオーバー時のジェネラルサブププロシージャ Private Sub GameOver( ) tmrmove.enabled = False: btnstart.enabled = True lblmes.visible = True: picmissil.visible = False 6 上記 1 と同様に コード記述画面を表示して 左記のコードを記述する -4-

' ボタン (FIGHT!!) がクリックされた時の処理 Private Sub btnstart_click( ByVal sender As System.Object, ByVal e As System.EventArgs ) _ Handles btnstart.click Call GameInit( True ) btnstart.enabled = False tmrmove.enabled = True ' タイマーが一定間隔で行う処理 ( インベーダの移動 ) Private Sub tmrmove_tick( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles tmrmove.tick IX = IX + DR If IX > 12 OrElse IX < 0 Then IX -= DR : IY += 1 : DR *= ( -1 ) If IY > 9 Then Call GameOver( ) Call DispInvader( ) ' キー入力が行われた時の処理 Private Sub invader_keyup( ByVal sender As Object, _ ByVal e As System.Windows.Forms.KeyEventArgs ) Handles Me.KeyUp Dim K As Integer = e.keycode Select Case K Case Keys.Right, Keys.Left GX += ( K = Keys.Left ) * 10 - ( K = Keys.Right ) * 10 If GX > 476 Then GX = 476 : Exit Sub If GX < 0 Then GX = 0 : Exit Sub Call DispGun( ) Case Keys.Space If Not picmissil.visible Then picmissil.top = 244: picmissil.left = GX + 10 picmissil.visible = True: tmrmissil.enabled = True End Select Application.DoEvents( ) ' タイマーが一定間隔で行う処理 ( 砲弾の移動 ) Private Sub tmrmissil_tick( ByVal sender As System.Object, ByVal e As System.EventArgs ) _ Handles tmrmissil.tick picmissil.top -= 10 If picmissil.top < 0 Then tmrmissil.enabled = False: picmissil.visible = False Else Dim MT As Integer = picmissil.top Dim ML As Integer = picmissil.left For I As Integer = 0 To 11 If Not Iv( I ).Visible Then Continue For If MT > Iv( I ).Top And MT < Iv( I ).Top + 20 Then If ML > Iv( I ).Left AndAlso ML < Iv( I ).Left + 24 Then tmrmissil.enabled = False: Iv(I).Visible = False picmissil.visible = False: SC += 1 : lblscore.text = SC Application.DoEvents( ) If SC Mod 12 = 0 Then Call GameInit( False ) Exit For Next End Class 7 デザイン画面で ボタンをダブルクリックして コード記述画面を表示し 左記のコードを入力する 8 デザイン画面で タイマーをダブルクリックして コード記述画面を表示し 左記のコードを入力した後 実行する 9 デザイン画面で フォームを選択し プロパティ画面をイベント画面に切り替える 其の後 KeyUp の項目をダブルクリックして コード記述画面を表示し 左記のコードを入力する 10 デザイン画面で タイマーをダブルクリックして コード記述画面を表示し 左記のコードを入力した後 実行する -5-

Control クラスの Size プロパティ コントロールの高さと幅を取得 設定する Control.Size = New Size( 幅, 高さ ) Size プロパティは コントロールの高さと幅をピクセル単位で表す Size 構造体で有る 但し 此のプロパティを取得しても コピー値が返される為 幅や高さを変更しても コントロールのサイズは変更されない コントロールのサイズを設定するには 下記の様に Size クラスのコンストラクタを使用して設定する 例えば ラベル (lblscore) を幅 100 ピクセル 高さ 19 ピクセルに設定する例を 下記に示す lblscore.size = New Size(100, 19) 猶 下記の様に Width プロパティ ( 幅 ) と Height プロパティ ( 高さ ) を使用して サイズを設定しても良い lblscore.width = 100 lblscore.height = 19 Control クラスの Visible プロパティ コントロールが表示されて居るか何うかを示す値を取得 設定する Control.Visible = ブール値 コントロールが表示されて居る場合は True 表示されて居ない場合は False を返す ( 既定値は True) 亦 True を設定すれば コントロールは表示され False を設定すれば コントロールは非表示に成る 猶 非表示 (False) の場合は コントロール自体が存在しない物と仕て処理される ( クリックしてもイベントが発生しない等 ) Control クラスの Enabled プロパティ コントロールがユーザーとの対話に応答出来るか何うかを示す値を取得 設定する Control.Enabled = ブール値 コントロールがユーザーとの対話に応答出来る場合は True 出来ない場合は False を返す ( 既定値は True) 亦 True を設定すれば コントロールはユーザーとの対話に応答出来る様に成り False を設定すれば コントロールは出来なく成る 猶 コントロールが Timer コントロールの場合は タイマが実行されて居るか何うかを示す値を取得 設定する -6-

Control クラスの Location プロパティ コンテナの左上隅に対する相対座標でコントロールの左上隅の座標をを取得 設定する Control.Location = New Point( 上からの距離, 左からの距離 ) Location プロパティは コントロールの左上隅をコンテナの左上隅に対して相対的に表す Point 型で有る 但し 此のプロパティを取得しても コピー値が返される為 夫々の距離を変更しても コントロールの位置は変更されない コントロールの位置を設定するには 下記の様に Point クラスのコンストラクタを使用して設定する 例えば ラベル (lblscore) 上からの距離 100 ピクセル 左からの距離 50 ピクセルに設定する例を 下記に示す lblscore.location = New Point(100, 50) 猶 下記の様に Top プロパティ ( 上からの距離 ) と Left プロパティ ( 左からの距離 ) を使用して 位置を設定しても良い lblscore.top = 100 lblscore.left = 50 Control.ControlCollection クラスの Add メソッド 指定したコントロールをコントロールコレクションに追加する Control.Controls.Add( コントロール ) 或るコントロールのコントロールコレクションの末尾に他のコントロールを追加する コントロールは 複数のコントロールコレクションに割り当てる事は出来ない為 追加するコントロールが既に他のコントロールの子コントロールで有る場合は 別のコントロールに追加される前に其のコントロールから削除される 猶 コントロールのインスタンスを生成しても フォームやフォーム上のコントロールの孰れかに追加しなければ 画面に表示されない 亦 通常はコンテナと成れないコントロール ( ラベルやピクチャボックス等 ) でも Add メソッドを使用すると コンテナと成り 子コントロールを内包する事が出来る Control クラスの SetBounds メソッド コントロールを指定した位置とサイズに設定する Control.SetBounds( X 座標, Y 座標, 幅, 高さ ) コントロールの Location と Size を一度に設定する -7-

Application クラスの DoEvents メソッド 現在メッセージキューに有る Windows メッセージを総て処理する Application.DoEvents( ) プログラムが保持して居る制御を OS に戻す 画面の更新 ( 再描画 ) 等は OS が行うが ループ処理中等は プログラムが制御を占有する為 OS に制御が戻らず 画面の更新が行われない場合が有る 此の様な場合は Application クラスの DoEvents メソッドを使用して 明示的に制御を OS に戻す必要が有る サブルーチン ( ジェネラルプロシージャ ) の利用 サブルーチン (Subroutine) は プログラミングに於いて コード中で何度も必要とされる定型的な処理を 1 個のコードブロックに纏めて 外部から呼び出せる様にした物を謂う 呼び出す側のメインルーチンと対比して サブルーチンと呼ばれる プログラムのソース中で 繰り返し現れる処理をサブルーチン化する事で 可読性や保守性を高める事が出来る 猶 繰り返し現れる作業でなくても 意味的な纏まりを示す為にサブルーチン化する事も有り 此れがオブジェクト指向へと進化して居る サブルーチンを呼び出す際に動作を指定する設定値を与える場合が有り 此の値を引数 ( パラメータ ) と呼ぶ 亦 実行後に呼び出し元のプログラムに処理結果のデータ等を返す場合が有り 此の値を戻り値と謂う 戻り値の有るサブルーチンを 特に関数 ( ファンクション ) と呼ぶ事が有る Visual Basic では Sub で定義されたコードブロックをサブプロシージャ (Sub Procedure) Function で定義されたコードブロックをファンクションプロシージャ (Function Procedure) と謂う 更に サブプロシージャには コントロールのイベント時に呼び出されるイベントプロシージャと 明示的にコードで呼び出されないと実行されないジェネラルプロシージャが有る 狭義の意味では 此のジェネラルプロシージャが サブルーチンで有る イベントプロシージャは 通常 引数リスト ( 括弧内に記述 ) の後に Handles 句が有り コントロールの種類とイベントの種類が指定して有る ( 但し AddHandler ステートメントでハンドルを追加して居る場合は 此の記述が無い事も有る ) 亦 引数リストに イベントを発生させたコントロールへの参照が格納された sender と謂う引数と イベント固有の情報が格納された e と謂う引数が有る 此れに対して ジェネラルプロシージャには イベントと結び付かないので Handles 句が無い 亦 引数も 必要に応じて 任意のデータ型で任意の個数を指定する事が出来る 例えば GameInit のサブルーチン ( ジェネラルプロシージャ ) では ゲーム開始時か 1 面クリア時かを区別する為に 引数にブール型の F と謂う引数を用いて居る 此の値を ゲーム開始時には True 1 面クリア時には False に設定して 砲台を描き直すか何うかの区別を仕て居る -8-