if 文 if 文の構文 if ( 「条件」) 「成立時の命令」[ else 「不成立時の命令」 ] # ここで [ 〜 ] の部分は、省略可能 # 「成立時の命令」、 「不成立時の命令」の所は、 # { と } で囲む必要はない == Q : *, o*, oo*, ... Q = * | 一番左が o で、かつ、残りが Q である Q : * o*, oo*, ... o { *, o*, .. } o Q == 右チェックができたので、次は、左チェック まずは、右チェックのプログラム(関数)を Copy 名前の変更 : right -> left 右に移動 -> 左に移動 : yoko + 1 -> yoko - 1 右盤端 -> 左盤端 : ( yoko <= 'F' ) -> ( 'A' <= yoko ) ※ up/down も作れる -> leftup, righdown 等.. 斜めも... 斜めの場合は tate, yoko を両方変更 チェックも tate, yoko 両方やる必要がある == int check_sandwich_right_direct_sub ( char board[8][8], char yoko, char tate, char color, char ocolor ) { yoko = yoko + 1; /*※*/ if ( yoko <= 'F' ) { /*※*/ if ( get_board ( board, yoko, tate ) == color ) { return 1; } else if ( get_board ( board, yoko, tate ) == ocolor ) { return check_sandwich_right_direct_sub ( board, yoko, tate, color, ocolor ); /*※*/ } } return 0; } int check_sandwich_left_direct_sub ( char board[8][8], char yoko, char tate, char color, char ocolor ) { yoko = yoko - 1; /*※*/ if ( 'A' <= yoko ) { /*※*/ if ( get_board ( board, yoko, tate ) == color ) { return 1; } else if ( get_board ( board, yoko, tate ) == ocolor ) { return check_sandwich_left_direct_sub ( board, yoko, tate, color, ocolor ); /*※*/ } } return 0; } /* 横方向のチェックを行う */ int check_yoko ( char yoko ) { if ( yoko <= 'F' ) { if ( 'A' <= yoko ) { return 1; /* 'A' <= yoko <= 'F' なので OK */ } } return 0; /* その他の場合は、駄目 */ } == int check_sandwich_yoko_direct_sub ( char board[8][8], char yoko, char tate, char color, char ocolor, int direction ) { yoko = yoko + direction; if ( check_yoko ( yoko ) ) { /*右も左両方*/ if ( get_board ( board, yoko, tate ) == color ) { return 1; } else if ( get_board ( board, yoko, tate ) == ocolor ) { return check_sandwich_yoko_direct_sub ( board, yoko, tate, color, ocolor ); /*※*/ } } return 0; } == int check_sandwich_tate_direct_sub ( char board[8][8], char yoko, char tate, char color, char ocolor, int direction ) { tate = tate + tateDirection; /* 縦 */ yoko = yoko + yokoDirection; /* 横 */ if ( check ( yoko, tate ) ) { /*横も縦も全部*/ if ( get_board ( board, tate, tate ) == color ) { return 1; } else if ( get_board ( board, tate, tate ) == ocolor ) { return check_sandwich_tate_direct_sub ( board, tate, tate, color, ocolor ); /*※*/ } } return 0; } == 1) 右方向のプログラム 2) 1) を利用して、左方向のプログラム Copy & Modify 3) 1), 2) まとめる関数をつくった (リファクタリング) 3-1) 同じような記述が沢山現れるのを防ぐ事ができた 3-2) 3) によって、横だけじゃなくて、縦も対応できるようになった 3-3) 3-2) から斜めが自動的的にできてしまった 4) 個々に関数をつくっていたが、もう引数の違いになってしまった -> プログラムの並びが、ループになった <ポイント> いきなり、全部は作らない 簡単な、一例だけを試しに作ってみる ( プロトタイピング ) 最初の実装は、Copy で良い 後(動く事を確認して..)から、リファクタリングを行う 考え方(設計)のチェックと、プログラム(コーディング)のチェックは別に行え == ファイルの分割 今迄プログラムは、一つのファイルで全部つくってきました p-012.c これを、分割して、複数のファイルにする とりあえず、二つに分ける main.c othello.c コンパイルの作業が増えてしまう -> makefile を作って、make コマンドで、サボる 今週の課題は 1 のみ 少なくても右だけでなく左のチェックもサポートしている者 # ひっくりかえす必要ない。チェックのみ