• 検索結果がありません。

Microsoft Word - …R…fi…s…–†[…^−î‚bII2004.doc

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft Word - …R…fi…s…–†[…^−î‚bII2004.doc"

Copied!
68
0
0

読み込み中.... (全文を見る)

全文

(1)

コンピュータ基礎Ⅱ授業計画(蒔苗・宮西)

[授業概要]

本講義ではコンピュータプログラミングと統計解析について学ぶ.コンピュータプログラ

ミングについては,入門用言語として

VisualBasic を用い,変数や配列,条件判断や繰り返

し等の制御構造の基礎を学ぶとともに,グラフィックス等について演習を交えながら講義す

る.統計解析については,表計算ソフトを用いてデータ処理の方法として,平均や分散,標

準偏差の意味や計算方法,さらに推定,検定について講義する.

[授業計画]

A.プログラミング (担当:蒔苗)

10/5 VB のインストールと簡単なプログラムの作成

10/12 プロパティ・メソッド・イベント・変数

10/19 制御構造(1)(カウンタを作る IF)

10/26 制御構造(2)(単純な繰り返し DO..LOOP)

11/2 制御構造(3) (For..Next ループによる繰り返し)

11/9 配列と構造体

11/16 グラフィックス

B.統計解析(担当:宮西)

11/30~1/25 Excel による統計解析

[評価方法]

出席状況・

レポート(プログラム及び統計)・試験

[教科書]

プログラミング:プリントを配布

統計解析:菅民夫「

Excel で学ぶ統計解析入門」オーム社

[参考書]

川口輝久

+河野勉「かんたんプログラミング Visual Basic 6 基礎編」技術評論社

(他にも VB6.0 に関連する書籍はたくさん出版されているので,

自分でわかりやすいと思うものを選んでください.

(2)

コンピュータプログラムとは

コンピュータプログラムは,コンピュータを動かすための命令を記述したものである. コンピュータは基本的に電気の流れのON/OFF により制御される. したがって命令は電気信号のON/OFF を規定するものである. コンピュータを制御するために,電気的なON/OFF の制御として記述し,コンピュータを制御する のは非効率である. あらかじめCPU(中央処理装置)に命令が組み込まれ(命令セット),その命令を用いることによっ て,ある程度,容易にコンピュータを制御することができる. しかし命令セットはコンピュータが理解しやすいように作られたものであり,それを用いれば命令の 手順を記述することが可能である(アセンブリ言語).しかし,人間が容易に制御をその記述するに は難しいという問題がある. そこで,人間に近い言葉で命令を記述できるように,コンピュータ言語が開発されている. 主なプログラミング言語としては, C, C++, C#

FORTRAN (Formula Translator)

COBOL (COmmon Business Oriented Language) PASCAL (Philips’ Automatical Sequence Calculator) BASIC (Beginners’ All-purpose Symbolic Instruction Code)

Java などがある.

本講義では,Basic 系言語である Microsoft Visual Basic を用いて,プログラミングの基礎について 学習する.

(3)

VisualBasic のインストール

1.VisualBasic とは?

Microsoft 社が開発

Windows 環境におけるプログラミング言語

BASIC 系言語

・オブジェクト指向

・構造化言語

・略称

VB

2.VisualBasic のインストール

(1)VisualBasic のバージョン 授業で利用可能なVisual Basic のバージョンは以下の通りである. Visual Basic 5.0(製品版) Visual Basic 6.0 (製品版) Visual Basic.Net (製品版) Visual Basic 5.0 及び 6.0 評価版

Visual Basic 5.0 Control Creation Edition(無料で利用可能) (2)VisualBasic5.0 評価版のダウンロードとインストール

●Visual Basic 5.0 CCE は以下よりダウンロード可能. 学内のみ:

http://www.campus.myu.ac.jp/~makanae/vb/

●VB5CCEIN.EXE - 7,593 Kb を適当な場所(デスクトップ等)にダウンロード. ダウンロードしたファイルをダブルクリックするとインストールできる.

(4)

3.Visual Basic の起動

スタート>>すべてのプログラム>>VisualBasic5.0CCE を選択. 以下のような画面が表示されればOK.

(5)

最も簡単なプログラムの作成

(1)起動 スタート>>すべてのプログラム>>Visual Basic を選択する. 「標準EXE」を選択し,OK ボタンを押す. Form1 のウィンドウ(フォームウィンドウ)が作成するプログラムのウィンドウとなる. (2)コントロールボタンの貼り付け 左のコントロールウィンドウから任意のコントロールを選択し,Form1 上に貼り付ける. コマンドボタン テキストボックス ツールボックス コントロールを選択し,Form1 上でドラッグする.

(6)

(3)Command1 ボタンをダブルクリックすると,以下のようなコードウィンドウが表示される.

(4)Command1 がクリックされたときのプログラムを記載する.

「Command1 ボタンがクリックされたときに Text1 に「宮城大学」と表示する」 Private Sub Command1_Click()

Text1.Text = "宮城大学" ←この行を追加する. End Sub (5)プログラムの実行 プログラムの実行ボタンを押す(またはF5 キーを押す) コードウィンドウ Command1 ボタンがクリックさ れたときのプログラムをここに 書く 実行ボタン 終了ボタン

(7)

●プログラムが実行される. ●Command1 ボタンをクリックすると,Text ボックスの表示が「宮城大学」に変わる. (8)終了ボタンまたは Form1 上の□×ボタンを押し,プログラムを終了する. 【演習】 Command1 ボタンを押したときに,自分の名前を表示するようにプログラムを変更しなさい.

【プログラムの保存】

プロジェクトファイル

(.vbp)とフォーム(.frm)のファイルの2種類のファイルを保存する必要

がある.

①まずフォームのファイルを保存する.

(メニュー

>>名前をつけて Form1 の保存>>任意の名前(半角英数字)を用いる)

②プロジェクトファイルの保存

(メニュー

>>名前をつけてプロジェクトの保存>>任意の名前(半角英数字)を用いる)

(8)

プロパティとメソッド

● コントロール(Form 上に貼り付けた部品)及び Form はオブジェクトとも呼ばれる. ● オブジェクトはプロパティ(属性)とメソッドをもつ. 【プロパティ】 ● 各オブジェクトのプロパティは,オブジェクトを選択したときに画面右下のプロパティウィンドウに表 示される. 例)Form1 上に貼り付けたテキストボックス Text1 のプロパティを表示する. ●プロパティの値はプロパティウィンドウから変更することができる. 例1)テキストボックス Text1 の表示内容を変更する.(次図の左参照) Text1 を選択し,プロパティウィンドウから Text を選択する. 右欄のウィンドウに任意の文字を入力する. 例2)コマンドボタン Command1 上の表示文字を変更する.(次図の右参照) Command1 を選択し,プロパティウィンドウから Caption を選択する. 右欄のウィンドウに任意の文字を入力する. プロパティ ウィンドウ Text1 を選択

(9)

● プロパティの値はプログラムの内部からも変更が可能である.

例1)Command1 が押されたときに Text1 の Text というプロパティの値を変える. Private Sub Command1_Click()

Text1.Text = "ボタンが押されたような気がします" End Sub

初期状態 ボタンをクリックすると

(10)

例2)

Private Sub Command1_Click() Text1.FontSize = 36 Text1.Text = "ボタンが押されたような気がします" Command1.Caption = "押された!" End Sub ● プログラムの読み方 上述の例2 のプログラムは以下のように日本語に訳される. サブプロシージャ Command1がクリックされたら, Text1 の FontSize を 36 にしなさい. Text1 の Text を“ボタンが押されたような気がします” にしなさい. Command1 の Caption を”押された!” にしなさい. サブプロシージャ 終わり 等号 = は「右辺から左辺に代入しなさい」 という意味である. プロパティを読むときには, .を「の」と読むとよい.

