#include "board5.h" // 盤面初期化 void init(BOARD *board) { int i, j; // 盤面初期化 for(i = 0; i < B_SIZE + 2; i++){ for(j = 0; j < B_SIZE + 2; j++){ // 壁(番兵) if(i ==0 || i == B_SIZE + 1 || j == 0 || j == B_SIZE + 1){ board->data[i][j] = WALL; } // 空 else{ board->data[i][j] = EMPTY; } } } // 初期配置 board->data[4][4] = board->data[5][5] = WHITE; board->data[4][5] = board->data[5][4] = BLACK; // 最初の色(黒) board->color = BLACK; } // チェック bool check(BOARD *board, int x, int y) { // 置く場所に石があれば置けない if(board->data[y][x])return false; // 左上 if(board->data[y - 1][x - 1] == -board->color && check_sub(board, x - 1, y - 1, -1, -1))return true; // 上 if(board->data[y - 1][x] == -board->color && check_sub(board, x, y - 1, 0, -1))return true; // 右上 if(board->data[y - 1][x + 1] == -board->color && check_sub(board, x + 1, y - 1, 1, -1))return true; // 左 if(board->data[y][x - 1] == -board->color && check_sub(board, x - 1, y, -1, 0))return true; // 右 if(board->data[y][x + 1] == -board->color && check_sub(board, x + 1, y, 1, 0))return true; // 左下 if(board->data[y + 1][x - 1] == -board->color && check_sub(board, x - 1, y + 1, -1, 1))return true; // 下 if(board->data[y + 1][x] == -board->color && check_sub(board, x, y + 1, 0, 1))return true; // 右下 if(board->data[y + 1][x + 1] == -board->color && check_sub(board, x + 1, y + 1, 1, 1))return true; return false; } // 一方向についてチェック(再帰) bool check_sub(BOARD *board, int x, int y, int add_x, int add_y) { // 増分を足す x += add_x; y += add_y; // 相手の色なら再帰 if(board->data[y][x] == -board->color) return check_sub(board, x, y, add_x, add_y); // 自分の色なら裏返せる if(board->data[y][x] == board->color) return true; return false; } // 盤面表示 void printBoard(BOARD *board) { int i, j; // X座標と上罫線出力 printf(" ABCDEFGH\n"); printf(" +----------------+\n"); // 石を出力 for(i = 1; i <= B_SIZE; i++){ // Y座標と左罫線出力 printf("%d|", i); for(j = 1; j <= B_SIZE; j++){ switch(board->data[i][j]){ // 黒 case BLACK:printf("●");break; // 白 case WHITE:printf("○");break; // それ以外 default: // 裏返せる場所 if(check(board, j, i))printf("*"); // 空白 else printf(" "); break; } } // 右罫線出力 printf("|\n"); } // 下罫線出力 printf(" +----------------+\n"); } // メイン int main(int argc, char **argv) { BOARD board; init(&board); printBoard(&board); if(check(&board, 4, 3))printf("裏返せます\n"); else printf("裏返せません\n"); return 0; }