[[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にする
+ ウインドウのタイトルやサイズを設定する
+ ボタンを8x8にする
-- 二重配列を使い,[[演習2-1>演習2-1 GUIプログラミングの基礎]]のような順序でボタンを置いていくと良いでしょう.
-- setActionCommandには,ひとつの情報しか付加できません.そのため,[[演習2-1>演習2-1 GUIプログラミングの基礎]]で書いたような,iとjを用いた計算式にします.
-- この計算式を受信部分などでi,jに戻したい場合は,以下の式で変換できます.
-- %%%jとi,y方向とx方向の関係に注意してください%%%.下記のような二重for文の場合は,[j][i]と書くと1行目,2行目,…と配置されます.
 for(int i=0; i<8; i++) {
   for(int j=0; j<8; j++) {
     buttonArray[j][i]. ...
   }
 }
-- setActionCommandには,ひとつの情報しか付加できません.そのため,[[演習2-1>演習2-1 GUIプログラミングの基礎]]で書いたように,jとiを用いた計算式にします.
-- この計算式を受信部分などでj,iに戻したい場合は,以下の式で変換できます.
 int y = theBnum / 8;
 int x = theBnum % 8;
 int y = theBnum / 8;
- 初期のコマを配置する
+ 初期のコマを配置する

** 課題2・置けるコマをクライアントごとに限定する [#m0a0e9b8]
** 課題2・クライアントごとに置けるコマの色を決定する [#m0a0e9b8]

- MyClient内のmyColorと同じ位置に,以下の新しい変数を宣言しましょう.
- MyClient内のmyColorと同じ位置に,2つの新しい変数を宣言しましょう.
 private ImageIcon myIcon, yourIcon;
-- myColorを決めると同時に,上記の2つにもblackIconとwhiteIconを代入してあげます.
-- これで,いつでも自分の色のアイコンを参照できるようにしました.
-- myColorが0の時,myIconにblackIcon,yourIconにwhiteIconを代入してあげます.1の時は,その逆です.

- これで,いつでも自分の色のアイコン(myIcon)を参照できるようになりました.
-- 自分と相手は,myIconの中身が異なることになります.
-- では,自分側でmyIconを置いた時に,相手側ではyourIconを置くようにするには??

- ここで,[[演習3-2>演習3-2 ネットワーク対戦ゲームクライアント]]で記述したプログラムを少しいじります.
-- CLICKの送信部分で送る色の情報は,myColorにしてください.
-- その上に,アイコンを変更するなどの処理があれば,%%%全て消します%%%.
-- PLACEの送信部分で送る色の情報をmyColorにしてください.
-- 送信前にアイコンを変更する処理を色々書いていたら,この部分を%%%全て消してください%%%.

- そして,CLICKの受信部分の中に,アイコンを変更する処理を以下のように書きます.
- そして,PLACEの受信部分の中に,アイコンを変更する処理を以下のように書きます.
 if(color == myColor){
   //送信元クライアントでの処理
   buttonArray[y][x].setIcon(myIcon);
 } else {
   //送信先クライアントでの処理
   buttonArray[y][x].setIcon(yourIcon);
 }
-- colorはもちろん,送信したmyColorの受け取り先です.ううん,どういうことでしょう?
-- colorとmyColorを比較しています.colorは,送信されたmyColorの情報のはずですが…ううん,どういうことでしょう?

#ref(msgothello.png,center,50%)~
CENTER:図1. 2つのMyClient.javaの送信と受信(クリックで拡大)

-- 受信部分は両方のクライアントで実行される,という話はしましたね.
-- 自分のmyColorを送信した場合,これと相手のmyColorは異なるはずです.よって,受信部分の中で
-- 送信した「自分のmyColor」と,「相手のmyColor」は異なるはずです.
-- したがって,この2つの情報を比較することで,受信部分の中で
--- &color(red){両方のクライアントで行いたい処理};
--- &color(red){送信元のみで行いたい処理};
--- &color(red){送信先のみで行いたい処理};
-- を場合分けすることができます.ここがポイント!
-- あとは,送信元はmyIcon,送信先はyourIconを置く処理を行うことで,それぞれが同じ色になります.
-- あとは,送信元はmyIcon,送信先はyourIconを置く処理を書きましょう.
- 「自分の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の初期化は,myColorの決まった後などのタイミングで行うと良いでしょう.
- クリックした時に,myTurnによって処理を行う・行わないを分けましょう.
- あとは,myTurnをどこでうまく変更するかを考えてみてください.

#br

&size(16){[[&ref(http://yoslab.net/netprog/next.gif,nolink); 演習4-2へ>演習4-2 オセロの基礎2]]};

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   一覧 単語検索 最終更新     最終更新のRSS