📄 othello.c
字号:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define DIM 4
/* 4∵4の鸽茸 */
#define NOSPC 'x'
/*弥く眷疥ない*/
#define FREESPC ' '
/*鄂腕*/
#define BLACKPC '*'
/* 辊短 */
#define WHITEPC 'o'
/* 球短 */
void clear( void );
void printintro( void );
void printscrn( void );
void initboard( void );
void printboard( void );
void center( int );
int place( int, int, int, int );
int move( int, int );
int check( int, int, int, int * );
int getspcs( int, int, int, int, int );
void change( int, int, int * );
char getcolor( int );
char invcolor( char );
char board[DIM + 2][DIM + 2];
int pcnum[3] = { 2, 2, 12 }; /* 0 = computer
1 = human
2 = free spaces */
int depth; /* 雇えの考さ */
main()
{
int x, plyr = 1, /* プレヤ〖フラグ
~ 0 = computer, 1 = human */
a, b, c, d, max;
char y;
/* 棱汤と鸽茸を今く */
printintro();
initboard();
while( pcnum[0] * pcnum[1] * pcnum[2] )
{
printboard();
c = 0;
max = 0;
while( c < 2 )
{
for( a = 1; a < DIM + 1; a++ )
for( b = 1; b < DIM + 1; b++ )
{
if ( board[a][b] == FREESPC )
d = check( plyr, a, b, NULL );/*check簇眶で短を弥けるかをチェックする*/
if (d > max)
max = d;
}
if (max > 0)
break;
c++;
plyr = 1 - plyr;
}
if (c == 2)
{
printf("もう弥けない\n");
printf("(Press return)");
getchar();
break;
}
if (c == 1)
if (plyr == 0)
{
printf("おまえ海搀パス ");
printf("コンピュ〖タもう办搀.\n(Press return)");
getchar();
printboard();
} else {
printf("コンピュ〖タパス、おまえもう办搀 ");
printf("お搓い.\n");
}
if (plyr)
{
printf("郝筛を今きなさい:\n");
scanf("%c%d", &y, &x );
getchar();
/* Check to make sure that the move is legal */
if ( place( plyr, tolower(y) - 'a' + 1, x, 0) )
{
/* Prompt the user for his move */
printf("ここに弥けない.\n");
printf("(Press return)\n");
getchar();
plyr = 0;
}
} else {/*コンピュ〖タの戎*/
depth = 3;
move( plyr, 0 );
}
plyr = 1 - plyr; /* プレヤ〖蛤仑 */
}
/* ゲ〖ム冯蔡 */
clear();
printf("\n\n\n\n\n\n\n\n\n\n\n");
center( 9 );
if (pcnum[1] > pcnum[0])
printf("YOU WIN!!\n");
if (pcnum[1] < pcnum[0])
printf("YOU LOSE.\n");
if (pcnum[1] == pcnum[0])
printf("苞き尸け!\n");
return(0);
}
void
clear( void )
{
if (system("clear"))
{
printf("An error occured clearing the screen.\n");
exit(0);
}
}
void printscrn( void )
{
clear();
printf("\n\n\n\n\n\n\n\n\n\n\n オセロ \n\n\n\n\n\n\n\n\n\n\n");
printf(" デ〖タ菇陇とアルゴリズム呵姜レポ〖ト\n\n");
printf(" ep05047 烈抖 灸\n (办婶はアメリカのあるサイトのothelloに徊雇した)");
getchar();
}
void
printintro( void )
{
printscrn();
clear();
printf("舍奶のオセロゲ〖ムのル〖ルに骄う\n");
printf("Press <return> to start the game.");
getchar();
}
void
initboard( void )
{
int i, j;
for( i = 0; i < DIM + 2; i++ )
for( j = 0; j < DIM + 2; j++ )
if (i * j == 0 || i == DIM + 1 || j == DIM + 1)
board[i][j] = NOSPC;
else
board[i][j] = FREESPC;
board[ DIM/2 ][ DIM/2 ] = BLACKPC;
board[ DIM/2 ][ DIM/2 + 1] = WHITEPC;
board[ DIM/2 + 1][ DIM/2 ] = WHITEPC;
board[ DIM/2 + 1][ DIM/2 + 1] = BLACKPC;
}
void
printboard( void )/*鸽茸を今く*/
{
int i, j, c = DIM * 4 + 17;
char comp[20] = "コンピュ〖タ",
humn[20] = "おまえ ",
*pstr[2] = {comp, humn};
clear();
center( c );
printf(" ");
for( i = 0; i < DIM; i++ )
printf(" %d ", i + 1);
printf("\n");
for ( i = 0; i < DIM; i++ )
{
center( c );
printf(" +");
for (j = 0; j < DIM; j++)
printf("---+");
printf("\n");
center( c );
printf("%c | %c", 'A' + i, board[i+1][1] );
for (j = 1; j < DIM; j++)
printf(" | %c", board[i+1][j+1]);
printf(" | %c", 'A' + i);
if (i < 2)
printf(" %s: %d", pstr[i], pcnum[i] );
printf("\n");
}
center( c );
printf(" +");
for (j = 0; j < DIM; j++)
printf("---+");
printf("\n");
center( c );
printf(" ");
for( i = 0; i < DIM; i++ )
printf(" %d ", i + 1);
printf("\n\n");
}
void
center( int spaces )
{
int i;
for( i = 0; i < (80 - spaces) / 2; i++ )
printf(" ");
}
place( int who, int y, int x, int undo )/*短を弥く*/
{
int n, k[8], na = 100 * (who * 2 - 1);
/* na 痰跟な猛 -100 に提る */
if (x < 1 || y < 1)
return (na);
if (x > DIM || y > DIM)
return (na);
if (board[y][x] != FREESPC)
return (na);
if ( check( who, y, x, k ) == 0 )
return (na);
/*呵努眷疥を玫すため、短を极瓢に弥くときの球か辊かの冉们 */
board[y][x] = getcolor( who );
pcnum[2] -= 1;
pcnum[who] += 1;
/* チェンジ */
change( y, x, k );
/* もし塑碰に短を弥くなら、undoではない */
if (!undo)
return(0);
n = move( 1 - who, 1 );
depth++; /* 徒鳞の考さ */
board[y][x] = FREESPC;
pcnum[2] += 1;
pcnum[who] -= 1;
change( y, x, k );
return (n);/*moveからの猛に提る*/
}
move( int who, int n ) /* nはplaceから */
{
int y, x, a, b, val, max = -100;
char mycolor = getcolor( who ); /* 球か辊か冉们 */
/* 考さの姜爬に缅くと*/
if (depth-- < 1)
return( pcnum[0] - pcnum[1] ); /* ミニマクス恕で冉们 */
for( y = 1; y < DIM + 1; y++ ){
for( x = 1; x < DIM + 1; x++ )
{
/*who プレヤ〖が 1 コンピュ〖タが 0で 赖と砷に惰侍する */
val = (who * -2 + 1) * place( who, y, x, 1 );
if (val > max)
{
max = val;
a = y;
b = x;
}
}
}
if ( max > -100 )
return (place( who, a, b, n ));
else
return (pcnum[0] - pcnum[1]);
}
int
check( int who, int y, int x, int *k )
{
int n = 0, i, j, num, max = 0, ydir, xdir; /* "dir" means "direction */
for( i = y - 1; i < y + 2; i++ )
for( j = x - 1; j < x + 2; j++ )
{
ydir = i - y;
xdir = j - x; /*
ydir = -1 ydir = -1 ydir = -1
xdir = -1 xdir = 0 xdir = 1
\ ^ /
\ | /
ydir = 0 \ | / ydir = 0
xdir = -1 <----- -----> xdir = 1
/ | \
/ | \
/ v \
ydir = 1 ydir = 1 ydir = 1
xdir = -1 xdir = 0 xdir = 1
*/
if ( ydir || xdir )
{
num = getspcs( 1 - who, i, j, ydir, xdir );
if (k != NULL )
k[n++] = num;
if ( num > max )
max = num;
}
}
return (max);
}
int
getspcs( int color, int y, int x, int ydir, int xdir )
{
int n = 0;
char colrpc = getcolor( color );
while( board[y][x] == colrpc )
{
n++;
y += ydir;
x += xdir;
}
if (board[y][x] == invcolor( colrpc ) )
return (n);
else
return (0);
}
void
change( int y, int x, int *amt )/*弥いた短による,辊か球かチェンジ*/
{
int a, b, i, n, tempwho, ydir, xdir;
for( i = 0; i < 8; i++ )
{
ydir = 0 + (i > 4) - (i < 3);
xdir = 0 + (i < 4)*(i % 3 - 1) - (i > 3)*((7 - i) % 3 - 1);
a = y + ydir;
b = x + xdir;
n = 0;
while( n++ < amt[i] )
{
tempwho = (board[a][b] == BLACKPC);
board[a][b] = getcolor( 1 - tempwho );
pcnum[tempwho] -= 1;
pcnum[1 - tempwho] += 1;
a += ydir;
b += xdir;
}
}
}
char
getcolor( int who )
{
return ( (who == 0)*WHITEPC + (who == 1)*BLACKPC );
}
char
invcolor( char piece )
{
return( (BLACKPC + WHITEPC) - piece );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -