|
オセロのゲーム自体は出来るのですが、コマの枚数の表示と勝敗の判定メッセージがうまく行きませんので、教えていただける方お願いします。
#include <stdio.h>
#include <stdlib.h>
#define BLANK 0
#define BLACK 1
#define WHITE -1
#define FALSE 0
#define TRUE 1
#define SIZE 256
/* (x,y)の位置から一方向へ幾つ返せるか */
int put(int board[], int color, int x, int y, int dx, int dy, int flag)
{
int n = 0;
/* (dx,dy) 方向へ相手の数を数える */
for(x += dx, y += dy; -color == board[y*10+x]; x += dx, y += dy) {
n++;
}
/* コマを返せないとき */
if (BLANK == board[y*10+x]) {
n = 0;
}
/* コマを返せるとき TRUE ならコマを返す */
if(0 != n && TRUE == flag) {
for(x -= dx, y -= dy; BLANK != board[y*10+x]; x -= dx, y -= dy) {
board[y*10+x] = color;
}
}
return n;
}
/* (x,y)の位置に置くと幾つ返せるか */
int search(int board[], int color, int x, int y, int flag)
{
int n = 0;
/* (x,y)位置にすでにコマがある */
if (BLANK != board[y*10+x]) {
return 0;
}
/* 8方向へ幾つ返せるか */
n += put(board, color, x, y, 1, 1, flag);
n += put(board, color, x, y, 0, 1, flag);
n += put(board, color, x, y, -1, 1, flag);
n += put(board, color, x, y, -1, 0, flag);
n += put(board, color, x, y, -1, -1, flag);
n += put(board, color, x, y, 0, -1, flag);
n += put(board, color, x, y, 1, -1, flag);
n += put(board, color, x, y, 1, 0, flag);
/* 置けるときに TRUE なら置く */
if(0 != n && TRUE == flag) {
board[y*10+x] = color;
}
return n;
}
/* 盤面上で置けるところがあるか */
int check(int board[], int color)
{
int x, y;
for (y = 1; y <= 8; y++) {
for (x = 1; x <= 8; x++) {
if (0 != search(board, color, x, y, FALSE)) {
return TRUE;
}
}
}
return FALSE;
}
/* 数値の入力 */
int input (char message[])
{
char buffer[SIZE];
int number;
printf("%s", message);
fgets(buffer, SIZE, stdin);
number = atoi(buffer);
return number;
}
/* どこに置くか?の処理 */
void man(int board[], int color)
{
int x, y;
for(;;){
/* (x,y) の入力 */
if(BLACK == color) {
printf("黒をどこに置きますか?(1-8)\n");
x = input("横:");
y = input("縦:");
}
if(WHITE == color) {
printf("白をどこに置きますか?(1-8)\n");
x = input("横:");
y = input("縦:");
}
if (1 <= x && 8 >= x && 1 <= y && 8 >= y) {
/* 入力位置にコマを置く */
if (0 != search(board, color, x, y, TRUE)) {
break;
}
}
}
}
/* 盤面の画面表示 */
void disp(int board[])
{
int x, y;
/* x の目盛り */
printf(" ");
for(x = 1; x <= 8; x++) {
printf(" %d", x);
}
printf("\n");
for(y = 1; y <= 8; y++) {
/* y の目盛り */
printf(" %d", y);
/* 盤面の中 */
for(x = 1; x <= 8; x++) {
if(WHITE == board[y*10+x]) {
printf("○");
}
if(BLACK == board[y*10+x]) {
printf("●");
}
if(BLANK == board[y*10+x]) {
printf(" ");
}
}
printf("\n");
}
}
/* ゲーム進行 */
void game(int board[])
{
int color = WHITE;
for(;;) {
/* 画面表示 */
disp(board);
/* ゲームの終了判定 */
if(FALSE == check(board, BLACK) && FALSE == check(board, WHITE)) {
break;
}
/* 黒の手番 */
if(BLACK == color) {
man(board, color);
color = WHITE;
}
/* 白の手番 */
else {
man(board, color);
color = BLACK;
}
}
}
/* 盤面の初期化 */
void init(int board[])
{
int i;
/* 最初は全て空白 */
for(i = 0; i < 10*10; i++) {
board[i] = BLANK;
}
/* 真中の4つにコマを配置 */
board[4*10+4] = board[5*10+5] = WHITE;
board[4*10+5] = board[5*10+4] = BLACK;
}
/* メイン */
int main()
{
int board[10*10];
init(board);
game(board);
return 0;
}
|