Text1.Text Text1 の Text

【メソッド】

● メソッドはオブジェクトに対する命令である. 例1)Form1 に Print メソッドで文字を書かせる

Private Sub Command1_Click()

Form1.Print "Form1 に対する Print メソッドで書いてみました" End Sub

[プログラムの読み方]

(11)

例 2)Form1 に Circle メソッドで円を書かせる. Private Sub Command1_Click()

Form1.Print "Form1 に対する Print メソッドで書いてみました" Form1.Circle (300, 300), 400

End Sub

[プログラムの読み方]

Form1 に中心(300,300), 半径 400 の Circle(円)を書きなさい.

例3)Text1 を動かす

Private Sub Command1_Click() Text1.Move 10, 10 End Sub (Text1 の場所が変わっていることに注意) [プログラムの読み方] Text1 を(10,10)に動かしなさい. ● あらかじめオブジェクトに定められたメソッド以外の命令はすることができない.

(12)

イベント

● VisualBasic はイベントドリブン(イベント駆動)型プログラミング言語である. ● イベントとは,プログラム自身に対して生じる出来事(イベント)である. ● プログラムは自分自身に起こった出来事(イベント)を監視している. (どこで何が起こったか??) ● プログラムのユーザーが引き起こすイベントの例としては, ・ Command1 上でマウスをクリックした. ・ Text1 に表示されている文字を変えた. ・ ウィンドウを最小化した などでさまざまである. ● プログラムでは,イベントに対応したサブプロシージャが呼び出される. [サブプロシージャ] Private Sub…….. (ここに処理を記述する) End Sub ● イベントに対応したサブプロシージャ名は以下の記述方法となる. Private Sub 対象オブジェクト名_イベント(引数) …… End Sub 例)

Private Sub Command1_Click() ‘Command1 上でマウスがクリックされた Private Sub Text1_Change() ‘Text1 上で文字が変更された

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ‘Form 上でマウスが押された.

‘どのボタンが押されたか,シフトキーが押されていたか,またその座標を入手することができる. 注)各行のシングルクォーテーション ‘ は以下 注釈でありプログラムではないという意味.

● プログラムを起動すると自動的に引き起こされるイベントもある. 例)Form_Load など

(13)

● プログラムが感知できるイベントの種類はあらかじめ決まっている. コードウィンドウで確認可能である. オブジェクトを選択 イベントを選択 注)サブプロシージャ名は自分で入力せずに,上図のようにオブジェクト名,イベントを選択して 定義するようにすること. ●プログラムの処理の流れ ①プログラムの起動 ②イベントForm_Load が発生 ③イベント監視 ④イベント発生⇒処理⇒③へ戻る ● Form_Load を用いたプログラムの例 Private Sub Form_Load() Text1.ForeColor = vbRed Text1.BackColor = vbGreen

Text1.Text= ”Form_Load では通常,プログラムの初期設定などを行う” End Sub

Private Sub Command1_Click()

Form1.Print "Form1 に対する Print メソッドで書いてみました" Form1.Circle (300, 300), 400

Text1.Move 10, 10 End Sub

(14)

演算子

演算子 意味 例1 例1の結果 例2 + 加算 2+5 7 A+B - 減算 10–5 5 A-B * 乗算(掛け算) 2*5 10 A*B / 除算(割り算) 10/3 3.33333333333333 A/B ¥ 商 10¥3 3 A¥B

MOD 余り 10 MOD 3 1 A MOD B

^ 累乗 2^8 256 A^B

& または + 文字列の連結 “Miy” & “agi” Miyagi A& B

例1)

Command1 ボタンを押すと,Text1 に 2+5 の答が出力される.

Private Sub Command1_Click() Text1.Text = 2 + 5

End Sub

例2)

Command1 ボタンを押すと,Text1 に 28の答が出力される.

Private Sub Command1_Click() Text1.Text = 2 ^ 8

End Sub

例3)

Command1 ボタンを押すと,Text1 に”Miyagi”とが出力される.

Private Sub Command1_Click() Text1.Text = "Miy" & "agi" End Sub

(15)

変数

● 変数は数字,文字等を入れる器である. ● 変数名は以下の条件を満たせば,任意である. ・ 変数名の先頭文字には,数字および記号は使えない。 ・ 変数名には,ピリオド (.) や型宣言文字は使えない。 ・ 変数名は,255 文字以内 (半角の場合) で指定する必要がある. ・ 同じ "適用範囲 (スコープ)" 内で,同じ変数名を複数使うことはできない. 適用範囲とは,プロシージャ,フォームなど,変数が参照される範囲のことである. 上図では,左の変数名はhensuu_A, 右の hensuu_B となっている. VB の場合,変数名は大文字と小文字で区別されない. 例 hensuu_A == HENSUU_a ● 器(変数)の種類にはいくつかの種類がある. ◆整数だけが入る器(変数) ①Integer 型(2バイト整数型)

227

hensuu_A

227

hensuu_B

宮城大学

宮城大学

Integer 型

32,767~32,767

(16)

②Long 型(4バイト整数型) ◆小数点付きの数字が入る器(変数) ①Single 型(単精度浮動小数点数型;4 バイト) ②Double 型(倍精度浮動小数点数型;8 バイト) ◎ 文字が入る器(変数) String 型 (可変長) Long 型 Double 型 Single 型 String 型

2,147,483,648~

2,147,483,647

7 桁の符号・小数点付き 数字 15 桁の符号・小数点付き 数字 1 ~ 32767 文字の 文字列

(17)

◎ 数字・文字列何でも入る器(変数) Variant 型 (可変長)

注)変数宣言をしない場合には,自動的に Variant 型になる.

(しかし,処理速度が遅いなどの問題がある.)

● 変数を定義する. Dim 変数名 As 型

例) Dim hensuu_A As Integer Dim hensuu_B As Single Dim Mojiretsu As String

● 変数の有効範囲

Variant 型

Dim A As Integer

Public Sub Command1_Click() A は共通の変数として使える End Sub

Pirvate Sub Text1_Click() A は共通の変数として使える. End Sub

Public Sub Command1_Click() Dim A As Integer ... A は Command1_Click の中でしか 使えない. Text1_Click()の A とは別物. End Sub

Pirvate Sub Text1_Click() Dim A As Integer A は Text1_Click()でしか使えない. Command1_Click()の A とは 別物である. End Sub A の 適 用 範 囲 A の 適 用 範 囲 A の 適 用 範 囲 数値・文字列

(18)

例1)コマンドボタン Command1 を押すと a+b の計算が行われる. Dim a As Integer

Dim b As Integer Dim Wa As Integer

Private Sub Command1_Click() a = 2 b = 5 Wa = a + b Text1.Text = Wa End Sub 例2) コマンドボタンを2つ配置する(Command1,Command2 ボタン). ①変数の適用範囲(A) Dim MojiA As String Dim MojiB As String

Private Sub Command1_Click() MojiA = "宮城県"

MojiB = "仙台市"

Text1.Text = MojiA + MojiB End Sub

Private Sub Command2_Click() Text1.Text = MojiA + MojiB End Sub

(19)

②変数の適用範囲(B)

Private Sub Command1_Click() Dim MojiA As String Dim MojiB As String MojiA = "宮城県" MojiB = "仙台市"

Text1.Text = MojiA + MojiB End Sub

