Skip to content

Instantly share code, notes, and snippets.

@kamiyaowl
Created September 2, 2014 12:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kamiyaowl/ea289f870a5ba4df6021 to your computer and use it in GitHub Desktop.
Save kamiyaowl/ea289f870a5ba4df6021 to your computer and use it in GitHub Desktop.
reversi
#include<stdio.h>
#define WIDTH 8
#define HEIGHT 8
#define EMPTY 0
#define BLACK 1
#define WHITE 2
#define TRUE 1
#define FALSE 0
int play_turn;
int field[HEIGHT][WIDTH];
//### initialize a game ###
void reversi_init() {
int i,j;
for(j = 0 ; j < HEIGHT ; ++j){
for(i = 0 ; i < WIDTH ; ++i){
field[j][i] = EMPTY;
}
}
//initialize position
field[HEIGHT / 2 - 1][WIDTH / 2 - 1] = BLACK;
field[HEIGHT / 2 ][WIDTH / 2 - 1] = WHITE;
field[HEIGHT / 2 - 1][WIDTH / 2 ] = WHITE;
field[HEIGHT / 2 ][WIDTH / 2 ] = BLACK;
//other properties
play_turn = 0;
}
// ### print a game status ###
void reversi_print(){
int i,j;
printf("<---------- turn %d ---------->\n",play_turn);
/* header */
printf(" |");
for(i = 0 ; i < WIDTH ; ++i){
printf("%2d |",i);
}
printf("\n");
/* field */
for(j = 0 ; j < HEIGHT ; ++j){
printf("%2d |",j);
for(i = 0 ; i < WIDTH ; ++i){
switch(field[j][i]){
case EMPTY:
printf(" |");
break;
case BLACK:
printf(" B |");
break;
case WHITE:
printf(" W |");
break;
default:
break;
}
}
printf("\n");
}
}
// ### check and reverse stone (recursive function) ###
// bw : BLACK or WHITE
// x : location x
// y : location y
// dx : reverse direction x
// dy : reverse direction y
// return value : can reverse it
int reversi_reverse(int bw,int x,int y,int dx,int dy){
if(x < 0 || WIDTH <= x) return FALSE;
if(y < 0 || HEIGHT <= y) return FALSE;
if(field[y][x] == EMPTY) return FALSE;
if(field[y][x] == bw) return TRUE;
else {
if(reversi_reverse(bw,x + dx,y + dy, dx, dy)){
field[y][x] = bw;
return TRUE;
} else return FALSE;
}
}
// ### check between same color stone and reverse
// bw : BLACK or WHITE
// x : put location x
// y : put location y
// return value : can reverse direction count
int reversi_check_others(int bw,int x,int y){
int dir_count = 0;
dir_count += reversi_reverse(bw,x, y - 1, 0, -1);//up
dir_count += reversi_reverse(bw,x, y + 1, 0, 1);//down
dir_count += reversi_reverse(bw,x - 1, y, -1, 0);//left
dir_count += reversi_reverse(bw,x + 1, y, 1, 0);//right
dir_count += reversi_reverse(bw,x - 1, y - 1, -1, -1);//up left
dir_count += reversi_reverse(bw,x + 1, y - 1, 1, -1);//up right
dir_count += reversi_reverse(bw,x - 1, y + 1, -1, 1);//down left
dir_count += reversi_reverse(bw,x + 1, y + 1, 1, 1);//down right
return dir_count;
}
// ### put a stone ###
//bw : put stone is black or white?
//x : put location x
//y : put location y
//return value : can put stone.
int reversi_put(int bw,int x,int y){
/* area check */
if(x < 0 || WIDTH <= x) return FALSE;
if(y < 0 || HEIGHT <= y) return FALSE;
/* already put */
if(field[y][x] != EMPTY) return FALSE;
if(reversi_check_others(bw,x,y) > 0){
field[y][x] = bw;
play_turn++;
return TRUE;
} else return FALSE;
}
int main(void) {
int put_x,put_y,bw;
/* initialize reversi */
reversi_init();
reversi_print();
/* start player */
bw = BLACK;//or WHITE
while(1) {
printf("%s's turn>",bw == WHITE ? "WHITE" : "BLACK");
/* user input */
scanf("%d %d",&put_x, &put_y);
/* put */
if(reversi_put(bw, put_x, put_y)){
/* after put */
bw = bw == WHITE ? BLACK : WHITE;//next turn change
reversi_print();
} else {
/* miss */
printf("cannot put a stone.\n");
}
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment