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

神経衰弱ゲーム

N/A
N/A
Protected

Academic year: 2021

シェア "神経衰弱ゲーム"

Copied!
10
0
0

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

全文

(1)

プログラムの概要

プログラムを起動すると1組のカードが裏向きに表示さ れる。開始ボタンをクリックすると、其の場所に、先手と 後手の得点が表示され、タイトル部分に手番が表示されて ゲームを開始する事が出来る。 任意のカードを左クリックして開き、同じ数字のカードを 2枚開くと、其のカードは盤上から取り除かれ、カードを 開いた者の得点と成る。開いた2枚のカードが揃わ無い時 は、右クリックして、カードを閉じる。 2枚のカードが揃えば、続けてカードを開く事が出来、揃 わ無ければ、順番が相手に移る。最終的に14組以上を獲 得した者が勝者と成る。

神経衰弱ゲーム

VB 2005 ⑩ □ 単純・配列変数の宣言(Private、Dim) □ 標準コントロールの利用(PictureBox、Button、Label) □ コントロール配列の利用(コードでインスタンスを生成して配列に格納) □ プロパティの値の取得と設定(Size、Location、Image、Tag、Button、Visible 等) □ イベントの利用(Load、Click、MouseUp) □ メソッドの利用(DrawImage、Refresh、Add、FromImage)

□ ステートメントの利用(AddHandler、With … End With、Call、Exit Sub) □ 組込関数(乱数)の利用(Randomize、Rnd、DirectCast、StrConv、Right)

□ 制御構造構文(条件分岐 If ~ Then、Select Case … End Select、ループ処理 For ~ Next) □ 演算子(代入演算子、比較演算子、結合演算子、論理演算子) □ サブプロシージャーの作成と呼出(Call:引数有りと無し) 今回の課題項目 □ 実行時のオブジェクト生成(New、Controls.Add、AddHandler) □ 商と剰余の利用(Mod 演算子、¥演算子) □ 画像の指定範囲転送(DrawImage) 今回の重点項目 □ 同一のカードを続けてクリックすると、揃った事に成る不具合を修正する。 今回の応用項目

(2)

■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 フォーム Name breakdown BackColor Green FormBorderStyle FixedSingle MaximizeBox False Text 神経衰弱 ピクチャーボックス1 Name picBack Image back1.gif(他の画像を使用しても良い) Size 71、96 Visible False ピクチャーボックス2 Name picBase Image cards.gif Size 923, 384 Visible False ラベル1 Name lblFirst AutoSize False Font MS明朝,太字,14 ForeColor Yellow Text 先手: 0組 TextAlign MiddleCenter ラベル2 Name lblSecond AutoSize False Font MS明朝,太字,14 ForeColor Yellow Text 後手: 0組 TextAlign MiddleCenter ボタン Name btnStart Font MS明朝,太字,14 ForeColor Yellow Text 開始 ピクチャーボックス1 コマンドボタン ピクチャーボックス2 ラベル1 ラベル2

(3)

■ プログラムリスト ■ Public Class breakdown

' フォームレベルでグローバルな変数の宣言

Private Card(51) As Integer ' カードの種類

Private Score(1) As Byte ' 得点(0:先手、1:後手) Private Turn As Byte ' 手番(0:先手、1:後手) Private Number As Byte ' 枚目(0:1枚目、1:2枚目) Private Shows(1) As Byte ' 表札(0:1枚目、1:2枚目) Private picCard(51) As PictureBox ' 表示用カード

Private Bback As Bitmap ' 裏面画像 Private Bbase As Bitmap ' 表面画像 ' フォームが読み込まれた時の処理

