ソースの分割について
Posted: 2011年7月12日(火) 22:56
今、c言語で300行程度のオセロのプログラムを書きました。
これから、AIの部分を作ろうとしていて、そのためにcomputerの思考の部分だけ別のヘッダファイル/ソースファイルに分離しようとしています。
しかし、私は複数のソースファイルでプログラムを組んだことがないので、どうしたら良いか分からずじまいです。
externや#ifdefがどうたらこうたらで、もう降参状態です\(^o^)/
以下にソースを貼り付けますので、どのように分割すればよいかご教授ください。
また、他に直したほうが良いところなどがあれば、指摘してくださいると嬉しいです。
(関数や変数のネーミングセンスが終わっているのは仕様です。。。)
これから、AIの部分を作ろうとしていて、そのためにcomputerの思考の部分だけ別のヘッダファイル/ソースファイルに分離しようとしています。
しかし、私は複数のソースファイルでプログラムを組んだことがないので、どうしたら良いか分からずじまいです。
externや#ifdefがどうたらこうたらで、もう降参状態です\(^o^)/
以下にソースを貼り付けますので、どのように分割すればよいかご教授ください。
また、他に直したほうが良いところなどがあれば、指摘してくださいると嬉しいです。
(関数や変数のネーミングセンスが終わっているのは仕様です。。。)
#include <stdio.h>
//1=白
//2=黒
//0=空白
int board[8][8]={{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,1,2,0,0,0},
{0,0,0,2,1,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}};
int hyoukati[8][8]={{100,50 ,30 ,10 ,10 ,30 ,50 ,100},
{50 ,-50,20 ,-10,-10,20 ,-50,50 },
{30 ,20 ,40 ,20 ,20 ,40 ,20 ,30 },
{10 ,-10,20 ,0 ,0 ,20 ,-10,10 },
{10 ,-10,20 ,0 ,0 ,20 ,-10,10 },
{30 ,20 ,40 ,20 ,20 ,40 ,20 ,30 },
{50 ,-50,20 ,-10,-10,20 ,-50,50 },
{100,50 ,30 ,10 ,10 ,30 ,50 ,100}};
int turn=2;
int computer=1;
struct COUNTBOARD {
int c0;
int c1;
int c2;
};
struct MASU {
int x;
int y;
int ok;
};
void game(void);
void printboard(void);
void turn_change(void);
COUNTBOARD countboard(void);
char* numberintochara(int);
int checkcell(int,int);
int isoverboard(int,int);
void putkoma(int,int);
int canputkoma(void);
MASU computerthinking(int *b);
int main(void) {
int temp;
game();
printf("オセロゲームを終了します。何かキーを押してEnterを押してください。\n");
scanf("%d",&temp);
return 0;
}
void game(void) {
int p,q,skip;
skipflag:
while(canputkoma()!=0) {
skip=0;
printboard();
if (turn!=computer) {
printf("置きたい場所を半角スペース区切りで入力してください。例:一番右上なら「0 7」\n>>");
scanf("%d%d",&p,&q);
while (checkcell(p,q)==0) {
printf("そこには置けません\n");
scanf("%d%d",&p,&q);
}
} else {
MASU m=computerthinking(*board);
if (m.ok==1) {
p=m.x;
q=m.y;
printf(">>%d %d\n",p,q);
} else {
break;
}
}
putkoma(p,q);
turn_change();
}
skip++;
if (skip==1) {
printboard();
printf("%sはスキップ!\n",numberintochara(turn));
turn=3-turn;
goto skipflag;
}
if (skip==2) {
printboard();
printf("%sはスキップ!\n",numberintochara(turn));
printf("両者連続パスしたので、ゲームを終了します\n",numberintochara(turn));
}
}
void printboard(void) {
int i=0,j=0;
printf("-------------------------------\n");
printf("[Turn:%s]\n",numberintochara(turn));
for (j=0;j<8;j++) {
printf(" %d",j);
}
printf("\n");
for (i=0;i<8;i++) {
printf("%d",i);
for (j=0;j<8;j++) {
switch (board[i][j]) {
case 0:
printf("×");
break;
case 1:
printf("○");
break;
case 2:
printf("●");
break;
}
}
printf("\n");
}
COUNTBOARD cb=countboard();
printf(" ○%d-%d●\n",cb.c1,cb.c2);
}
void turn_change(void) {
turn=3-turn;
}
COUNTBOARD countboard(void) {
int i=0,j=0,c0=0,c1=0,c2=0;
COUNTBOARD cb;
for (i=0;i<8;i++) {
for (j=0;j<8;j++) {
switch (board[i][j]) {
case 0:
c0++;
break;
case 1:
c1++;
break;
case 2:
c2++;
break;
}
}
}
cb.c0=c0;
cb.c1=c1;
cb.c2=c2;
return cb;
}
char* numberintochara(int c) {
if (c==0) {
return "blank";
}
if (c==1) {
return "white";
}
if (c==2) {
return "black";
}
return "unknown";
}
int checkcell(int p,int q) {
int dx,dy,px,py,allcount=0,count;
if (isoverboard(p,q)==1) {return 0;}
if (board[p][q]!=0) {return 0;}
for(dx=-1;dx<=1;dx++) {
for(dy=-1;dy<=1;dy++) {
if (dx==0 && dy==0) {continue;}
px=p+dx;
py=q+dy;
count=0;
while(isoverboard(px,py)==0 && board[px][py] == 3-turn) {
px+=dx;
py+=dy;
count++;
}
if (isoverboard(px,py)==0 && board[px][py]==turn) {
allcount+=count;
}
}
}
return allcount;
}
int isoverboard(int p,int q) {
int ret;
if (p<0 || p>7 || q<0 || q>7) {ret=1;} else {ret=0;}
return ret;
}
void putkoma(int p ,int q) {
board[p][q]=turn;
int dx,dy,px,py;
for(dx=-1;dx<=1;dx++) {
for(dy=-1;dy<=1;dy++) {
if (dx==0 && dy==0) {continue;}
px=p+dx;
py=q+dy;
while(isoverboard(px,py)==0 && board[px][py] == 3-turn) {
px+=dx;
py+=dy;
}
if (isoverboard(px,py)==0 && board[px][py]==turn) {
px=p+dx;
py=q+dy;
while(isoverboard(px,py)==0 && board[px][py] == 3-turn) {
board[px][py]=turn;
px+=dx;
py+=dy;
}
}
}
}
}
int canputkoma(void) {
int i,j,value=0;
for(i=0;i<8;i++) {
for(j=0;j<8;j++) {
value+=checkcell(i,j);
}
}
return value;
}
MASU computerthinking(int *b){
int i,j,p,q,max=-1000;
for(i=0;i<8;i++) {
for(j=0;j<8;j++) {
if (checkcell(i,j)!=0) {
if (max<hyoukati[i][j]) {max=hyoukati[i][j];p=i;q=j;}
}
}
}
MASU m;
m.x=p;
m.y=q;
if (max==-1000) {m.ok=0;} else {m.ok=1;}
return m;
}