[[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という変数を作ります. - ターンの判定方法は様々です.ここでは,例を4つぐらい挙げておきますね. -- myTurnを「0」と「1」に限定し,一方を1,他方を0で初期化する場合 --- 0なら相手のターン,1なら自分のターン --- 0なら黒のターン,1なら白のターン myTurn = 1 - myTurn; // 0を1に,1を0にする -- 両者とも0から始めて,自分のターンが済んだら自分だけ+1する場合 --- 自分と相手のターン数を比較し,一致したら先攻のターン -- 両者とも0から始めて,自分のターンが済んだら両者とも+1する場合 --- ターン数が偶数なら先攻のターン - myTurnの初期化は,myColorの決まるタイミングで行うと良いでしょう. - クリックした時に,myTurnによって処理を行う・行わないを分けましょう. - あとは,myTurnをどこでうまく変更するかを考えてみてください. #br &size(16){[[&ref(http://yoslab.net/netprog/next.gif,nolink); 演習4-2へ>演習4-2 オセロの基礎2]]};