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

* ネットワーク対戦ゲームクライアントの作成 [#rc5dd636]

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

&ref(MyClient.java,,,MyClient.java ダウンロード);/[[ソースコードファイルを見る>http://yoshino.sys.wakayama-u.ac.jp/netprog/source/MyClient.java]]

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

&ref(White.jpg); ... White.jpg~

&ref(Black.jpg); ... Black.jpg~

&ref(GreenFrame.jpg); ... GreenFrame.jpg~

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

*** プログラムの実行 [#lf76b5e0]

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

- 一つのコマンドプロンプトで,MyServer.javaを起動させます.
- あとの二つのコマンドプロンプトで,MyClient.javaを起動させます.
- MyClientに表示されたコマを動かしてください.~
もう一方のクライアント画面も動きましたよね?


*** プログラム(MyClient.java)の解説 [#a545d56e]

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

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


*** プログラムの改良 [#haf84ef4]

プログラムの改良を通じて,動きを理解しましょう.

''[改良1]'' 複数のPC間で通信できるようにしましょう.~
やり方はいくつかありますが,例えば下記の方法があります.
-- 名前の入力ダイアログのあとに,「サーバのIPアドレス」の入力のためのダイアログを表示し,IPアドレスを入力させます.
-- IPアドレスが空の場合には,"localhost"(自分のPCのサーバ)に接続します.それ以外は,入力したサーバに接続します
--- "localhost"は,IPアドレス127.0.0.1(自分のPC)を表す特別な名前です.
--- 自分のPCへのアクセスという操作はよくあるため,覚えやすい"localhost"という名前が付けられています.
-- この方法ではPCが最低2台必要になります.1台はサーバとクライアントが動作しており,もう一台は,クライアントだけ動作しています.~
&br;
PCのIPアドレスの調べ方は,Tipsの「IPアドレスを調べる方法」を見てください.」
&br;
複数のPC間で通信テストをやりたい場合,[[Q&A>Q&A#bf9593c6]]を参考にしてください.

&br;&br;


''[改良2]'' 特定の番号のコマは動かないようにしてみましょう.~
例えば,配列の1番目だけは,動かないようにしてみましょう.mouseDraggedのところで,theArrayIndexを見て,条件を分ければできます.
&br;&br;


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

次に,MesgRecvThreadの中に,if(cmd.equals("MOVE"))と同様に
CLICKの情報を受けとり,そのなかで,コマの色を変えるプログラムを書きます.
&br;&br;


''[改良4]'' 自動的に,黒と白を決めてみましょう.~
&size(18){※この課題では,演習3-1-1の練習問題で作成したMyServer2.javaを使います!!};&br;
これは,演習3-1-1の練習問題(MyServer2.java)では,接続してきたクライアントに対して,
 1
と接続番号を送信していますね.~
この接続番号「1」(2回目は2,3回目は3...)の数字を使うと例えば,偶数は黒,奇数は白とすると,つないだプログラムごとに黒と白が判定できます.
&br;
次は,クライアント(MyClient.java)です.
(ファイルの名前を変えても構いませんが,ファイル名を変えるとプログラムの中も変える必要があります.ある程度動いたら,名前を変えたり,バックアップをとったりすると,あとで動かなくなったときに,おかしいところを探すのに便利です.)
&br;
受信部分は
 public void run()
です.
 out.println(myName);//名前を送る
の後に,
 String myNumberStr = br.readLine();
を追加します.
これで,サーバが送った番号を受け取れますが,このままだとまだ,単なる文字なので,
Integer.parseIntを使って数値にします.
&br;
また,この数値を奇数が偶数かを判定するには,
%(モジュロ)演算子を使います.
&br;
例えば,下記は偶数の時にif文の条件を満たします.
 if(myNumberInt % 2 == 0){
 }
自分が黒か白かの情報は,他の場所でも使いますので,どこでも使えるように,
 public class MyClient extends JFrame implements MouseListener,MouseMotionListener { 
     private JButton buttonArray[];
のようなところに,
 private int myColor;
と宣言しておいて,
myColorが0の時は黒,myColorが1の時は白とかを決めておくと良いでしょう.

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

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

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