Private Sub Command2_Click() Text1.Text = MojiA + MojiB End Sub 【問題】 ①2つのテキストボックスに入力した整数の足し算の結果をもうひとつのテキストボックスに出力するプ ログラムを作成しなさい.(コマンドボタンを押したときに計算結果が出力されるものとする.) ②2つのテキストボックスに入力した整数の和,差,積,商,を一度に表示するプログラムを作成しなさ い. (コマンドボタンを押したときに計算結果が出力されるものとする.) ③以下のようなプログラムを作成しなさい. ・ 4つのテキストボックスに都道府県,市区郡,町名,番地を入力する ・ コマンドボタン「表示」のボタンを押す. ・ 入力した住所が自動的に結合されて出力される. 入力画面 実行画面 (「都道府県」「市区郡」等の文字はLabel の caption プロパティによる) (注意)プロパティウィンドウからフォントを変えようとすると,VB が動かなくなる場合がある. こまめにプログラムを保存するなど,十分に注意すること.

(20)

カウンタ(計数器)を作る

1.カウンタ(計数器)とは

数を数えるための機器をカウンタ(計数器)という.

2.カウンタの作成 -コマンドボタン-

ここではコマンドボタンを押すことにより,数を数えるカウンタを作成する. (1)Form の定義 数えた数を表示するためのテキストウィンドウ(Text1)と数を数えるため のボタン(Command1)を Form1 上に配置する. (2)プログラムの流れ カウント変数を定義(カウント変数は整数) 初期設定 ・カウント変数の初期値は_______________ ・テキストボックスに初期値を表示する. コマンドボタン(Command1)がクリックされたら ・カウンタに________を加える ・カウンタをテキストボックス(Text1)に表示する. 【演習】 (2)のプログラムの流れをもとにカウンタのプログラムを作成しなさい.

(21)

【演習1の回答】

Dim Counter As Integer ‘カウンタ変数(Counter)を整数型で定義 '32767 を超えない場合,それ以上とある場合には Long

Private Sub Form_Load() ‘プログラム Form1 が起動すると自動的に動く Counter = 0 ‘カウンタ変数を初期値0にする.

Text1.Text = Counter ‘カウンタ変数の値をテキストボックスに表示. End Sub

Private Sub Command1_Click() ‘コマンドボタン(Command1)がクリックされたら動く Counter = Counter + 1 Counter 変数に1を加える.

Text1.Text = Counter Counter 変数の値をテキストボックスに表示 End Sub 【演習2】 道路における通行量を計測するために,コンピュータを用いたカウンタ(計数器)を作成しなさい. なお,通行量は,自動車,オートバイ,自転車,歩行者に分類し,観測者が対応する画面上のボタン を押すことにより計数するものとする. [Form のデザイン] [実行イメージ]

(22)

【演習2の回答】

‘変数の定義

Dim car As Integer ‘自動車の台数のカウンタ変数

Dim motorbike As Integer ‘オートバイの台数のカウンタ変数 Dim bicycle As Integer ‘自転車の台数のカウンタ変数 Dim walker As Integer ‘歩行者のカウンタ変数

Private Sub Form_Load() '変数の初期化 car = 0 motorbike = 0 bicycle = 0 walker = 0 'テキストボックスの初期化 Text1.Text = car Text2.Text = motorbike Text3.Text = bicycle Text4.Text = walker 'コマンドボタンの Caption プロパティ変更 Command1.Caption = "自動車" Command2.Caption = "オートバイ" Command3.Caption = "自転車" Command4.Caption = "歩行者" End Sub

Private Sub Command1_Click() 'Command1 がクリックされたら car = car + 1 '変数 car に 1 を加え

Text1.Text = car 'Text1.Text に出力 End Sub

Private Sub Command2_Click() motorbike = motorbike + 1 Text2.Text = motorbike End Sub

(23)

bicycle = bicycle + 1 Text3.Text = bicycle End Sub

Private Sub Command4_Click() walker = walker + 1 Text4.Text = walker End Sub 【問題】 演習2のプログラムにリセットボタンを追加しなさい. (リセットボタン:ボタンを押すとすべての台数が0にリセットされるボタン)

(24)

3.カウンタの作成 -キーボード入力-

ここではキーボード入力によるカウンタの作成を行う. (1)キーボードからの入力を受け付けるプログラムを作成する. [Form のデザイン] [コード] 'Command1 ボタンがアクティブ(フォーカスを得る)になっていないと 'カウントできない. ‘Command1 がフォーカスを得たとき Private Sub Command1_GotFocus()

Command1.Caption = "カウントしています" End Sub

‘Command1 のフォーカスが失われたとき Private Sub Command1_LostFocus()

Command1.Caption = "カウント中断しています" End Sub

Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer) Form1.Print "おい!何かキーを押しただろ?"

(25)

(2)押されたキーの番号を表示する.

押されたキーの番号は,Command1_KeyDown の中の KeyCode という変数に格納される. (注意:KeyCode という変数は Command1_KeyDown の中でしか使えない)

サブプロシージャ Command1_KeyDown のプログラムを以下のように変える.

[コード(Command1_KeyDown 部分のみを変更する)]

Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer) Form1.Cls

Form1.Print "おい!"; KeyCode; "番のキーを押しただろ?" End Sub

・入力は半角にして行うこと.

・Form1.Cls は画面の描画を消去しなさいの意味である.(Cls = Clear Screen)

・Print 文における文字を改行せずに出力する場合には ; (セミコロン)で接続する. 【演習3】 上のプログラムを用いて,以下のキーのKeyCode を調べなさい. C B M W すべて半角とする.大文字・小文字は問わない.

(26)

【演習3の回答】 結果は以下の通りとなる. C:67 M:77 B:66 W:87 その他のキーのKeyCode についてはヘルプを参照すること. (3)キーボードの入力値を判断する. [コード 1(Command1_KeyDown 部分のみを変更する)]

Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer) Form1.Cls If KeyCode = 66 Then Form1.Print "おい!B のキーを押しただろ?" End If End Sub 半角でB のキーを押すと,「おい!B のキーを押しただろ?」と出力する. その他の場合には何も表示しない. 【重要】If~~~Then~~~End If もし 条件文が正しかったら,命令文1を実行する If 条件文 Then 命令文1 End If [コード 2(Command1_KeyDown 部分のみを変更する)]

Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer) Form1.Cls If KeyCode = 66 Then Form1.Print "おい!B のキーを押しただろ?" Else Form1.Print "B 以外のキーを押したのか?" End If End Sub

(27)

【重要】If~~~Then~~~Else~~~End If もし 条件文が正しかったら,命令文1を実行する.それ以外の場合には,命令文2を実行する. If 条件文 Then 命令文1 Else 命令文2 End If [コード 3(Command1_KeyDown 部分のみを変更する)]

Private Sub Command1_KeyDown(KeyCode As Integer, Shift As Integer) Form1.Cls

If KeyCode = 66 Then

Form1.Print "おい!B のキーを押しただろ?" ElseIf KeyCode = 67 Then

Form1.Print "おい!C のキーを押しただろ?" Else Form1.Print "B, C 以外のキーを押したのか?" End If End Sub 【重要】If~~~Then~~~ElseIf~~~Else~~~End If もし 条件文1 が正しかったら,命令文1を実行,条件文2が正しかったら命令文2を実行, それ以外の場合には,命令文3を実行する. If 条件文1 Then 命令文1 ElseIf 条件文2 Then 命令文2 ・・・・・・ Else 命令文3 End If 【問題】 道路における通行量を計測するために,コンピュータを用いたカウンタ(計数器)を作成しなさい. なお,通行量は,自動車(C),オートバイ(M),自転車(B),歩行者(W)に分類し,観測者がキーボードか ら,( )内のアルファベットのキーを押したときにカウントできるようにすること.

(28)

【演習4】