Private Sub breakdown_Load( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles Me.Load

Dim I As Integer

' フォームのサイズ設定

Me.Size = New Size( 679, 640 ) ' フォームを中央に配置

Me.Left = ( SystemInformation.WorkingArea.Width - Me.Width ) / 2 Me.Top = ( SystemInformation.WorkingArea.Height - Me.Height ) / 2 ' 転送元画像の Bitmap オブジェクトの生成

Bback = New Bitmap( picBack.Image ) Bbase = New Bitmap( picBase.Image ) ' カード用のピクチャボックスの配置 For I = 0 To 51

picCard( I ) = New PictureBox( ) With picCard( I )

.Size = New Size( 71, 96 )

.Location = New Point( (I Mod 9) * 72 + 16, (I ¥ 9) * 97 + 16 ) .Tag = I

End With

Me.Controls.Add( picCard( I ) )

AddHandler picCard( I ).MouseUp, AddressOf picCard_MouseUp Next

' コントロールの配置

btnStart.SetBounds( 520, 501, 144, 96 ) lblFirst.Location = New Point( 520, 520 ) lblSecond.Location = New Point( 520, 550 ) ' 乱数系列とゲームの初期化

Randomize( ): Call GameInit( ) End Sub

' ボタン(開始)がクリックされた時の処理

Private Sub btnStart_Click( ByVal sender As Object, ByVal e As System.EventArgs ) _ Handles btnStart.Click

' スコアの初期化

Call ScoreDisp( 0, 0 ): Call ScoreDisp( 1, 0 ) ' 手番の表示 Me.Text = "神経衰弱 - 先手の番です。" ' 開始ボタンの非表示 btnStart.Visible = False End Sub ピクチャボックスをコントロール 配列と仕て扱う為の変数の宣言。 Size プロパティは、Width プロパ ティと Height プロパティに分け て設定する事も出来る。 SystemInformation ク ラ ス の メ ンバで有る WorkingArea プロパ ティでスクリーンサイズを取得。 ピクチャボックスの Image プロ パティからBitmap オブジェクト を生成して居る。 PictureBox 型の配列にピクチャ ボックスのインスタンスを生成し て、コントロール配列化して居る。 フォームのコレクションに生成し たコントロールを追加して居る。 生成したコントロールのイベント ハンドラを追加して居る。 Location プロパティは、Top プロ パティと Left プロパティに分け て設定する事も出来る。 引数無しのサブプロシージャの呼 出(サブルーチンコール)。 Call は、Sub プロシージャ等に制 御を渡すステートメントで有る。 必要が有れば、引数を指定する事 で、変数、配列、式等をプロシー ジャに引き渡す事が出来る。

(4)

' ピクチャボックス(カード)がクリックされた時の処理

Private Sub picCard_MouseUp( ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs )

Dim P As PictureBox = DirectCast( sender, PictureBox ) Dim N As Integer = P.Tag

If btnStart.Visible = True Then Exit Sub Select Case e.Button

Case Windows.Forms.MouseButtons.Left If Card( N ) < 0 Then Exit Sub If Number < 2 Then

Call CardDisp( N, Card( N ) ) Shows( Number ) = N : Number += 1 End If

If Number = 2 Then

If (Card( Shows(0) ) Mod 13) = (Card( Shows(1) ) Mod 13) Then picCard( Shows(0) ).Visible = False

picCard( Shows(1) ).Visible = False

Card( Shows(0) ) = -1 : Card( Shows(1) ) = -1 Score( Turn ) += 1

If Score(0) + Score(1) = 26 Then Select Case Score(0)

Case Is > 13 Me.Text = "神経衰弱 - 先手の勝ちです。" Case Is < 13 Me.Text = "神経衰弱 - 後手の勝ちです。" Case Else Me.Text = "神経衰弱 - 引き分けです。" End Select Call GameInit( ) btnStart.Visible = True Else

Call ScoreDisp( Turn, Score( Turn ) ) Number = 0

End If End If End If

Case Windows.Forms.MouseButtons.Right If Number = 0 Then Exit Sub Call BackDisp( Shows(0) )

If Number = 2 Then Call BackDisp( Shows(1) ) Number = 0 : Turn = Turn Xor 1

Select Case Turn

Case 0 : Me.Text = "神経衰弱 - 先手の番です。" Case 1 : Me.Text = "神経衰弱 - 後手の番です。" End Select End Select End Sub ' 得点を表示するジェネラルプロシージャ

Private Sub ScoreDisp( ByVal T As Byte, ByVal S As Byte ) Dim Z As String

Z = ":" & StrConv(Microsoft.VisualBasic.Right(" " + CStr(S), 2), VbStrConv.Wide) & "組" If T = 0 Then Z = "先手" & Z : lblFirst.Text = Z Else Z = "後手" & Z : lblSecond.Text = Z End If End Sub 従来のコントロール配列の識別に 使用されたIndex は、イベントを 発生させたコントロールのTag プ ロパティ等で代用する。 マウスの左右のボタンの押下状態 はClick イベントでは感知出来な い為、MouseUp イベントを使用。 Mod 演算子は、剰余(余り)を求 める演算子で有る。

Select Case 文では、Is キーワー ドを比較演算子と共に用いて、値 の範囲を指定する事が出来る。 孰れの Case にも該当しない場合 は、Case Else 節が実行される。 Exit Sub ステートメントは、以降 のコードを実行せずに直ちに(強 制的に)Sub プロシージャを抜け る命令で有る。 評価する変数が同一の場合には Select Case 文を使用するとコー ドが簡潔に成る。 変数の取り得る値が0か1で、0 なら1に、1なら0に変更するに は、論理演算子 Xor(排他的論理 和)を用いる事が出来る。 数値の部分を揃える為に、先頭に スペースを付けてから、右から2 文字を切り取り、常に数値が2桁 に成る様に仕て居る。

(5)

' ゲームを初期化するジェネラルプロシージャ Private Sub GameInit( )

Dim I As Integer Dim K As Integer Dim S As Integer Dim D As Integer ' カードの初期化

For I = 0 To 51 : Card( I ) = I : Next I ' カードのシャッフル For I = 1 To 300 S = Int( Rnd( ) * 52 ) D = Int( Rnd( ) * 52 ) K = Card( D ) Card( D ) = Card( S ) Card( S ) = K Next ' 裏面カードの表示

For I = 0 To 51 : Call BackDisp( I ) : Next I ' 開始ボタンの表示 btnStart.Visible = True ' スコアの初期化 Score( 0 ) = 0 : Score( 1 ) = 0 ' 手番と表札枚数の初期化 Turn = 0: Number = 0 End Sub ' カード(表面)を表示するジェネラルプロシージャ

Private Sub CardDisp( ByVal N As Integer, ByVal S As Integer ) Dim X As Integer Dim Y As Integer Dim G As Graphics Dim R As Rectangle X = ( S Mod 13 ) * 71 Y = ( S ¥ 13 ) * 96 R = New Rectangle( X, Y, 71, 96 ) With picCard( N )

.Image = New Bitmap( .Width, .Height ) G = Graphics.FromImage( .Image )

G.DrawImage( Bbase, 0, 0, R, GraphicsUnit.Pixel ) .Refresh( )

End With End Sub

' カード(裏面)を表示するジェネラルプロシージャ Private Sub BackDisp( ByVal N As Integer ) Dim G As Graphics

With picCard( N ) .Visible = True

.Image = New Bitmap( .Width, .Height ) G = Graphics.FromImage( .Image ) G.DrawImage( Bback, 0, 0 ) .Refresh( ) End With End Sub End Class 此れはカードシャッフルの定型と 謂う可き方法で有る。 此処で宣言した変数は宣言したサ ブプロシージャ内でしか値の参照 と設定を行う事が出来ない。 此のループ処理ではカウンターI の値を0 から 51 に 1 宛変化させ て、Next 迄の処理(配列に要素番 号と同じ値の代入)を繰り返す。 此のループ処理ではカウンターI の値を0 から 51 に 1 宛変化させ て、Next 迄の処理(サブルーチン コール)を繰り返す。 DrawImage メソッドに依り、1 枚の画像から必要な部分丈を切り 出して居る。 此処で宣言した変数は宣言したサ ブプロシージャ内でしか値の参照 と設定を行う事が出来ない。 描画の後、再描画の為の Refresh メソッドを実行しないと、描画は 反映されない。 同じオブジェクトに対して複数の 処理を実施する必要が有る場合 With ステートメントを用いると、 コードが簡潔に成る。 1行に複数の文を記述する事をマ ルチステートメントと謂う。

(6)

実行時にコントロールの生成 Add メソッド コントロールコレクションにコントロールを追加するメソッド Object.Controls.Add(コントロール) コントロールコレクションにコントロールを追加し、コンテナ化(内包)する。 AddHandler ステートメント イベントをイベントハンドラに関連付けるステートメント AddHandler オブジェクト名.イベント名, AddressOf イベントプロシージャ名 オブジェクト名で指定したオブジェクトにイベント名で指定したイベントが発生した時、イ ベントプロシージャ名で指定したイベントプロシージャに分岐する様にする。 実行時にコントロールを生成する手順 実行時にイベントを発生するコントロールを生成し、フォーム等に配置する手順は、下記の通りで有る。 1.生成するコントロールに合わせたデータ型を持つ変数を宣言する。 例:Dim P As PictureBox 2.コントロールのインスタンスを生成し、変数に代入する。 例:P = New PictureBox( ) 3.必要に応じて、生成したコントロールのプロパティを設定する。 例:P.Size = New Size(100, 50)

P.Location = New Point(30, 30)

P.Image = Image.FromFile(“sample.gif”)

4.生成したコントロールをAdd メソッドを使用してコンテナの Controls コレクションに追加する。 例:Me.Controls.Add(P)

5.生成したコントロールをイベントプロシージャに関連付ける。 例:AddHandler P.Click, AddressOf PictureBox_Click

上記の1と2は、Dim P = New PictureBox( ) の様に、一つに纏めて記述する事も出来る。

上記の3では、少なく共、Size プロパティと Location プロパティを設定して置く必要が有る。 上記の4では、フォーム丈で無く、グループボックスやパネル等を指定する事が出来る。 上記の5では、予めイベントプロシージャをジェネラルプロシージャと仕て作成して置くと、AddressOf と入力すると、インテリセンスに表示されるので、便利で有る。 機 能 書 式 解 説 機 能 書 式 解 説

(7)

DirectCast キーワードに依る型変換 型変換を指示するキーワード DirectCast(式, 型) Ctype と同様に型変換を行い、指定した型と式のランタイム型が同じ場合、実行時のパフォ ーマンスはCType より優れて居る。 引数の式には、変換の対象と成る式を指定し、省略する事は出来ない。 引数の型には、変換後の型を指定し、省略する事は出来ない。 ¥演算子に依る整数除算 2つの数値の商を計算し、結果を整数で返す演算子 数式1 ¥ 数式2 数式1を数式2で除算し、小数部を切り捨てゝ、其の商を返す。

Option Strict が Off の場合、除算を実行する前に、浮動小数点数式はバイト型、、短整数型、整数型、 又は、長整数型の式に丸められる。On の場合は、コンパイルエラーが発生する。

Mod 演算子に依る剰余

2つの数値の除算を行い、其の剰余を返す演算子

数式1 Mod 数式2

数式1を数式2で除算し、其の剰余(余り)を返す。

Mod 演算子は、引数1を引数2で除算し、其の剰余を返す。例えば、A = 8 Mod 3 では、変数 A の値は 2 に成る。

引数1か引数2が浮動小数点数値の場合は、除算が実行され、浮動小数点数の剰余が返される。演算結 果のデータ型は、有効な値の範囲が最も広いデータ型と同じに成る。有効な値の範囲は、Byte 型、Short 型、Integer 型、Long 型、Single 型、Double 型、Decimal 型の順に広く成る。

Xor 演算子に依る排他的論理和 2つの数値の排他的論理和を返す演算子 数式1 Xor 数式2 数式1と数式2の排他的論理和(互いが異なる時だけ真に成る)を返す。 Xor 演算子は、論理演算子、及び、ビット演算子と仕て機能する。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説

(8)

Graphics オブジェクトの FromImage メソッド Image オブジェクトから新しい Graphics オブジェクトを作成するメソッド Object.FromImage(イメージ) 指定したImage オブジェクトの新しい Graphics を返す。 描画(イメージング、ベクタグラフィックス、タイポグラフィ)を行う為に必要な Graphics オブジェ クトを Image オブジェクトから生成する場合に使用する。Image オブジェクトには、ピクチャボック スのImage プロパティも指定する事が出来るが、Bitmap クラスの新しいインスタンスで初期化して置 く必要が有る。ピクチャボックスに描画を行う為の手順は、下記の通りで有る。 1.Graphics オブジェクトを格納する為の変数を宣言する 例:Dim G As Graphics 2.ピクチャボックスのImage プロパティを Bitmap クラスの新しいインスタンスで初期化する。 例:PictureBox1.Image = New Bitmap(.Width, .Height)

3.ピクチャボックスのImage プロパティから Graphics オブジェクトを作成する。 例:G = Graphics.FromImage(PictureBox1.Image) 上記で、ピクチャボックスに、Graphics オブジェクトのメソッドを使用して、描画を行う事が出来る 様に成る。 Graphics オブジェクトの DrawImage メソッド 指定した位置に元のサイズで指定したイメージの指定した部分を描画するメソッド Object.DrawImage(イメージ, X座標, Y座標, 矩形, 単位) 指定した位置に元のサイズで、指定したImage オブジェクトの指定した部分を描画する。 引数のイメージには、描画元と成るImage オブジェクトを指定し、必ず指定する。 引数のX座標には、描画イメージの左上隅のX座標を指定し、必ず指定する。 引数のY座標には、描画イメージの左上隅のY座標を指定し、必ず指定する。 引数の矩形には、描画元と成るImage オブジェクトの範囲を指定し、必ず指定する。 引数の単位には、引数に使用する単位(ピクセル等)を指定し、必ず指定する。

猶、矩形はRectangle 構造体で指定し、単位は GraphicsUnit 列挙体のメンバで指定する。DrawImage メソッドで元画像の指定部分をピクチャボックスに描画する手順を、下記に示す。

1.ピクチャボックスのGraphics オブジェクトを作成する。 例:Dim G As Graphics

PictureBox1.Image = New Bitmap(.Width, .Height) G = Graphics.FromImage(PictureBox1.Image)

2.元画像のBitmap オブジェクトをピクチャボックスより作成する。 Dim B As Bitmap = New Bitmap(PictureBox2.Image)

3.矩形を表すRectangle 構造体を定義する。

Dim R As Rectangle = New Rectangle(10, 10, 50, 50)

4.指定した位置に元のサイズで指定したイメージの指定した部分を描画する。 G.DrawImage(B, 0, 0, R, GraphicsUnit.Pixel) 機 能 書 式 解 説 機 能 書 式 解 説

(9)

Refresh メソッドの依るコントロールの再描画 コントロールを再描画するメソッド Object.Refresh( ) 強制的に、コントロールがクライアント領域を無効化し、直後に其のコントロール自体と其 の子コントロールを再描画する。 Graphics オブジェクトの描画メソッド(DrawImage、DrawLine 等)を用いてピクチャボックスに描 画しても、其の儘では、何も表示されない。Refresh メソッドを用いて、再描画する必要が有る。 With ステートメントの依る一連のステートメントの実行 一連のステートメントを実行するステートメント With オブジェクト .プロパティ = 値 .メソッド( ) … End With オブジェクトや構造体への参照を繰り返し指定する一連のステートメントを実行する。

With ... End With ステートメントを使用すると、特定のオブジェクトの名前を再定義する事無く、其の オブジェクトに対して一連のステートメントを実行する事が出来る。例えば、単一のオブジェクトに対 して複数の異なるプロパティを変更する場合、With ... End With ステートメント内にプロパティを割り 当てるステートメントを指定する。With ... End With ステートメントを使用する場合、オブジェクトへ の参照はプロパティを割り当てる度に指定するのではなく、一度丈指定する。With ... End With ステー トメントを使用して同じオブジェクトの複数のプロパティに値を割り当てるコード例は、下記の通りで 有る。

With Label1 .Height = 50 .Width = 100

.Text = "This is Label1" End With

※ With ... End With ステートメントに入ると、End With ステートメントを実行する迄、object を割 り当て直す事は出来ない。此の為、修飾せずにアクセス可能なのは、指定したオブジェクトのメソッド やプロパティ丈で有る。他のオブジェクトのメソッドやプロパティを使用するには、オブジェクト名で 修飾する必要が有る。

With ... End With ブロックの中に別の With ... End With ステートメントを配置すると、With ... End With ステートメントを入れ子構造に出来る。但し、外側の With ... End With ステートメントのメンバ は内側のWith ... End With ステートメントに対してはマスクされて居るので、内側のWith ... End With ステートメントのオブジェクト参照を外側のWith ... End With ステートメントに含まれて居るオブジ ェクトのメンバに渡す時は、完全に修飾する必要が有る。 機 能 書 式 解 説 機 能 書 式 解 説

(10)

.NET Framework 対応

■ 明示的な型変換

従来の記述法

Dim N As Integer = P.Tag

.NET Framework の記述法

Dim N As Integer = Integer.Parse(P.Tag)

Tag プロパティは、Object 型で有るが、Visual Basic では、Integer 型の値が設定されて居れば、暗黙 的にInteger 型に変換される。併し、.NET Framework では、明示的に型変換を行う事が望ましい。 ■ 乱数の発生

従来の記述法

.NET Framework の記述法

Dim R As Random = New Random()

.NET Framework では、乱数を発生させるには、Rnd 関数ではなく、Random オブジェクトを使用す る(此処では、ゲームを初期化する GameInit メソッドのローカル変数に仕て居る)。猶、クラスをイ ンスタンス化する時に、乱数系列の初期化が行われるので、Randomize 関数の実行は、不要と成る。 従来の記述法 S = Int(Rnd() * 52) D = Int(Rnd() * 52) .NET Framework の記述法 S = R.Next(0, 52) D = R.Next(0, 52) 上記では、0 以上 52 未満の整数値(Integer 型)が返される。猶、Rnd 関数の様に、0.0 以上 1.0 未満 の実数値(Double 型)を返す NextDouble メソッドも提供されて居る。 ■ 数値の文字列化 従来の記述法

Z = ":" & StrConv(Microsoft.VisualBasic.Right(" " + CStr(S), 2), VbStrConv.Wide) & "組"

.NET Framework の記述法

Z = ":" & StrConv(S.ToString().PadLeft(2, " "c), VbStrConv.Wide) & "組"

.NET Framework では、数値の文字列化には、CStr 関数ではなく、各クラスの ToString メソッドを使 用する。亦、文字列を、指定の長さ(文字数)に整形するPadLeft メソッドや PadRight メソッドも提 供されて居る。

猶、.NET Framework では、StrConv 関数の様に、半角文字を全角文字に変換したり、全角文字を半

角文字に変換する手段は提供されて居ない(此の様な事を行う必要が有る場合には、従来の関数やAPI

参照

関連したドキュメント

業種 事業場規模 機械設備・有害物質の種 類起因物 災害の種類事故の型 建設業のみ 工事の種類 災害の種類 被害者数 発生要因物 発生要因人

① Google Chromeを開き,画面右上の「Google Chromeの設定」ボタンから,「その他のツール」→ 「閲覧履歴を消去」の順に選択してください。.

360 東京都北区個店連携支援事業補助金事業変更等承認申請書 産業振興課商工係 361

副校長の配置については、全体を統括する校長1名、小学校の教育課程(前期課

[r]

[r]

3.3 液状化試験結果の分類に対する基本的考え方 3.4 試験結果の分類.. 3.5 液状化パラメータの設定方針

産業廃棄物の種類 建設汚泥 廃プラスチック類 排    出