[ プログラミング演習(Ruby) >  プログラミング演習(Ruby) 課題(2024) >  [課題29] ReversiのGUI ]

[課題29] ReversiのGUI

課題

以下の説明にしたがって,ReversiプログラムのGUIを作成して,プログラムを提出して下さい.

以下に示すプログラムのテンプレートには, Reversiのゲーム実行処理は組み込み済みで,着手データを入力すればプログラムの内部でゲームを進行させられるようになっています. ただし盤面を表示して,ユーザが着手してゲームを進められるようにするためのインタフェイスが用意されていません. そこでウインドウに盤面を描画し,またウインドウ上でマウスを使って着手する操作ができるようにしてください. 具体的には次の2つを作成して下さい.

  1. 盤面描画処理メソッド
    盤面上の各マスの状態を取得して,それに基づいて画面に盤面を描く.

  2. マウスボタン入力処理メソッド
    左クリックで選択されたマスに石を配置する.

これらを適切に定義すれば,マウスで選択したマスに石を配置して,更新された後の盤面を描画して,画面上でマウスを使ってゲームを実行できるようになります.

画面構成

ゲームの盤面をウインドウ上で構成するために, ウインドウの表示領域を区切ってゲーム上のマス(u,v)と対応させるようにします.

Reversiの画面

左図はゲーム開始時点での盤面の状況を表しています.

プログラムテンプレート

次に示すプログラムのテンプレート(雛型)を使って下さい. このプログラムは名前を適宜変えた上で保存して利用してください(リンクを右クリックして「リンク先に名前をつけて保存」に相当する項目を選んで下さい).

テンプレートはそのままでも実行可能です. インタフェイスが組み込まれていないことから, プログラムを実行しても画面は真っ黒で何も描画されませんが, 画面上を左クリックすると,クリックした位置の座標(x,y)が端末画面に表示されるようになっています(注:このとき表示されるのが画面での座標の値です).

プログラムの実行方法

プログラムは次のようにプレイヤと盤面サイズを指定して実行するようになっています(ファイル名をreversi.rbとしています). ユーザ(user)の代わりにコンピュータ(com)にゲームを担当させることができます. 盤面サイズを指定することもできます(4以上の偶数,指定しなければ8).


  $ ruby reversi.rb            # 黒→user,白→user,盤面サイズ=8×8
  $ ruby reversi.rb -b         # 黒→com, 白→user,盤面サイズ=8×8
  $ ruby reversi.rb -w         # 黒→user,白→com, 盤面サイズ=8×8
  $ ruby reversi.rb -b -w -s 6 # 黒→com, 白→com, 盤面サイズ=6×6
  $ ruby reversi.rb -h         # 使い方(help)の表示

プログラムの実行に関する補足

プログラムを実行してウインドウが開いた後,ゲームを開始する(ゲームを進行させる)には,メニューの「Game」→「New」を選択して下さい.

 [Game]→[New]: 新しいゲームを開始する

ゲームが進行中の場合に限って石を置くことができるようになっています. なお盤面描画処理はゲーム開始前にも実行するようになっています.

Reversiゲームオブジェクト

今回のプログラムでは,Reversiのゲームの情報と進行はすべて 「Reversiゲームオブジェクト」で管理されるようになっています(「三目並べ」の課題と同様). たとえば次のような処理はすべて「Reversiゲームオブジェクト」で実行されるようになっています.

今回の課題のプログラムでは, Reversiゲームオブジェクトを利用して, (1)盤面を画面に描く処理,(2)マスが指定されたとき,そのマスに石を置く処理(正確には「置こうと試みる」処理)だけを定義すればよいようになっています. これら以外でゲームに必要なことはすべてReversiゲームオブジェクトで処理します.

作成するメソッド

課題で作成するプログラムでは次のメソッドを作成してください.

  1. 盤面描画メソッド(load_board_image)
    各マスの状態(白,黒,空)に合わせて画面に白黒の石と空マスを表示する.
    このメソッドでは各マスの状態をReversiゲームオブジェクトから取得して,その状態に合わせて盤面を描画することになる. ゲームを開始する状態においても,ゲーム進行中の状態と区別することなく,このメソッドで盤面を描画する.
    このメソッドでは(ゲームを開始する状態も含めて常に)現在の盤面の各マスの状態を調べて,それに従って盤面を描画するのであって, このメソッドにおいてマスの状態を設定するのではないことに注意せよ(このメソッドではマスに石を置く処理は行わない).


  2. マウスボタン入力処理メソッド(button_released_event_handler)
    (ユーザの手番であるなら)左ボタンが押されたときに画面上でクリックされた位置(x,y)に対応するマス(u,v)に着手する.

利用可能なメソッド

以下のようなメソッドが利用できます. なお説明に次の表の記号を使っています.

gReversiゲームオブジェクト
(u,v)盤面でのマスの位置(u=1,2,...,v=1,2,...)
sマスの状態(:black:white:none)
(x,y)画面上の座標(左上角が原点,x軸右向き,y軸下向き)

ここでマスの状態:black:white:noneのデータ(:名前)はSymbolです.Symbolは名前で区別されるオブジェクトです(課題ではSymbolの詳細を理解する必要はありません).
マスの状態は:whiteなら白石があること,:blackなら黒石があること,:noneなら空であることを意味します.

[ プログラミング演習(Ruby) >  プログラミング演習(Ruby) 課題(2024) >  [課題29] ReversiのGUI ]