テキストボックスに入力した自然数X を奇数か偶数かを判定し,奇数の場合には,「X は奇数です」,偶

数の場合には「X は偶数です」と表示するプログラムを作成しなさい.

(テキストボックスには自然数以外の数字が入力されることがないと考えてよい.)

【回答例】

Private Sub Form_Load() Text1.Text = "" End Sub

Private Sub Text1_Change() Dim n As Integer n = Int(Val(Text1.Text)) If n Mod 2 = 0 Then Label1.Caption = Str(n) + "は偶数です." Else Label1.Caption = Str(n) + "は奇数です." End If End Sub

(29)

【練習問題】 テキストボックスに入力した数値が100以上であるか否かを判断し, 100以上である場合には「入力した数値は100以上です.」 100より小さい場合には「入力した数値は100より小さいです.」 するプログラムを作成しなさい. ●等号・不等号の使い方 If n >= 10 Then….. もし n が 10 以上であるなら If n > 10 Then .. もしn が 10 より大きいなら If n <= 10 Then….. もしn が 10 以下であるなら If n < 10 Then .. もしn が 10 より小さいなら If a > b then もしa が b より大きかったら(両方とも変数でもよい) 【練習問題】 テキストボックスに入力した数値が50以上かつ100より小さいかどうかを判定し,条件に合致した 場合には,「条件に合致しました」と表示するプログラムを作成しなさい. ●複合条件 AND(かつ) OR (または)の使い方 If n >= 5 And n < 10 Then もし n が 5 以上かつ 10 より小さいならば If a=b And b=c Then もしa=b かつ b = c であるならば

If n < 5 Or n > 100 Then もし n が 5 より小さい,または 100 より大きいならば If a=b Or a=c Then もしa=b または a=c であるならば

【演習5:IF 文の利用例】

あらかじめプログラム内にパスワードを記憶させておき,

(30)

【演習5:If 文の利用例】

あらかじめプログラム内にパスワードを記憶させておき,

入力したパスワードが一致したか否かを判定するプログラムを作成しなさい. 【回答例1】

Dim password As String

Private Sub Command1_Click() Dim inputpass As String

inputpass = InputBox("パスワードを入力してください") If password = inputpass Then

MsgBox "パスワードが合致しました." Else MsgBox "不正アクセスです.プログラムを終了します." End End If Command1.Visible = False Form1.Print "おめでとうございます.アクセスに成功しました" End Sub

Private Sub Form_Load()

Command1.Caption = "パスワード入力" password = "miyagi"

End Sub 【回答例2】

Dim password As String

Private Sub Command1_Click() Dim inputpass As String

inputpass = InputBox("パスワードを入力してください") If password <> inputpass Then

MsgBox "不正アクセスです.プログラムを終了します." End End If Command1.Visible = False Form1.Print "おめでとうございます.アクセスに成功しました" End Sub

Private Sub Form_Load()

Command1.Caption = "パスワード入力" password = "miyagi"

(31)

単純な繰り返し Do… Loop

Do …Loop :Do と Loop の間で繰り返す(ループ).

Do

命令ブロック Loop

【Do..Loop の例】

Private Sub Command1_Click() Dim a As Integer a = 0 Do a = a + 1 Text1.Text = Str(a) ‘ DoEvents ‘強制的に処理を実行 Loop End Sub (上のプログラムでは,a の値が Integer の範囲+32767 を超えた段階でエラーが生じる.) ●無限ループ:プログラムが無限にループすること. Private Sub Command1_Click()

Do Form1.Print “無限ループ実行中” Loop End Sub ● 自分で作成したプログラムが無限ループに陥ったら, Ctrl キーを押しながら Pause キー(Break)を押すと停止できる.

(32)

ループからの脱出(1) Do

If 条件文 Then Exit Do Loop

【IF 文を用いた Do..Loop からの脱出】

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click()

Dim a As Long Do a = a + 1 Text1.Text = a DoEvents If a = 100 Then Exit Do Sleep 100 '100 ミリ秒スリープ Loop Form1.Print "a の値が 100 に達したのでループから脱しました" End Sub ループからの脱出(2) Do [While | Until (条件文)] 命令ブロック

Loop [While | Until (条件文)]

【Do….Loop Until の使用例】

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click()

Dim a As Long Do a = a + 1 Text1.Text = a DoEvents Sleep 100 '100 ミリ秒スリープ

Loop Until a >= 100 ‘a が 100 以上になるまでループしなさい Form1.Print "a の値が 100 に達したのでループから脱しました"

(33)

【問題1】 1.100から0までカウントダウンを行い,0になったときに 「ゼロになったのでループから脱出しました」 と表示するプログラムを作成しなさい. 2.1のプログラムに0になったら音が鳴る機能を追加しなさい. 音(警告音)を鳴らす命令は Beep 【参考】 ‘コマンドボタンを押すと音が鳴る. Private Sub Command1_Click() Beep End Sub 【問題2】 Do…Loop を用いて1+2+3+...+999+1000までの足し算を行い,その結果を表示するプ ログラムを作成しなさい. 【問題3】 Do…Loop を用いて1+2+3+・・の足し算を行い,その結果が1000を超えた時点でループから 脱出し,いくつまで足したときに1000を超えたのかを表示するプログラムを作成しなさい.

(34)

【Do..Loop の応用プログラム】

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click()

Dim value As Integer value = 0

Do

Form1.BackColor = RGB(value, 0, 0) DoEvents

Sleep 10

value = (value + 1) Mod 256 Loop End Sub 【応用問題】 上の応用プログラムは赤のみの色の変化を示すものであるが,さらに緑,青を加え,赤・緑・青の順で 繰り返す機能を加えたプログラムを作成しなさい. 【参考:二重ループ】

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click()

Do Form1.Cls n = 0 Do While n <= 10 Form1.Print n n = n + 1 Sleep 100 Loop Loop End Sub

(35)

For..Next ループによる繰り返し

For….Next ループ For ループ変数 = 開始値 To 終了値 Step 刻み値 命令ブロック Next 【For..Next のプログラム例】

Private Sub Command1_Click() Dim n As Integer For n = 1 To 10 Step 1 Form1.Print "現在の n の値は"; n; "です." Next End Sub 【Sleep を加えた場合】

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Sub Command1_Click()

Dim n As Integer For n = 1 To 10 Step 1 Form1.Print "現在の n の値は"; n; "です." Sleep 100 ‘100 ミリ秒スリープ Next End Sub 【練習問題】上のプログラム例をもとに以下のプログラムを作成しなさい. 1.現在のnの値が2, 4, 6,・・, 20 と表示されるようにしなさい. 2.現在のnの値が3, 6, 9, ・・・, 30 と表示されるようにしなさい. 3.現在のnの値が1, 2, 3, ・・・, 14,15 と表示されるようにしなさい. 4.現在のn の値が 5, 6, 7, ・・・・・, 19, 20 と表示されるようにしなさい.

(36)

For..Next を用いた∑の計算

【演習】∑の計算

= 100 1 k k の計算をしなさい. 【重要】

= 100 1 k k は 1+2+3+・・・+99+100 の意味である.

Private Sub Command1_Click() Dim k As Integer

Dim Sigma As Integer Sigma=0 For k = 1 To 100 Step 1 Sigma = Sigma + k Next Form1.Print Sigma End Sub 【練習問題】For..Next 文を用いて以下の計算をしなさい. (1)

= 1000 1 k k (2)

= 500 50 k k (3)

= 500 1 2 k k (4)

= 250 1 3 k k

(37)

For..Next 文を用いた関数グラフの描画

【演習】

y = x2のグラフを書きなさい.

【回答例】 ‘初期設定

