TopPage > 演習課題 > 演習3-2 ネットワーク対戦ゲームクライアント
まず,下記のプログラムと画像3枚を同じフォルダにダウンロードしてください.
MyClient.java ダウンロード/ソースコードファイルを見る
画像ファイルの保存は,画像ファイル上で右クリックし「名前をつけて画像を保存」をクリックします.
★保存先のフォルダが変わっている場合がありますので,注意してください.
※この課題では,演習3-1-1の練習問題で作成したMyServer2.javaを使います!!
接続を確認するために,コマンドプロンプトを3つ起動させます.
MyClient.javaは大きく4つの部分に分かれています.
プログラムの改良を通じて,動きを理解しましょう.しっかり読むことが重要です!!
いずれ複数のPCを使ってテストするためにも,先にやっておきましょう.やり方はいくつかありますが,例えば下記の方法があります.
ヒント:
ポート番号とは:
失敗例(MyServer2が起動しない!):
例えば,配列の1番目だけは,動かないようにしてみましょう.mouseDraggedのところの,theArrayIndex(ボタン番号)をうまく使います.
ヒント1:
ヒント2:
ヒント3:下記のプログラムは,0以外の場合には,x=x+1;が動く例です.
注意:このコードをMyClient.javaに書き加えるわけではないです!
if(x != 0){ x = x + 1; }
MyServer2では,演習3-1-1の練習問題(MyServer2.java)では,接続してきたクライアントに対して,
1
と接続番号を送信していますね.
この接続番号「1」(2回目は2,3回目は3...)の数字を使うと例えば,偶数は黒,奇数は白とすると,つないだプログラムごとに黒と白が判定できます.
MyClientの受信部分は
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の色に変えるよう修正してください.
もう少し改良!:これまでの改良では,特に画面上に変化はありませんので,もう一つ改良します.
コマをクリックしたら,myColorの色に変えるよう修正してください.
この修正は,
public void mouseClicked(MouseEvent e)
の中を修正します.
最初のmouseClickedのプログラムは,白がおかれていたら,黒に, それ以外が置かれていたら,白にするプログラムです.
そのプログラムを,白の人は白だけ,黒の人は黒だけおけるように修正してください.
先ほど作成した,myColorを使って,if文を書いてみましょう.
修正ができたら,実行してみて,
一方のMyClientは黒だけしかおけないことを
一方のMyClientは白だけしかおけないことを確認してください.
現在は,コマをクリックしたら,自分のコマしか色が変わりません.
まず,(1)mouseClickedのところで,mouseDraggedの中身を参考にしながら送信部分を作ります.
mouseDraggedの中身を参考にしてください.
mouseDraggedの中身をみるとわかるのですが,
(1)自分自身の設定する
(2)相手(サーバ経由で相手に)にその情報を送る
という流れです.
mouseDraggedの場合は,移動先の座標を計算して,
その座標を,サーバに送っています.
mouseClickedの場合には,まず,自分のコマを置いて, そのコマの位置と色をサーバにおくるという形にすればよいです.
では実際に書いてみましょう.
mouseClickedを見ると,すでにひっくり返す部分は書き終わっていますね.
あとはサーバに送るところを書くだけです.
ここでは,「MOVE」の代わりに「PLACE」(コマを置く)という命令を出してみましょう.
MOVEでは位置を送信情報としていますが,ここでは自分の色(myColor)を送る必要があります.
次に,(2)MesgRecvThreadのrun()の中に,if(cmd.equals("MOVE")){...という部分がありますね.
この中身を参考にしましょう.「PLACE」の命令を受け取った場合を考え,このif文の中に,コマの色を変えるプログラムを書きます.
ここに書くのは,情報を送った自分も,受け取った相手も動作する内容です.要注意ですよ!
今から書くのは,PLACEなので,コピーしたif文のMOVEをPLACEにしましょう.
次に,送信したmyColorを受け取る部分が必要です.
int x = を int theColor = として,myColorをうけとりましょう.
ここで,int myColorとすると,おかしなことになるので,しないように注意してください.
次に,buttonArrayに送られた色のコマを設定しましょう.
if文で書くと,色に応じて変更できますね.
図.MyClientからMyServerへの流れ1(プログラム)
図.MyClientからMyServerへの流れ2(プログラムのイメージ)
ヒント:
下記を忘れるとサーバーにデータを送られないので,忘れないように.
//サーバに情報を送る out.println(msg);//送信データをバッファに書き出す out.flush();//送信データをフラッシュ(ネットワーク上にはき出す)する
以上から,ネットワークを利用したプログラミングでは,書きたい操作が
とする必要がある,ということですね.詳しい動きは,演習4-1も参考にしてください.
MyServer.javaには,接続数の制限があります.つまり接続数が100を超えるとサーバが止まってしまいます.
maxConnection = 100で制限していますので,気になる人は数を増やしておくと良いでしょう.
※本来なら,socketは使い回せるのですが,プログラムの簡略化のため,このような書き方をしています.
なお,MyClientの名前は変えても構いませんが,ファイル名を変えるとプログラムの中も変える必要があります.
ある程度動いたら,名前を変えたり,バックアップをとったりすると,あとで動かなくなったときに,おかしいところを探すのに便利です.
※配布しているソースコードに記述してある「マウスが入った」などの表示を止めたいとき…
バックアップのコツ: