目標 othello のゲーム板を作る ソフトウェアの作成 仕様 : プログラムの機能を「自然言語」で記述したもの オセロゲームのゲーム板(機能仕様) 場所を指定して、コマをうつ事ができる コマをうったら、必要に応じて、コマを反転した結果を表示する 他 : コマのおけない場所におかないようにする.. 制限: ( 本来の機能にはないが、今回の製品を作る上で しなければならないこと / しなくてもよい事 ) 例 : 表示や操作は Text で行う !! 後になって取り払ってもよいものになる事もある !! 仕様:概要と詳細に分けて記述する場合もある 画面の仕様(何が表示され、どんな意味を持つか):出力 -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- A B C D E F G H # 横の場所を A 〜 H で指定 1 2 3 4 ◯ ● # <= 白のコマは「◯」で 5 ● ◯ # 黒のコマは「●」で表す 6 7 8 # ↑ 縱の場所の指定を 1 〜 8 でで指定する -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- 入力 -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- Input> C5 # <= コマをうつ場所を縱(A〜H)、横(1〜8)で指定する -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- 設計 : 機能を実現するための手段の選択 ゲーム板の状態をどのように保持するか ? 要求されている機能は、画面表示 ( 文字列 ) 計算機で利用できる機能はメモリ記憶 ( 数値並び ) この二つにはギャップがある この二つのギャップを埋めるのがコーディグ コーディグ : 対応関係を决める規則の事 「ゲーム板の状態」 8 x 8 のマスからなっている 個々のマスには、コマ(白と黒)があるか、空き ゲーム板とメモリの対応 マス -> 一つのメモリ マスの状態 -> 三種類あるので、 三つの数値で表現(区別する) ’' (空白を表す ASCII Code) 空き (EMPTY) 'o' 白 (WHITE) '*' 黒 (BLACK) 8 x 8 -> 配列で表現 (プログラミングが入っている) # 「配列」は「C 言語の」とは限らない [プログラミング] ここまでで、ボードのプログラミングを考える board.h の説明 EMPTY/WHITE/BLACK BOARD_SIZE board.c の説明 ボードは char board[BOARD_SIZE][BOARD_SIZE] の形 ( 8 x 8 の char 型配列 ) で表現 # int 型でよいが.. char 型で十分 get_board_status ゲームボードの指定された場所 ( x, y で指定 ) の色を得る char color = get_board_stats ( 1, 2 ); => color には board[1][2] の内容が入る ならば始めから color = board[1][2] でもよさそう # get_board_stats は不要では ? C 言語の場合、添字は 0 〜 一方、仕様は、座標として 1 〜 or A 〜 になっている 0 〜 を 1 〜にかえる仕組みが必要 今回は、別の所 ( input の所 ) で、これを 実現したので、get〜 ではそのままになっている しかし、将来、get がわでやるかもしれない ので、そのままになっている ボードの初期状態(仕様にある) D4/E5 に黒, D5/E4 に白、その他は空白 init_board ボードの表示 board という内部の板の状態から、画面の表示を作る 横の座標 縱の座標 板の状態 黒があれば「●」(board[][]がBLACK) 白があれば「◯」(board[][]がWHITE) コマがなければ「 」(board[][]がEMPTY) を表示する。 テスト : プログラムが仕様を満しているかを確認 ボードに関するプログラム board.h board.c これが正くできているかどうかをチェック board_check.c [仕様] オセロのルールの実現 着手禁止地点のチェック 着手してよい場所 その場所に置く事により、相手のコマが 一つでも引っ繰り返す事ができればよい 挟んだコマの裏返し作業 [設計] 「引っ繰り返せる」をどう実現するか また、「一つでも」という事は、挟む方向として 8 方向 を考える必要がある 向き 0 〜 7 を考える direct.h direct.c 向きと、数値の対応 (コーディング) を决める 0 : 上向き 1 : 左上 -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- 1 0 7 \ | / 2 - * - 6 / | \ 3 4 5 -- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< ---- 8< -- /* 方向 0 1 2 3 4 5 6 7 */ static int x_dir[] = { 0, -1, -1, -1, 0, 1, 1, 1 }; static int y_dir[] = { -1, -1, 0, 1, 1, 1, 0, -1 }; static -> プログラムの実行前に初期化される 関数の外にあるので、ファイル内の関数から利用できる 方向を指定すれば、次のセルの場所が解る 現在のセルの位置が ox, oy の時、dir 方向のセルの位置は ox + x_step ( dir ) oy + y_step ( dir ) にそれぞれなる。 次は、「引っ繰り返せる」の詳細 # 以下は、右方向しか考えない 「今」「相」「相」..「相」「自」 rule.c check_reversible dir の値に拘わらず、適切に動く direct.h/.c で方向を上手にコーディングしているから... TEST rule_check.c 残る部分の仕様 入力は、縱を A〜H 横を 1 〜 8 で指定してもらう 内部では x : 0 〜 7 y : 0 〜 7 次の変換が必要 A 〜 H -> 0 〜 7 1 〜 8 -> 0 〜 7 入力にまかせてしまう [プログラム] input0.c 人間がキーボードからコマの指定をする # 後で、プログラムに考えてもらう事を想定 # input1.c .. などとする予定 キーボードからの二つの文字を入力する input_player_hand 入力促進メッセージを出力 文字列を入力 一文字目が横、ニ文字目が縱 と考えて返す。 hands という配列に記録 入力された文字コードから x,y の座標を求めるのは player.c の中で行う 例 : check_x_postion まとめ Othello プログラムの作成を通じて プログラムの作成方法の事例を紹介 仕様、設計、プログラミング、テスト 仕様 :機能を决める 設計 : 機能を実現する手段を選択 アルゴリズムやコーディングルールを決定 効率が良い / 作成手段が容易 プログラミング: プログラムを作成し実行 テスト : 動いているプログラムが仕様を満しているかどうか ? をチェック 次回は 今回の othello プログラムを拡張する