?? 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);}voidclear( 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(" ep03027 撥 池\n (辦嬸はアメリカのあるサイトのothelloに徊雇した)"); getchar();}voidprintintro( void ){ printscrn(); clear(); printf("舍奶のオセロゲ〖ムのル〖ルに驕う\n"); printf("Press <return> to start the game."); getchar();}voidinitboard( 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;}voidprintboard( 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");}voidcenter( 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]);}intcheck( 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);}intgetspcs( 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);}voidchange( 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; }}}chargetcolor( int who ){ return ( (who == 0)*WHITEPC + (who == 1)*BLACKPC );}charinvcolor( char piece ){ return( (BLACKPC + WHITEPC) - piece );}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -