TopPage > 最終課題に向けて > 演習4-1 オセロの基礎1

オセロの基礎

はじめに

まずは,最終課題を確認してください

演習4は任意の課題です.やらなくてもかまいません!
ここでは,「ひとまずオセロを作りたいんだけど,何をしたらいいか分からない!」方向けに解説を行います
ネットワーク通信とマス目アルゴリズムの詳しい説明もしているので,既に作りたい作品を想定している方も,参考になると思います.

※クライアントは,演習3-2MyClient.javaを引き続き利用します.
※サーバは,演習3-1-1で作成したMyServer2.javaを使います.

やりたいことを考える

  • オセロといっても,単純ではありません.やることはいっぱいですね!
    • まず,どんなプログラムを書けばいいかの想定と順序を組み立てましょう.
  • まず,コマを自由に置ける空間を作りましょう.それからターン制,置ける判定という順に制限をかけていく,という実装順序が良さそうです.
細かな準備
クライアントごとに置けるコマの色を決定する
ターン制にする
判定を行う
 置けるかどうか
 ひっくり返すかどうか
 ターンをパスするかどうか
 勝敗はどうか
etc ...

課題1・細かな準備

  1. 使用するマウスイベントを限定する
    • 余計な出力や,マス目をドラッグできる機能はいりませんよね.
    • コメントアウト(// や /* */)しておくと,その行を無効化できます.
  2. ウインドウのタイトルやサイズを設定する
  3. ボタンを8x8にする
    • 二重配列を使い,演習2-1のような順序でボタンを置いていくと良いでしょう.
    • 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で書いたように,jとiを用いた計算式にします.
    • この計算式を受信部分などでj,iに戻したい場合は,以下の式で変換できます.
      int y = theBnum / 8;
      int x = theBnum % 8;
  4. 初期のコマを配置する

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

  • MyClient内のmyColorと同じ位置に,2つの新しい変数を宣言しましょう.
    private ImageIcon myIcon, yourIcon;
    • myColorが0の時,myIconにblackIcon,yourIconにwhiteIconを代入してあげます.1の時は,その逆です.
  • これで,いつでも自分の色のアイコン(myIcon)を参照できるようになりました.
    • 自分と相手は,myIconの中身が異なることになります.
    • では,自分側でmyIconを置いた時に,相手側ではyourIconを置くようにするには??
  • ここで,演習3-2で記述したプログラムを少しいじります.
    • PLACEの送信部分で送る色の情報をmyColorにしてください.
    • 送信前にアイコンを変更する処理を色々書いていたら,この部分を全て消してください
  • そして,PLACEの受信部分の中に,アイコンを変更する処理を以下のように書きます.
    if(color == myColor){
      //送信元クライアントでの処理
      buttonArray[y][x].setIcon(myIcon);
    } else {
      //送信先クライアントでの処理
      buttonArray[y][x].setIcon(yourIcon);
    }
    • colorとmyColorを比較しています.colorは,送信されたmyColorの情報のはずですが…ううん,どういうことでしょう?
msgothello.png
図1. 2つのMyClient.javaの送信と受信(クリックで拡大)
  • 受信部分は両方のクライアントで実行される,という話はしましたね.
  • 送信した「自分のmyColor」と,「相手のmyColor」は異なるはずです.
  • したがって,この2つの情報を比較することで,受信部分の中で
    • 両方のクライアントで行いたい処理
    • 送信元のみで行いたい処理
    • 送信先のみで行いたい処理
  • を場合分けすることができます.ここがポイント!
  • あとは,送信元はmyIcon,送信先はyourIconを置く処理を書きましょう.
  • 「自分のmyIcon」と「相手のyourIcon」は同じ色のはずなので,両者とも同じ画面になります.

課題3・ターン制にする

  • 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をどこでうまく変更するかを考えてみてください.
 

next.gif 演習4-2へ


添付ファイル: filemsgothello.png 1129件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   一覧 単語検索 最終更新     最終更新のRSS
Last-modified: 2016-08-31 (水) 04:18:24 (2793d)