Private Sub Form_Load()

Form1.ScaleMode = vbPixels ‘Form1 の座標単位をピクセル単位にする. Picture1.Width = 200 ‘Picture1 の幅を 200 ピクセルにする Picture1.Height = 200 ‘Picture1 の高さを 200 ピクセルにする

Picture1.Scale (-5, 5)-(5, -5) ‘Picture1の左右上の座標を(-5,5),右下隅の座標を(5,-5)にする. End Sub

Private Sub Command1_Click() Dim x As Single Picture1.Line (-10, 0)-(10, 0), vbRed Picture1.Line (0, -10)-(0, 10), vbRed For x = -5 To 5 Step 0.1 y = f(x) ‘関数 f( )を呼び出し,戻ってきた値を y に代入. If x = -5 Then ‘最初の一点は点を描画する. Picture1.PSet (x, y) Else ‘次の点からは線でつなぐ. Picture1.Line -(x, y) End If Next End Sub ‘関数 f(x)の定義

Private Function f(x As Single) As Single f = x ^ 2 End Function 【練習問題】 1. 3 30 1 x y= のグラフを-10≦x≦10 の範囲で書きなさい. 2.y=2x2 +3x+1のグラフを書きなさい. 3.sin x 及び cos x のグラフを描画しなさい. sin x は sin(x) ただし x の単位はラジアン(180°=π = 3.1415) cos x は cos(x) ただし x の単位はラジアン(180°=π = 3.1415)

(38)

配 列

配列の定義 Dim 配列名(最大インデックス) または Dim 配列名(最小インデックス To 最大インデックス) ‘最小インデックスは負でも良い 配列の使い方 戻り値 = 配列名(インデックス) 表の数値をコンピュータプログラムに記憶する場合には,配列を用いる. 名前 ゲームの得点 まかなえ 35 たしろ 75 てらしま 55 みついし 65 【コード1】

Dim Tokuten(0 To 3) As Integer 配列 Tokuten

( )内の数字はインデックス Private Sub Form_Load()

Tokuten(0) = 35 Tokuten(1) = 75 Tokuten(2) = 55 Tokuten(3) = 65 End Sub 0 1 2 3

Private Sub Command1_Click()

Form1.Print “配列の 0 番目の要素は”; Tokuten(0) Form1.Print “配列の 1 番目の要素は”; Tokuten(1) Form1.Print “配列の 2 番目の要素は”; Tokuten(2) Form1.Print “配列の 3 番目の要素は”; Tokuten(3) End Sub

(0)

(1)

(2)

(3)

35

75

55

65

(39)

【コード2】コード1にFor..Next を適用した例(Command1_Click())のみ変更) Private Sub Command1_Click()

Dim n As Integer For n = 0 To 3 Form1.Print "配列の”; n ;“番目の要素は"; Tokuten(n) Next End Sub 【重要】配列の利点は,配列のインデックスに変数が使えることである. 【コード3】文字列の配列 Dim Tokuten(0 To 3) As Integer

Dim Namae(0 To 3) As String 配列 Namae Private Sub Form_Load()

Tokuten(0) = 35 Tokuten(1) = 75 Tokuten(2) = 55 Tokuten(3) = 65 Namae(0) = "まかなえ" Namae(1) = "たしろ" Namae(2) = "てらしま" Namae(3) = "みついし" End Sub 0 1 2 3

Private Sub Command1_Click() Dim n As Integer

For n = 0 To 3

Form1.Print Namae(n); "の得点は"; Tokuten(n) Next End Sub 【演習】 コード3 を基に,4 人の得点の合計を求めなさい.

(0)

(1)

(2)

(3)

まかなえ た し ろ てらしま みついし

(40)

【コード4(回答例)】(コード3のCommand1_Click()のみ変更) Private Sub Command1_Click()

Dim n As Integer Dim Sum As Integer Sum = 0

For n = 0 To 3

Form1.Print Namae(n); "の得点は"; Tokuten(n) Sum = Sum + Tokuten(n)

Next Form1.Print "合計点は"; Sum End Sub 【演習】最大値を求める. コード3を基に,得点の最高点を抽出し表示するプログラムを作成しなさい. 【コード5(回答例)】

Private Sub Command1_Click() Dim n As Integer

Dim max As Integer

For n = 0 To 3

Form1.Print Namae(n); "の得点は"; Tokuten(n) Next max = 0 For n = 0 To 3 If n = 0 Then max = Tokuten(n)

ElseIf Tokuten(n) > max Then max = Tokuten(n) End If Next Form1.Print "最高点は"; max; "です." End Sub 【問題】最小値を求める. コード3,4を基に,得点の最低点を抽出し表示するプログラムを作成しなさい.

(41)

【演習】

コード3・4をもとに,最高得点及び最高得点者を表示するプログラムを作成しなさい. (ただし最高得点者が2名以上いる場合には,すべての最高点者名を表示せずに,

得点者が2名以上います”とするだけでよい.) Private Sub Command1_Click()

Dim n As Integer Dim max As Integer Dim maxn As Integer Dim flag As Boolean

For n = 0 To 3

Form1.Print Namae(n); "の得点は"; Tokuten(n) Next flag = False For n = 0 To 3 If n = 0 Then max = Tokuten(n) maxn = n

ElseIf Tokuten(n) = max Then flag = True

max = Tokuten(n)

ElseIf Tokuten(n) > max Then flag = False max = Tokuten(n) maxn = n End If Next

If flag = False Then

Form1.Print "最高点は"; Namae(maxn); "の"; max; "です." Else

Form1.Print "最高点は"; max; "で2名以上います." End If

(42)

【問題】 ある会社の社員A~J の10人の年収が以下の通りであったとする. A:1230 万円,B:760 万円,C:600 万円,D:700 万円,E:780 万円, F:980 万円,G:880 万円,H:920 万円,I:850 万円,J:550 万円 これらの年収の値を任意に定義した配列に入れた上で,以下のプログラムを作成しなさい. (1)コマンドボタンを押すことにより,社員A~Jの年収を表示するプログラムを作成しなさい. (2)社員の年収の合計を表示しなさい. (3)社員の年収の平均を表示しなさい (4)社員の年収の最大値,最小値を求め,表示しなさい. (応用)社員の年収の標準偏差を出力しなさい.

(43)

構 造 体

Private[または Public] Type 構造体名 属性名 As 型 属性名 As 型 End Type Dim 変数名 As 構造体名 構造体を用いることにより,より高度なデータ構造を定義できる. CONST numOfMember=3

Private Type tMember ‘tMember という名前は任意. Namae As String

Tokuten As Integer End Type

Dim Member(0 To numOfMember) As tMember

Private Sub Form_Load()

Member(0).Namae = "まかなえ" Member(0).Tokuten = 35 Member(1).Namae = "たしろ" Member(1).Tokuten = 75 Member(2).Namae = "かやき" Member(2).Tokuten = 55 Member(3).Namae = "みついし" Member(3).Tokuten = 65 End Sub

Private Sub Command1_Click() Dim n As Integer

For n = 0 To numOfMember

Form1.Print Member(n).Namae; "の得点は"; Member(n).Tokuten Next End Sub 名前 Namae 得点 Tokuten Member(0) 名前 Namae 得点 Tokuten Member(1) 名前 Namae 得点 Tokuten Member(2) 名前 Namae 得点 Tokuten Member(3)

(44)

グラフィックスを用いたゲームプログラミング

1.Form の設定

2.宇宙の描画(点の描画)

Rnd: 乱数関数 Rnd は0以上1未満の乱数(Single)を戻す. Randomize: 乱数関数の初期化

