オセロのプログラムについて
Posted: 2011年4月19日(火) 00:12
どうしてもこのコードがうまく動きません
#include <stdio.h>
#define BOARD_W 8
#define BOARD_H 8
#define BLACK 0
#define WHITE 1
#define NONE 2
#define PUT_LINE(xx, yy) if ( put_line(0, p, x, y, xx, yy) ) if ( m ) put_line(1, p, x, y, xx, yy); else return 1;
char turn, board[][BOARD_W] = {
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE},
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE},
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE},
{NONE,NONE,NONE,BLACK,WHITE,NONE,NONE,NONE},
{NONE,NONE,NONE,WHITE,BLACK,NONE,NONE,NONE},
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE},
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE},
{NONE,NONE,NONE,NONE,NONE,NONE,NONE,NONE}};
char put_line(const char, char (*)[], const char, const char, const char, const char);
char put(const char, char (*)[], const char, const char);
char search(const char (*)[], const char, const char);
int main() {
char x, y;
for ( y = 0 ; y < BOARD_H ; ++y )
for ( x = 0 ; x < BOARD_W ; ++x )
if ( search(board, x, y) ) {
turn = !turn;
puts("On original board");
}
return 0;
}
char put_line(const char m, char (*p)[BOARD_W], const char x, const char y, const char xx, const char yy) {
char px, py;
for ( px = x + xx, py = y + yy ; px >= 0 && py >= 0 && px < BOARD_W && py < BOARD_H ; px += xx, py += yy )
if ( p[py][px] == !turn ) {
if ( m ) p[y][x] = turn;
} else {
if ( p[py - yy][px - xx] == !turn ) return 1;
return 0;
}
}
char put(const char m, char (*p)[BOARD_W], const char x, const char y) {
if ( p[y][x] == NONE ) {
PUT_LINE(0, 1)
PUT_LINE(1, 0)
PUT_LINE(1, 1)
PUT_LINE(-1, 0)
PUT_LINE(0, -1)
PUT_LINE(-1, -1)
PUT_LINE(1, -1)
PUT_LINE(-1, 1)
if ( m ) {
p[y][x] = turn;
turn = !turn;
}
}
return 0;
}
char search(const char (*s)[BOARD_W], const char x, const char y) {
if ( put(0, s, x, y) ) {
char d[BOARD_H][BOARD_W], px, py;
for ( py = 0 ; py < BOARD_H ; ++py )
for ( px = 0 ; px < BOARD_W ; ++px ) d[py][px] = s[py][px];
put(1, d, x, y);
for ( py = 0 ; py < BOARD_H ; ++py )
for ( px = 0 ; px < BOARD_W ; ++px )
if ( search(d, px, py) ) {
turn = !turn;
puts("On virtual board");
}
return 1;
}
return 0;
}