TopPage > 演習課題 > 演習3-2 ネットワーク対戦ゲームクライアント

ネットワーク対戦ゲームクライアントの作成

まず,下記のプログラムと画像3枚を同じフォルダにダウンロードしてください.

fileMyClient.java ダウンロードソースコードファイルを見る

画像ファイルの保存は,画像ファイル上で右クリックし「名前をつけて画像を保存」をクリックします.
★保存先のフォルダが変わっている場合がありますので,注意してください.

White.jpg ... White.jpg

Black.jpg ... Black.jpg

GreenFrame.jpg ... GreenFrame.jpg

※サーバは,演習3-1でダウンロードしたMyServer.javaを使います.

プログラムの実行

接続を確認するために,コマンドプロンプトを3つ起動させます.

multimove.png
図1. 2つのMyClient.java

プログラム(MyClient.java)の解説

MyClient.javaは大きく4つの部分に分かれています.

  1. MyClient
    ここは,MyClient()が起動したときに,最初に動く(実際はmain()が最初ですが,main()の中で最初に呼ばれている)部分です.
    • 名前の入力ダイアログの表示
    • メインのウィンドウの表示
    • サーバへの接続
      を行います.
  2. MesgRecvThread
    MyClient.javaでいつも動いている(監視している)ところは,この部分です. 具体的には「public void run()」が,プログラムの起動中ずーーっと動作をしています.
  3. main
    起動時には,ここの関数が呼ばれますが,実際には,すぐに,MyClientが呼び出され,その中で,MesgRecvThreadが呼び出されています.
  4. マウスイベント部(mouseClicked,mouseEntered,mouseExited,mousePressed,mouseReleased,mouseDragged,mouseMoved)
    マウスでオブジェクトに何かしたときに,発生します. このマウスの処理に応じたプログラムを書くことで,何かできます. 上記のプログラムでは,mouseDraggedとmouseClickedに処理を記述しています.

プログラムの改良

プログラムの改良を通じて,動きを理解しましょう.しっかり読むことが重要です!!

改良1 - 複数のPC間で通信できるようにしましょう.

やり方はいくつかありますが,例えば下記の方法があります.



改良2 - 特定の番号のコマは動かないようにしてみましょう.

例えば,配列の1番目だけは,動かないようにしてみましょう.mouseDraggedのところで,theArrayIndexを見て,条件を分ければできます.

改良3 - 自分のコマをクリックしたときに,相手のコマも変わるようにしましょう.

現在は,クリックしたらコマをクリックしたら,自分のコマしか色が変わりません. まず,mouseClickedのところで,mouseDraggedのような送信部分を作ります. mouseDraggedでは,「MOVE」でしたので,「CLICK」「CHANGE」など別な名前にします. 送る情報としては,コマの色を含める必要があります.

次に,MesgRecvThreadの中に,if(cmd.equals("MOVE"))と同様に CLICKの情報を受けとり,その中で,コマの色を変えるプログラムを書きます. つまりここには,情報を受け取った相手に起こしたい動作を書きます.

ヒント



ネットワークを利用したプログラミングでは,書きたい操作が,

を考える必要がある,ということですね.



改良4 - 自動的に,黒と白を決めてみましょう.

※この課題では,演習3-1-1の練習問題で作成したMyServer2.javaを使います!!
これは,演習3-1-1の練習問題(MyServer2.java)では,接続してきたクライアントに対して,

1

と接続番号を送信していますね.
この接続番号「1」(2回目は2,3回目は3...)の数字を使うと例えば,偶数は黒,奇数は白とすると,つないだプログラムごとに黒と白が判定できます.
次は,クライアント(MyClient.java)です. (ファイルの名前を変えても構いませんが,ファイル名を変えるとプログラムの中も変える必要があります.ある程度動いたら,名前を変えたり,バックアップをとったりすると,あとで動かなくなったときに,おかしいところを探すのに便利です.)
受信部分は

public void run()

です.

out.println(myName);//名前を送る

の後に,

String myNumberStr = br.readLine();

を追加します. これで,サーバが送った番号を受け取れますが,このままだとまだ,単なる文字なので, Integer.parseIntを使って数値にします.
また,この数値を奇数が偶数かを判定するには, %(モジュロ)演算子を使います.
例えば,下記は偶数の時にif文の条件を満たします.

if(myNumberInt % 2 == 0){
}

自分が黒か白かの情報は,他の場所でも使いますので,どこでも使えるように,

public class MyClient extends JFrame implements MouseListener,MouseMotionListener { 
    private JButton buttonArray[];

のようなところに,

private int myColor;

と宣言しておいて, myColorが0の時は黒,myColorが1の時は白とかを決めておくと良いでしょう.

補足

MyServer.javaには,接続数の制限があります.つまり接続数が100を超えるとサーバが止まってしまいます.maxConnection = 100で制限していますので,気になる人は数を増やしておくと良いでしょう.

※本来なら,socketは使い回せるのですが,プログラムの簡略化のため,このような書き方をしています.

 

next.gif 最終課題?


トップ   一覧 単語検索 最終更新     最終更新のRSS