Picture1.Pset (x, y), Color (x,y)に Color で指定した色の点を描画する. 点の大きさは Picture1.DrawWidth プロパティ

Const は定数(プログラム内において変化することの無い数)

【コード1】

Const CStars = 100 '星の数

'2次元座標のための構造体を定義する. Private Type tPoint

x As Single y As Single End Type

Private Type tStar pos As tPoint

(45)

End Type

Dim Star(0 To CStars) As tStar '星型で配列 Star を定義 Private Sub Command1_Click()

If Timer1.enabled = False Then

Command1.Caption = "開始しました" Picture1.SetFocus Timer1.enabled = True Else Command1.Caption = "中断" Timer1.enabled = False End If End Sub

Private Sub Form_Load()

Timer1.Interval = 10 'Timer1 の動作間隔を 10 ミリ秒にする. Timer1.enabled = False 'Timer1 を休止状態にする.

'Picture1 をピクセルモードにする. 'これにより Picture1 の左上が(0,0), '右方向が X の正方向,下方向が Y の正方向, '単位はピクセル(画素)の座標系になる. Picture1.ScaleMode = vbPixels

Picture1.AutoRedraw = True 'Picture1 の画像を記憶する 'Picture1 の大きさを 300×300 ピクセルにする 'プロパティウィンドウから変えてもよい. Form1.ScaleMode = vbPixels Picture1.Width = 300 Picture1.Height = 300 Picture1.BackColor = RGB(50, 0, 20) Command1.Caption = "開始" '背景(星)の初期化 makeStars End Sub

Private Sub Timer1_Timer() Dim n As Integer

Picture1.Cls 'Picture1 の描画をクリアする. drawStars

End Sub '星を作る

Private Sub makeStars() Dim n As Integer Randomize For n = 0 To CStars Star(n).pos.x = Rnd * 300 Star(n).pos.y = Rnd * 300 Next End Sub

(46)

'星の描画

Private Sub drawStars() For n = 0 To CStars

Star(n).pos.y = (Star(n).pos.y + 1) Mod 300

Picture1.PSet (Star(n).pos.x, Star(n).pos.y), vbWhite Next

End Sub

3.描画ウィンドウ端で跳ね返るボールの描画

Picture1.Circle (x,y), r ‘Picture1 に中心座標(x,y),半径 r の円を描く

【コード2】

Const CBalls = 10 'ボールの数 '2次元座標のための構造体を定義する. Private Type tPoint

x As Single y As Single End Type

'構造体(ボール型)の定義 Private Type tBall

enabled As Boolean 'ボールが生きているか否か(True or False) pos As tPoint '位置(2次元座標型) direction As Integer '方向 radius As Single '半径 color As Long '色 speed As Single 'ボールの速度 End Type

Private Type tStar pos As tPoint End Type

Dim ball(0 To CBalls - 1) As tBall 'ボール型で配列 Ball を定義 'ボールの作成(初期化)

Private Sub makeBall() Dim n As Integer '乱数の初期化 Randomize '乱数発生関数 Rnd は 0 以上、1 未満の範囲の値を返す(Single) For n = 0 To CBalls - 1 'ボールの位置を決定する. ball(n).pos.x = Rnd * Picture1.ScaleWidth ball(n).pos.y = Rnd * Picture1.ScaleHeight - 100 'ボールの色を決める. 'QBColor 関数は 0 から 15 までの値を引数にできる. ball(n).color = QBColor(Int(Rnd * 16)) 'ボールの初期方向を決める.

(47)

d = Int(Rnd * 2) If d = 0 Then ball(n).direction = -1 Else ball(n).direction = 1 End If ball(n).radius = Rnd * 10 + 5 'ボールの半径 ball(n).speed = Rnd * 10 'ボールの速度 ball(n).enabled = True 'ボールを有効にする Next End Sub

Private Sub Command1_Click() If Timer1.enabled = False Then

Command1.Caption = "開始しました" Picture1.SetFocus Timer1.enabled = True Else Command1.Caption = "中断" Timer1.enabled = False End If End Sub

Private Sub Form_Load()

Timer1.Interval = 10 'Timer1 の動作間隔を 10 ミリ秒にする. Timer1.enabled = False 'Timer1 を休止状態にする.

'Picture1 をピクセルモードにする. 'これにより Picture1 の左上が(0,0), '右方向が X の正方向,下方向が Y の正方向, '単位はピクセル(画素)の座標系になる. Picture1.ScaleMode = vbPixels

Picture1.AutoRedraw = True 'Picture1 の画像を記憶する 'Picture1 の大きさを 300×300 ピクセルにする 'プロパティウィンドウから変えてもよい. Form1.ScaleMode = vbPixels Picture1.Width = 300 Picture1.Height = 300 Picture1.BackColor = RGB(50, 0, 20) Command1.Caption = "開始" 'ボールの初期化 makeBall 'makeBall を呼び出す End Sub

Private Sub drawBall(obj As tBall) 'ボールの描画

Picture1.FillColor = obj.color 'ボールの塗りつぶし色

Picture1.FillStyle = vbFSSolid 'ボールの塗りつぶしスタイル

(48)

Picture1.Circle (obj.pos.x, obj.pos.y), obj.radius, obj.color End Sub

Private Sub Timer1_Timer() Dim n As Integer

Picture1.Cls 'Picture1 の描画をクリアする. For n = 0 To CBalls - 1

'ボールが生きているものについて If ball(n).enabled = True Then

'ボールが画面端に行ったら逆に進むようにする.

If ball(n).pos.x > Picture1.ScaleWidth - ball(n).radius Then ball(n).direction = -1

ElseIf ball(n).pos.x < ball(n).radius Then ball(n).direction = 1

End If

ball(n).pos.x = ball(n).pos.x + ball(n).direction * ball(n).speed 'ボールの描画 drawBall ball(n) End If Next End Sub 4.宇宙船

Picture1.Line (x1, y1)-(x2, y2), color (x1,y1)と(x2, y2)を結ぶ直線を描く 線の太さは DrawWidth プロパティ Picture1.Line –(x1, y1), color 直前の描画点と(x, y)を結ぶ線を描く FloodFill Picture1.hDC, x, y, crColor (WindowsAPI 関数)

Picture1 の(x, y)から境界色(crColor)まで塗りつぶす. 塗りつぶしの色は Picture1.FillColor で指定できる. 塗りつぶしのスタイルは Picture1.FillStyle で指定できる.

FloodFill 関数を用いる場合,コードの一行目に以下を必ず入れること.

Private Declare Sub FloodFill Lib "GDI32" (ByVal hDC As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) 改行無しで入れる.大文字・小文字も区別されるので十分に注意すること. やむなく改行する場合には, (スペース)+_ でつなぐ(コード参照) Select Case X ‘X は変数 Case A ‘変数 X が A のとき (実行文) Case B ‘変数 X が B のとき (実行文) ・・・

Case Else [Case Else は省略可能] ‘その他の場合 (実行文)

(49)

【コード3】

Private Declare Sub FloodFill Lib "GDI32" _ (ByVal hDC As Long, _

ByVal x As Long, ByVal y As Long, _ ByVal crColor As Long)

'2次元座標のための構造体を定義する. Private Type tPoint

x As Single y As Single End Type

Private Type tShip

pos As tPoint '位置(2次元座標型) speed As Single '宇宙船の速度

End Type

Private Type tMissile

enabled As Boolean 'ミサイルが生きているか否か(True or False) pos As tPoint 'ミサイルの位置(2次元座標型)

length As Single 'ミサイルの長さ speed As Single 'ミサイルの速度 color As Long '宇宙船の色 End Type

Dim ship As tShip '宇宙船型で ship を定義 Dim missile As tMissile 'ミサイル型でミサイルを定義

