プログラムの概要
Winsock コントロールを使用すると、リモートコンピュータ に接続し、データを交換出来る事を利用して、通信対戦ゲー ムを作成する。 ゲームに関する処理は、既に標準モジュールに、グローバル なプロシージャとして、入力されて居るので、此れを追加し て、使用する(ファイル名はothello.bas で有る)。 相手のアドレス(IPアドレス、又は、コンピュータ名)と 双方のポート(互いに逆に設定)を指定して、設定ボタンを クリックすると、通信が確立し、メッセージ欄の指示に従い ゲームを開始する事が出来る。通信対戦プログラム
VB⑥ □ 単純変数の宣言(Public、Dim) □ 配列変数の宣言(Public) □ 標準コントロールの利用(Label、Picture、Command、Text、Frame) □ プロパティの値の取得と設定(Standard: BackColor、Text、Caption、Image) □ プロパティの値の取得と設定(Winsock: State、RemoteHost、RemotePort、LocalIP) □ メソッドの利用(Line、PaintPicture、Close、Bind、SendData、GetData) □ イベントの利用(Load、Click、MouseDown、DataArrival) □ 組込関数の利用(Val、Abs、Left、Mid、Right、RGB、MsgBox) □ 演算子(代入演算子、算術演算子、比較演算子、結合演算子、論理演算子) □ 制御構造構文(条件分岐、ループ処理) □ サブルーチン(新規プロシージャ、引数) □ 標準モジュールの追加(プロジェクト→標準モジュールの追加→既存のファイル) □ ActiveXコントロールの利用(プロジェクト→コンポーネント→コントロール) 今回の課題項目 □ 標準モジュールの利用(共通のコード:Public 変数、Public プロシージャ) □ Winsock コンポーネントの利用(Protocol、RemoteHost、RemotePort、Bind 等) 今回の重点項目 □ 対戦中にオプションボタンをクリック出来ない様にする(Fool Proof)。 □ コンピュータの思考ルーチンを強化する。 □ TCPを利用して一対複数の通信対戦ゲームを考えて見る。 今回の応用項目■ オブジェクト・プロパティ一覧 ■ コントロールの種類 プロパティ プロパティの設定値 フォーム オブジェクト名 Form1 Caption 通信対戦ゲーム ScaleMode 3 – ピクセル ピクチャーボックス オブジェクト名 picBoard ScaleMode 3 – ピクセル Appearance 0 – フラット AutoRedraw True Height 320 Width 322 BackColor &h0000C000&(濃緑) フレーム1 オブジェクト名 fraCommunication Caption 空白 フレーム2 オブジェクト名 fraRival Caption 対戦相手 オプションボタン オブジェクト名 optRival Index 0~1(コントロール配列) Caption 人間(0)、電脳(1) Value True(0) ラベル1 オブジェクト名 lblTitle Caption 通信対戦チェッカー Font HG創英角ポップ体、標準、26 ラベル1 ラベル2 コマンドボタン2 コマンドボタン1 ピクチャーボックス フレーム1 ラベル3 テキスト1 テキスト2 テキスト3 Winsock ラベル7 ラベル7 ラベル8 ラベル6 ラベル4 ラベル5 テキスト4 コマンドボタン3 フレーム2 オプションボタン
コントロールの種類 プロパティ プロパティの設定値 ラベル2 オブジェクト名 lblAddressR Caption、Font 相手のアドレス(MSゴシック、太字、11) ラベル3 オブジェクト名 lblAddressL Caption、Font 自分のアドレス(MSゴシック、太字、11) ラベル4 オブジェクト名 lblPortR Caption、Font 相手のポート(MSゴシック、太字、11) ラベル5 オブジェクト名 lblPortL Caption、Font 自分のポート(MSゴシック、太字、11) ラベル6 オブジェクト名 lblMessage Caption、Font 空白(MSゴシック、太字、12) Alignment 2 – 中央揃え ラベル7 オブジェクト名 lblScore Caption、Font 0(MSゴシック、太字、16) Alignment 1 – 右揃え Index 0~1(コントロール配列) ForeColor 白(0)、黒(1) BackColor 黒(0)、白(1) ラベル8 オブジェクト名 lblState Caption、Font 未受信(MSゴシック、太字、14) Alignment 2 – 中央揃え BorderStyle 1 – 実線 ForeColor &H00FFFFFF&(白) BackColor &H000000FF&(赤) テキストボックス1 オブジェクト名 txtAddressR Text 192.168.1.1(MSゴシック、太字、11) テキストボックス2 オブジェクト名 txtAddressL Text 192.168.1.2(MSゴシック、太字、11) テキストボックス3 オブジェクト名 txtPortR Text 1001(MSゴシック、太字、11) テキストボックス4 オブジェクト名 txtPortL Text 1002(MSゴシック、太字、11) コマンドボタン1 オブジェクト名 cmdSet Caption 、Font 設定(MSゴシック,太字,14) コマンドボタン2 オブジェクト名 cmdFinish Caption 、Font 終了(MSゴシック,太字,14) コマンドボタン3 オブジェクト名 cmdPass Caption 、Font パス(MSゴシック,太字,14) ソケット オブジェクト名 sckCOM Protocol 1 - sckUDPprotocol
ピクチャーボックス ビットマップ、アイコン、メタファイル、JPEGファイル、GIFフィル等の画像を表示 するコントロール。描画メソッドを用いて、円や直線等のグラフィックを描画する事も出来 る。亦、他のコントロールを内包するコンテナに成る事も出来る。 フレーム 他のコントロールをグループ化するコントロール。通常、チェックボックスやオプションボ タンと共に使用し、フレーム自体は、特定の機能を持たない。 ラベル テキストを表示するコントロール。此のテキストは、ユーザーが直接入力したり変更したり する事は出来ない。 テキストボックス テキストの入力や表示を行うコントロール。此のテキストは、ユーザーが直接入力したり変 更したりする事が出来る。 コマンドボタン ユーザーが選択したコマンド(命令)や操作を実行するコントロール。OKボタンや実行ボ タン等、処理の開始や中断・終了の合図に用いられ、最も良く利用されるコントロールです。 ソケット(Winsock) TCPネットワークサービス、及び、UDPネットワークサービスへアクセスする機能を提 供する ActiveX コントロール。此のコントロールを使用すると、TCP又はUDPを使用し てリモートコンピュータに接続し、送受信双方向のデータ交換を行う事が出来る。孰れのプ ロトコルでも、クライアント及びサーバーアプリケーションを作成出来る。 中央のサーバーに送るユーザー情報を集めるクライアントアプリケーションの作成、複数の ユーザーから集めたデータの中央コレクションポイントとして機能するサーバーアプリケー ションの作成、チャットアプリケーションの作成等に利用される。
TCP(Transmission Control Protocol)
TCPプロトコルは、コネクション型のプロトコルで有り、電話に例える事が出来る。ユー ザーは、接続を確立してから処理を行う必要が有る。亦、一旦接続が確立すると、TCPプ ロトコルでは、接続が持続され、非常に大きなファイル等でもデータの完全性が保証される が、多くのリソースが使用される
UDP(User Datagram Protocol)
UDPプロトコルは、コネクションレス型のプロトコルで有り、メモ伝言に例える事が出来 る。1台のコンピュータから別のコンピュータにメッセージが送られるが、両者は明示的に 接続されて居ない。亦、各送信データの最大サイズは、ネットワークに依り決まる。 此処では、UDPプロトコルを用いた双方向通信を主題として居る為、ゲーム部分は、標準モジュ ールothello.bas に既に入力された物を組み込んで使用する。標準モジュールをプロジェクトに追加 するには、メニューバーの『プロジェクト』より『標準モジュール』の追加を選択し、ダイアログ ボックスの『既存のファイル』タブから当該ファイルを指定する。 標準モジュールは、通常、アプリケーションの他のモジュールで共通に使う為の宣言やプロシージ ャを記述する為に使用する。
■ プログラムリスト(フォームモジュール部分) ■
Option Explicit
' フォームが読み込まれた時の処理 Private Sub Form_Load()
' 盤面データを設定する Call GetData ' 盤面を初期化する Call GameInit Call TurnDisp Call BoardInit ' 自機のIPアドレスを取得する txtAddressL.Text = sckCOM.LocalIP End Sub ' コマンドボタン(終了)がクリックされた時の処理 Private Sub cmdFinish_Click()
' ソケットを閉じる sckCOM.Close ' プログラムをメモリから消去して終了する Unload Me End End Sub ' コマンドボタン(設定)がクリックされた時の処理 Private Sub cmdSet_Click()
' ソケットが閉じて居ない場合は一旦閉じる
If sckCOM.State <> sckClosed Then sckCOM.Close ' リモートホスト(相手)を設定する sckCOM.RemoteHost = txtAddressR.Text ' リモートポート(相手)に整数を設定する sckCOM.RemotePort = Val(txtPortR.Text) ' ローカルポート(自分)に結合する sckCOM.Bind Val(txtPortL.Text) ' 送信する sckCOM.SendData "OK" End Sub ' 盤面でマウスボタンが押し下げられた時の処理
Private Sub picBoard_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ' 着目座標を求める
CX = X ¥ 40: CY = Y ¥ 40 ' 駒の置く位置を指定する Call PointPlace
' 終了判定を行う
If Not ED < 0 Then Call GameOver End Sub 左右孰れかのマウスボタン を押すと MouseDown イベ ントが発生する。 マウスボタンが押された時 のマウスの当該オブジェク ト内での座標は、引数X と Y に格納されて居る。 RemoteHost プロパティには 接続するコンピュータの名 前かIPアドレスを指定す る。 RemotePort プロパティには 接続するポートを指定する。 Bind メソッドは、ポート番 号にコントロールに結合し て、ローカルポートを使用出 来る様に予約する。 SendData メソッドは、デー タをリモートコンピュータ に送信する。 アプリケーションを終了す る場合、ソケットは閉じ、正 しくプログラムをメモリか ら消去して終了する事が望 ましい。 Call は、Sub プロシージャ等 に制御を渡すステートメン ト。引数が必要なプロシージ ャを呼び出す場合は、引数リ ストを括弧で囲む必要が有 る。
' パスがクリックされた時の処理 Private Sub cmdPass_Click() ' パス処理を行う
Call PassTurn ' 終了判定を行う
If Not ED < 0 Then Call GameOver End Sub
' 通信データを受信した時の処理
Private Sub sckCOM_DataArrival(ByVal bytesTotal As Long) ' サブプロシージャレベルでローカルな変数を宣言する Dim S As String Dim D As Boolean ' 現在のデータブロックを取得する sckCOM.GetData S ' 接続データの場合の処理を行う If lblState.Caption = "未受信" Then If S = "OK" Then Call FirstDisp(0) TN = 0 sckCOM.SendData "RV" Else Call FirstDisp(1) TN = 1 End If ' 対戦データの場合の処理を行う Else
If Left$(S, 7) = "OTHELLO" Then If Mid$(S, 8, 1) = "P" Then Call PassDisp Else CX = Val(Mid$(S, 8, 1)): CY = Val(Right$(S, 1)) D = JudgePlace Call ScoreDisp End If If Not ED < 0 Then Call GameOver Else BA = BA Xor 1 Call TurnDisp End If
ElseIf Left$(S, 5) = "AGAIN" Then If Mid$(S, 7) = "YES" Then Call GameInit Call TurnDisp Call BoardInit DataArrival イベントは、新 しいデータが送信されて来 た時に発生する。 GetData メソッドは、現在の データブロック(受信デー タ)を取得し、其れを変数に 格納する。 此の場合のイコール(=)記 号は、比較演算子で有る。 A=B : AとBは等しい 此等の場合のイコール(=) 記号は、代入演算子で有り、 右辺の値を左辺に代入する 働きをする。 此の様に、複数のステートメ ントをコロン(:)で区切り 1行に複数記述する事も出 来る。 此の場合のXor は、ビット演 算子で、1と排他的論理和を 取る事に依り、1は0に、0 は1に成る。 ユーザーが Function プロシ ージャで定義した関数は、組 込関数と同様に使用する事 が出来る。 Function プ ロ シ ー ジ ャ は Sub プロシージャと異なり 戻り値を利用する事が出来 る。 Call は、Sub プロシージャ等 に制御を渡すステートメン ト。引数が必要なプロシージ ャを呼び出す場合は、引数リ ストを括弧で囲む必要が有 る。
Call FirstDisp(1) TN = 1 Else sckCOM.Close Unload Me End End If End If End If End Sub ' 終了処理を行うジェネラルサブプロシージャ Private Sub GameOver()
' サブプロシージャレベルでローカルな変数を宣言する Dim I As Integer Dim J As Integer Dim K As Integer lblMessage.Caption = PR If Not TN = ED Then
K = MsgBox("もう一度?", vbYesNo + vbQuestion, "通信対戦ゲーム") If K = vbYes Then Call GameInit Call TurnDisp Call BoardInit Call FirstDisp(0) TN = 0
If optRival(0).Value = True Then sckCOM.SendData "AGAIN:YES" End If
Else
If optRival(0).Value = True Then sckCOM.SendData "AGAIN:NO" sckCOM.Close End If Unload Me End End If End If End Sub 此処で宣言した変数は宣言 したサブプロシージャ内で しか値の参照と設定を行う 事が出来ない。 此の様に条件分岐等が多重 にネストして居る時は、正し くインデントを付けて、対応 を明確にして置く事が望ま しい。 MsgBox 関数の第2引数はビ ット処理が行われる為、複数 の値を加える事で、複数の効 果を与える事が出来る。 送信データの先頭に識別の 為の文字列を付加する事に 依り、受信したデータの種類 を判別し易くして居る。 アプリケーションを終了す る場合、ソケットは閉じ、正 しくプログラムをメモリか ら消去して終了する事が望 ましい。 プログラムと同じフォルダに、素材の標準モジュ ール(othello.bas)とデータファイル(othello.dat) を格納して置く必要が有る。
Closeメソッドに依るソケットのクローズ(Winsock) ソケットをクローズするメソッド Object.Close TCP接続、又は、接続要求を受け付けて居るソケットを閉じる。クライアントアプリケー ションでもサーバーアプリケーションでも使用出来る。 オブジェクトにはWinsock コントロールを指定する。 Bindメソッドに依るポートの結合(Winsock) ポートを結合するメソッド Object.Bind 引数1, 引数2 TCP接続に使用するローカルポート、及び、ローカルIPを指定する。 オブジェクトにはWinsock コントロールを指定する。 引数1には、接続に使用するポートを指定し、必ず指定する。 引数2には、接続に使用するローカルインターネットアドレスを指定し、省略する事が出来る。 他のアプリケーションが、当該ポートを使用出来ない様にする時に便利で有る。 SendDataメソッドに依るデータの送信(Winsock) データをリモートコンピュータに送信するメソッド Object.SendData 引数 引数で指定したデータをリモートコンピュータに送信する。 オブジェクトにはWinsock コントロールを指定する。 引数には、送信するデータ(数値、又は、文字列)を指定し、必ず指定する。 GetDataメソッドに依るデータの受信(Winsock) 現在のデータブロックを取得し変数に格納するメソッド Object.Bind 引数1, 引数2, 引数3 リモートコンピュータより受信したデータを引数1で指定した変数に格納する。 オブジェクトにはWinsock コントロールを指定する。 引数1には、取得したデータを格納する変数を指定し、必ず指定する。 引数2には、取得するデータの型を指定し、省略する事が出来る。 引数3には、取得するデータのサイズを指定し、省略する事が出来る。 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説 機 能 書 式 解 説
Winsock メソッド Accept 送信されて来た接続要求の受入(TCPサーバーアプリケーション而巳) Bind ポートの結合 Close ソケットのクローズ Listen ソケットの作成と接続要求受付モードへの移行(TCP接続而巳) PeekData データブロックの取得(入力キューからデータを削除しない) SendData データの送信 GetData データブロックの取得(入力キューからデータを削除する) Winsock イベント Close リモートコンピュータが接続を閉じた時に発生 ConnectionRequest リモートコンピュータが接続を要求して来た時に発生 DataArrival 新しいデータが送られて来た時に発生 SendComplete 送信処理が完了した時に発生 SendProgress データの送信中に発生 Error バックグラウンド処理でエラーが発生した時に発生 Connect 接続処理が完了した時に発生 Winsock プロパティ BytesReceived 受信したデータのサイズ LocalHostName ローカルコンピュータのホスト名 LocalIP ローカルコンピュータのIPアドレス LocalPort 接続するローカルポート RemoteHost リモートコンピュータのホスト名(ホスト名、IPアドレスの孰れも可) RemoteHostIP リモートコンピュータのIPアドレス RemotePort 接続するリモートポート State コントロールの状態 Protocol 使用するプロトコル(TCPかUDP) 算術演算子 比較演算子 論理演算子 1.^ 冪乗 1.= 等しい 1.Not 否定 2.- 負数 2.<> 等しくない 2.And 論理積 3.*、/ 乗算と除算 3.< より小さい 3.Or 論理和 4.¥ 整数除算 4.> より大きい 4.Xor 排他的論理和 5.Mod 剰余 5.<= 以下 5.Eqv 同値 6.+、- 加算と減算 6.>= 以上 6.Imp 包合 算術演算子と論理演算子では、複数の演算子が使用されて居る場合には、頭に付けた番号の順序で 演算が行われる(上に書かれて居る演算子程優先順位が高い)。
Lineメソッドに依る直線の描画 直線、又は,矩形を描画するメソッド
Line Step(引数1, 引数2)- Step(引数3, 引数4), 引数5, 引数6
フォーム,ピクチャーボックス,プリンタの各オブジェクトに対して,指定した2点間を結 ぶ直線、又は,矩形(四角形)を描く。 引数1には、直線/矩形が描画されるオブジェクト内の始点のX座標を指定し、省略する事が出来る。 引数2には、直線/矩形が描画されるオブジェクト内の始点のY座標を指定し、省略する事が出来る。 引数3には、直線/矩形が描画されるオブジェクト内の終点のX座標を指定し、必ず指定する。 引数4には、直線/矩形が描画されるオブジェクト内の終点のY座標を指定し、必ず指定する。 引数6には、描画色を指定し、省略する事が出来る。 引数7には、オプション(矩形:B、塗り潰し矩形:BF)を指定し、省略する事が出来る。 Step は、描画位置を相対位置で指定する場合に使用し、省略する事が出来る。
始点を省略した場合は、CurrentX 及び CurrentY に依り示される位置が描画の開始点に成る。Line メ ソッドが実行されると、CurrentX 及び CurrentY プロパティは、引数に依り指定された終点に設定さ れる。此れを利用して、始点を省略し、連続線を描く事が出来る。 グラフィックメソッド Cls グラフィックのクリア PSet 点の描画(ピクセル単位での色の設定) Point 色の取得(指定したピクセルの色の値の取得) Line 線の描画(線、矩形、塗り潰し矩形の描画) Circle 円の描画(円、楕円、円弧の描画) PaintPicture 任意位置へのグラフィックの描画) 描画用プロパティ DrawWidth グラフィックメソッドで描画する線の太さや点の大きさを設定する DrawStyle グラフィックメソッドで描画する線のパターンを設定する DrawMode グラフィックを重ねる時の描画方法を設定する BorderWidth ラインコントロールやシェイプコントロールの外形線の太さを設定する BorderStyle ラインコントロールやシェイプコントロールの外形線のパターンを設定する 機 能 書 式 解 説