[[TopPage]] > 最終課題に向けて > 演習4-1 オセロの基礎1 * オセロの基礎 [#rc5dd636] ** はじめに [#lb0ff286] ''まずは,[[最終課題>提出課題]]を確認してください''. 演習4は&size(24){任意};の課題です.既に作りたい作品を想定している方は,やらなくてもかまいません!~ ここでは,&color(red){%%%「ひとまずオセロを作りたいんだけど,何をしたらいいか分からない!」方向けに解説%%%を行います};.~ ※クライアントは,[[演習3-2>演習3-2 ネットワーク対戦ゲームクライアント]]の''MyClient.java''を引き続き利用します.~ ※サーバは,[[演習3-1-1>演習3-1-1 MyServer.java]]で作成した''MyServer2.java''を使います. ** やりたいことを考える [#e56d7212] - オセロといっても,単純ではありません.やることはいっぱいですね! -- まず,どんなプログラムを書けばいいかの想定と順序を組み立てましょう. -- オセロの場合はまず,コマを自由に置ける空間を作り,それから少しずつ制限をかけていく順序が良さそうです. 細かな準備 クライアントごとに置けるコマの色を決定する ターン制にする 判定を行う 置けるかどうか ひっくり返すかどうか ターンをパスするかどうか 勝敗はどうか etc ... ** 課題1・細かな準備 [#c3dff162] - 使用するマウスイベントを限定する -- 余計な出力や,マス目をドラッグできる機能はいりませんよね. -- コメントアウト(// や /* */)しておくと,その行を無効化できます. - ウインドウのタイトルやサイズを設定する - ボタンを8x8にする -- 二重配列を使い,[[演習2-1>演習2-1 GUIプログラミングの基礎]]のような順序でボタンが置かれていくと良いでしょう. -- setActionCommandには,ひとつの情報しか付加できません.そのため,[[演習2-1>演習2-1 GUIプログラミングの基礎]]のようにiとjを用いた計算式を入れます. -- この計算式をi,jに戻す場合は,以下の式で戻せます. int x = theBnum % 8; int y = theBnum / 8; - 初期のコマを配置する ** 課題2・置けるコマをクライアントごとに限定する [#m0a0e9b8] - MyClient内のmyColorと同じ位置に,以下の新しい変数を宣言しましょう. private ImageIcon myIcon, yourIcon; -- myColorを決めると同時に,上記の2つにもblackIconとwhiteIconを代入してあげます. -- これで,いつでも自分の色のアイコンを参照できるようにしました. - ここで,[[演習3-2>演習3-2 ネットワーク対戦ゲームクライアント]]で記述したプログラムを少しいじります. -- CLICKの送信部分で送る色の情報は,myColorにしてください. -- その上に,アイコンを変更するなどの処理があれば,全て消します. - そして,CLICKの受信部分の最後の方で,以下のように書きます. if(color == myColor){ //送信元クライアントでの処理 buttonArray[y][x].setIcon(myIcon); } else { //送信先クライアントでの処理 buttonArray[y][x].setIcon(yourIcon); } -- colorはもちろん,送信したmyColorの情報です.ううん,どういうことでしょう? #ref(msgothello.png,center,50%)~ CENTER:図1. 2つのMyClient.javaの送信と受信(クリックで拡大) -- 受信部分は両方のクライアントで実行される,という話はしましたね. -- 自分のmyColorを送信した場合,これと相手のmyColorは異なるはずです.よって,受信部分の中で --- &color(red){両方のクライアントで行いたい処理}; --- &color(red){送信元のみで行いたい処理}; --- &color(red){送信先のみで行いたい処理}; -- を場合分けすることができます.ここがポイント! -- あとは,送信元はmyIcon,送信先はyourIconを置く処理を行うことで,それぞれが同じ色になります. ** 課題3・ターン制にする [#sdde45f7] - myColorと同じように,myTurnという変数を作ります. -- 初期化では,一方の色を1,他方を0とします. - この変数も,0と1の使い分けをしてみます.ターンの判定基準は,例えば以下が挙げられそうですね. -- 0なら相手のターン,1なら自分のターン -- 0なら黒のターン,1なら白のターン - 0と1だけとせず,お互いのターン数を数える変数としてもOKです. -- 自分と相手のターン数が一致したら先攻のターン -- などなど - クリックした時に,myTurnによって処理を行う・行わないを分けましょう. - さらに,クリックした後の受信部分でmyTurnをうまく変更してあげましょう. #br &size(16){[[&ref(http://yoslab.net/netprog/next.gif,nolink); 演習4-2へ>演習4-2 オセロの基礎2]]};