'宇宙船の初期化

Private Sub makeShip() ship.pos.x = 150 ship.pos.y = 250 ship.speed = 10 End Sub

'ミサイルの作成(初期化) Private Sub makeMissile() With missile .enabled = True .pos = ship.pos .color = vbYellow .speed = 5 .length = 20 End With drawMissile missile End Sub 'ミサイルの描画

Private Sub drawMissile(obj As tMissile) Picture1.DrawWidth = 2

Picture1.Line (obj.pos.x, obj.pos.y + obj.length)-(obj.pos.x, obj.pos.y), missile.color Picture1.DrawWidth = 1

(50)

'宇宙船の描画

Private Sub drawShip(obj As tShip)

Picture1.Line (obj.pos.x, obj.pos.y)-(obj.pos.x + 20, obj.pos.y + 20), vbWhite

Picture1.Line -(obj.pos.x - 20, obj.pos.y + 20), vbWhite '直前の描画点との間で直線を描く Picture1.Line -(obj.pos.x, obj.pos.y), vbWhite

Picture1.FillColor = RGB(255, 0, 0)

FloodFill Picture1.hDC, obj.pos.x, obj.pos.y + 5, vbWhite

'2 点を対角線とする四角形を書く,BF は四角形塗りつぶし(塗りつぶさない場合は B のみ) Picture1.Line (obj.pos.x - 20, obj.pos.y + 20)-(obj.pos.x + 20, obj.pos.y + 40), vbWhite, BF

End Sub

Private Sub Command1_Click() If Timer1.enabled = False Then

Command1.Caption = "開始しました" Picture1.SetFocus Timer1.enabled = True Else Command1.Caption = "中断" Timer1.enabled = False End If End Sub

Private Sub Form_Load()

Timer1.Interval = 10 'Timer1 の動作間隔を 10 ミリ秒にする. Timer1.enabled = False 'Timer1 を休止状態にする.

'Picture1 をピクセルモードにする. 'これにより Picture1 の左上が(0,0), '右方向が X の正方向,下方向が Y の正方向, '単位はピクセル(画素)の座標系になる. Picture1.ScaleMode = vbPixels

Picture1.AutoRedraw = True 'Picture1 の画像を記憶する 'Picture1 の大きさを 300×300 ピクセルにする 'プロパティウィンドウから変えてもよい. Form1.ScaleMode = vbPixels Picture1.Width = 300 Picture1.Height = 300 Picture1.BackColor = RGB(50, 0, 20) Command1.Caption = "開始" missile.enabled = False '船の初期化 makeShip 'makeShip を呼び出す End Sub

Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode 'KeyCode に応じて条件分け

Case 39 'KeyCode39(→キー)の場合 ship.pos.x = ship.pos.x + ship.speed

(51)

drawShip ship

Case 37 'KeyCode39(←キー)の場合 ship.pos.x = ship.pos.x - ship.speed

drawShip ship

Case 32 'KeyCode32(スペースキー)の場合 If missile.enabled = False Then

missile.pos = ship.pos '船の位置をミサイルの位置に makeMissile 'ミサイルの初期化

End If End Select End Sub

Private Sub Timer1_Timer() Dim n As Integer

Picture1.Cls 'Picture1 の描画をクリアする.

'生きているミサイルがある場合には If missile.enabled = True Then 'ミサイルの位置計算

missile.pos.y = missile.pos.y - missile.speed 'ミサイル描画

drawMissile missile

'画面から外れたらミサイルを否に

If missile.pos.y < 0 Then missile.enabled = False End If drawShip ship End Sub 5.ミサイルとボールの衝突検知を加えたゲームプログラム 関数定義の例 '距離計算関数(2次元座標型の2つの引数間の距離を測定) Private Function distance(pa As tPoint, pb As tPoint)

'Sqr は√の値,distance は戻り値

distance = Sqr((pa.x - pb.x) ^ 2 + (pa.y - pb.y) ^ 2) End Function

関数の呼び出し例 '衝突検知

Private Sub checkCollision() Dim n As Integer For n = 0 To CBalls - 1

'ボールとミサイルの位置を距離がボールの半径より小さかったら, If distance(ball(n).pos, missile.pos) < ball(n).radius Then

ball(n).enabled = False 'ボール使用不可に End If

Next End Sub

(52)

【コード4】ゲームプログラム(総合) Private Declare Sub FloodFill Lib "GDI32" _ (ByVal hDC As Long, _

ByVal x As Long, ByVal y As Long, _ ByVal crColor As Long)

Const CBalls = 50 'ボールの数 Const CStars = 50 '星の数

'2次元座標のための構造体を定義する. Private Type tPoint

x As Single y As Single End Type

'構造体(ボール型)の定義 Private Type tBall

enabled As Boolean 'ボールが生きているか否か(True or False) pos As tPoint '位置(2次元座標型) direction As Integer '方向 radius As Single '半径 color As Long '色 speed As Single 'ボールの速度 End Type '構造体(宇宙船型)の定義 Private Type tShip

pos As tPoint '位置(2次元座標型) speed As Single '宇宙船の速度

End Type

Private Type tMissile

enabled As Boolean 'ミサイルが生きているか否か(True or False) pos As tPoint 'ミサイルの位置(2次元座標型)

length As Single 'ミサイルの長さ speed As Single 'ミサイルの速度 color As Long '宇宙船の色 End Type

Private Type tStar pos As tPoint End Type

Dim ball(0 To CBalls - 1) As tBall 'ボール型で配列 Ball を定義 Dim ship As tShip '宇宙船型で ship を定義 Dim missile As tMissile 'ミサイル型でミサイルを定義 Dim Star(0 To CStars) As tStar '星型で配列 Star を定義 'ボールの作成(初期化)

Private Sub makeBall() Dim n As Integer '乱数の初期化 Randomize '乱数発生関数 Rnd は 0 以上、1 未満の範囲の値を返す(Single)

(53)

For n = 0 To CBalls - 1 'ボールの位置を決定する. ball(n).pos.x = Rnd * Picture1.ScaleWidth ball(n).pos.y = Rnd * Picture1.ScaleHeight - 100 'ボールの色を決める. 'QBColor 関数は 0 から 15 までの値を引数にできる. ball(n).color = QBColor(Int(Rnd * 16)) 'ボールの初期方向を決める. d = Int(Rnd * 2) If d = 0 Then ball(n).direction = -1 Else ball(n).direction = 1 End If ball(n).radius = Rnd * 10 + 5 'ボールの半径 ball(n).speed = Rnd 'ボールの速度 ball(n).enabled = True 'ボールを有効にする Next End Sub 'ミサイルの作成(初期化) Private Sub makeMissile() With missile .enabled = True .pos = ship.pos .color = vbYellow .speed = 5 .length = 20 End With drawMissile missile End Sub '宇宙船の初期化

Private Sub makeShip() ship.pos.x = 150 ship.pos.y = 250 ship.speed = 10 End Sub

'ミサイルの描画

Private Sub drawMissile(obj As tMissile) Picture1.DrawWidth = 2

Picture1.Line (obj.pos.x, obj.pos.y + obj.length)-(obj.pos.x, obj.pos.y), missile.color Picture1.DrawWidth = 1

End Sub '宇宙船の描画

Private Sub drawShip(obj As tShip)

Picture1.Line (obj.pos.x, obj.pos.y)-(obj.pos.x + 20, obj.pos.y + 20), vbWhite

Picture1.Line -(obj.pos.x - 20, obj.pos.y + 20), vbWhite '直前の描画点との間で直線を描く Picture1.Line -(obj.pos.x, obj.pos.y), vbWhite

Picture1.FillColor = RGB(255, 0, 0)

FloodFill Picture1.hDC, obj.pos.x, obj.pos.y + 5, vbWhite

(54)

'2 点を対角線とする四角形を書く,BF は四角形塗りつぶし(塗りつぶさない場合は B のみ) Picture1.Line (obj.pos.x - 20, obj.pos.y + 20)-(obj.pos.x + 20, obj.pos.y + 40), vbWhite, BF

End Sub

Private Sub Command1_Click() If Timer1.enabled = False Then

Command1.Caption = "開始しました" Picture1.SetFocus Timer1.enabled = True Else Command1.Caption = "中断" Timer1.enabled = False End If End Sub

Private Sub Form_Load()

Timer1.Interval = 10 'Timer1 の動作間隔を 10 ミリ秒にする. Timer1.enabled = False 'Timer1 を休止状態にする.

'Picture1 をピクセルモードにする. 'これにより Picture1 の左上が(0,0), '右方向が X の正方向,下方向が Y の正方向, '単位はピクセル(画素)の座標系になる. Picture1.ScaleMode = vbPixels

Picture1.AutoRedraw = True 'Picture1 の画像を記憶する 'Picture1 の大きさを 300×300 ピクセルにする 'プロパティウィンドウから変えてもよい. Form1.ScaleMode = vbPixels Picture1.Width = 300 Picture1.Height = 300 Picture1.BackColor = RGB(50, 0, 20) Command1.Caption = "開始" missile.enabled = False 'ボールと船の初期化 makeBall 'makeBall を呼び出す makeShip 'makeShip を呼び出す '背景(星)の初期化 makeStars End Sub

Private Sub Picture1_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode 'KeyCode に応じて条件分け

Case 39 'KeyCode39(→キー)の場合 ship.pos.x = ship.pos.x + ship.speed

drawShip ship

Case 37 'KeyCode39(←キー)の場合 ship.pos.x = ship.pos.x - ship.speed

drawShip ship

Case 32 'KeyCode32(スペースキー)の場合 If missile.enabled = False Then

(55)

makeMissile 'ミサイルの初期化 End If

End Select End Sub

Private Sub drawBall(obj As tBall) 'ボールの描画

Picture1.FillColor = obj.color 'ボールの塗りつぶし色

Picture1.FillStyle = vbFSSolid 'ボールの塗りつぶしスタイル

'Picture1 に円を描く

Picture1.Circle (obj.pos.x, obj.pos.y), obj.radius, obj.color End Sub

Private Sub Timer1_Timer() Dim n As Integer Picture1.Cls 'Picture1 の描画をクリアする. drawStars checkCollision 'ミサイルとボールの衝突検知 For n = 0 To CBalls - 1 'ボールが生きているものについて If ball(n).enabled = True Then

'ボールが画面端に行ったら逆に進むようにする.

If ball(n).pos.x > Picture1.ScaleWidth - ball(n).radius Then ball(n).direction = -1

ElseIf ball(n).pos.x < ball(n).radius Then ball(n).direction = 1

End If

ball(n).pos.x = ball(n).pos.x + ball(n).direction * ball(n).speed 'ボールの描画 drawBall ball(n) End If Next '生きているミサイルがある場合には If missile.enabled = True Then 'ミサイルの位置計算

missile.pos.y = missile.pos.y - missile.speed 'ミサイル描画

drawMissile missile

'画面から外れたらミサイルを否に

If missile.pos.y < 0 Then missile.enabled = False End If

drawShip ship End Sub

'衝突検知

Private Sub checkCollision() Dim n As Integer For n = 0 To CBalls - 1

'ボールとミサイルの位置を距離がボールの半径より小さかったら, If distance(ball(n).pos, missile.pos) < ball(n).radius Then

ball(n).enabled = False 'ボール使用不可に End If

Next End Sub

(56)

'星を作る

Private Sub makeStars() Dim n As Integer Randomize For n = 0 To CStars Star(n).pos.x = Rnd * 300 Star(n).pos.y = Rnd * 300 Next End Sub '星の描画

Private Sub drawStars() For n = 0 To CStars

Star(n).pos.y = (Star(n).pos.y + 1) Mod 300

Picture1.PSet (Star(n).pos.x, Star(n).pos.y), vbWhite Next

End Sub

'距離計算関数(2次元座標型の2つの引数間の距離を測定) Private Function distance(pa As tPoint, pb As tPoint) 'Sqr は√の値,distance は戻り値

distance = Sqr((pa.x - pb.x) ^ 2 + (pa.y - pb.y) ^ 2) End Function

(57)

乱数の使い方

Randomize 乱数を使う前に乱数を初期化する. Rnd 乱数を発生させる(0~1未満の値)

任意の範囲の整数の乱数を生成させるには

Int((upperbound - lowerbound + 1) * Rnd + lowerbound)

(変数 upperbound には範囲の上限の値を指定,変数 lowerbound には範囲の下限の値を指定)

【例1】さいころの目

Dim さいころの目 As Integer Private Sub Command1_Click() さいころの目 = Int(Rnd* 6 + 1) Form1.Print さいころの目 End Sub

Private Sub Form_Load()

Randomize '乱数の初期化 End Sub 【例2】トランプ ‘ジョーカーがない場合 Dim マーク As Integer Dim 数 As Integer Dim カードチェック(0 To 51) As Boolean Dim 残枚数 As Integer

Private Sub Command1_Click() Dim 乱数 As Integer If 残枚数 = 0 Then MsgBox "カード終了" Exit Sub End If Do 乱数 = Int(Rnd * 52)

Loop While カードチェック(乱数) = True カードチェック(乱数) = True 残枚数 = 残枚数 - 1 マーク = 乱数 ¥ 13 数 = 乱数 Mod 13 + 1 Select Case マーク Case 0

(58)

Form1.Print "スペード"; Case 1 Form1.Print "クラブ"; Case 2 Form1.Print "ダイヤ"; Case 3 Form1.Print "ハート"; End Select Print 数 End Sub

Private Sub Form_Load() シャッフル End Sub Private Sub シャッフル() Randomize 残枚数 = 52 For n = 0 To 51 カードチェック(n) = False Next End Sub

日付・時刻の扱い方

Now 現在の日時,時刻を返す関数 Date 日時を返す関数 Year(Now) 現在の西暦年を返す Month(Now) 現在の月を返す Day(Now) 現在の日を返す Hour(Now) 現在の時を 0~23 の範囲で返す Minute(Now) 現在の分を 0~59 の範囲で返す Second(Now) 現在の秒を 0~59 の範囲で返す 【例1】

Private Sub Command1_Click() Print Now Print Time Print Year(Now) Print Month(Now) Print Day(Now) Print Hour(Now) Print Minute(Now) Print Second(Now) End Sub

参照

Outline

関連したドキュメント

平成 26 年の方針策定から 10 年後となる令和6年度に、来遊個体群の個体数が現在の水

北海道の来遊量について先ほどご説明がありましたが、今年も 2000 万尾を下回る見 込みとなっています。平成 16 年、2004

当監査法人は、我が国において一般に公正妥当と認められる財務報告に係る内部統制の監査の基準に

ポケットの なかには ビスケットが ひとつ ポケットを たたくと ビスケットは ふたつ.

(1860-1939)。 「線の魔術」ともいえる繊細で華やかな作品

子どもが、例えば、あるものを作りたい、という願いを形成し実現しようとする。子どもは、そ

48.10 項及び 48.11 項又は上記(Ⅱ)に属するものを除くものとし、ロール状又はシート状

ここで, C ijkl は弾性定数テンソルと呼ばれるものであり,以下の対称性を持つ.... (20)