アットウィキロゴ

バーラル @ ウィキ

C言語でオセロプログラミング

C言語でオセロのプログラミングをしてみた!!

あれだよ!AI同士のバトルをする環境を作ってみたいな・・・と!


PDF資料はこちら!!←見やすいのでこっち推奨(`・ω・´)



●main.c●
<stdio.h>
"func.h"

#define
VS1 ai_max
#define
VS2 ai_max

int main(void){

//変数宣言と初期化
char ban[8][8];
char *pt;
int turn = 0;
int end_flag;

//版に拠らない変数宣言
pt = &ban[0][0];

//初期化関数実行
init(pt);

//はじめのオセロを置く
set_first('x',pt,3,3);
set_first('x',pt,4,4);
set_first('a',pt,3,4);
set_first('a',pt,4,3);

//メインループ(パスが続くまで)
while(1){
	//print(pt);
	if(VS1('a',pt,turn)!=-1){
		turn++;
		end_flag = 0;
	}else if(end_flag==1){
		break;
	}else{
		end_flag = 1;
	}
	//print(pt);
	if(VS2('x',pt,turn)!=-1){
		turn++;
		end_flag = 0;
	}else if(end_flag==1){
		break;
	}else{
		end_flag = 1;
	}
}

//版情報表示+ポイント結果表示
print(pt);
point('a','x',pt);

return 0;
}


●func.h●

/*
座標の設定

0→Y


/


void init(char *pt);
void print(char *pt);
int reverse(char moji,char *pt,int x,int y);
void set_first(char moji,char *pt,int x,int y);

int set(char moji,char *pt,int x,int y);
int try_set(char moji,char *pt,int x,int y);
void point(char moji_A,char moji_B,char *pt);

int TRUN_A(char moji,char *pt,int turn);
int TRUN_B(char moji,char *pt,int turn);

int ai_easy(char moji,char *pt,int turn);
int ai_max(char moji,char *pt,int turn);
int manual_set(char moji,char *pt,int turn);

●func.c●
<stdio.h>

void init(char *pt){
int i;
for(i=0;i<64;i++){
	*pt='0';
	pt++;
}
}


void print(char *pt){
int i,j;
printf("\r\n  0 1 2 3 4 5 6 7 Y\r\n");
for(j=0;j<8;j++){
	printf("%d ",j);
	for(i=0;i<8;i++){
		printf("%c ",*pt);
		pt++;
	}
	printf("\r\n");
}
printf("X\r\n");
}


void set_first(char moji,char *pt,int x,int y){
int num;
for(num=0;num<x*8+y;num++){
	pt++;
}
*pt=moji;
}

void point(char moji_A,char moji_B,char *pt){
int i;
int point_A=0;
int point_B=0;

for(i=0;i<64;i++){
	if(*pt==moji_A){
		point_A++;
	}else if(*pt==moji_B){
		point_B++;
	}
	pt++;
}
printf("\r\nResult: %c(%d) %c(%d)\r\n",moji_A,point_A,moji_B,point_B);
if(point_A>point_B){
	printf("%c Is Winner!\r\n\r\n",moji_A);
}else if(point_A<point_B){
	printf("%c Is Winner!\r\n\r\n",moji_B);
}else{
	printf("Same Point!\r\n\r\n");
}
}


int try_set(char moji,char *pt,int x,int y){
char *pt2;
int i,j;
int reverse_num=0;
char ban[8][8];
pt2=pt;

//配列に一時的に入れる(便宜上)
for(i=0;i<8;i++){
	for(j=0;j<8;j++){
		ban[i][j]=*pt;
		pt++;
	}
}

//すでに置いてあるかの確認
if(ban[x][y]!='0'){
	return 0;
}

//縦方向の判断
i=x;
while(i>=0){
	i--;
	if(ban[i][y]=='0'){
		break;
	}else if(ban[i][y]==moji){
		for(i++;i<x;i++){
			ban[i][y]=moji;
			reverse_num++;
		}
		break;
	}
}

i=x;
while(i<8){
	i++;
	if(ban[i][y]=='0'){
		break;
	}else if(ban[i][y]==moji){
		for(i--;i>x;i--){
			ban[i][y]=moji;
			reverse_num++;
		}
		break;
	}
}
//横方向の判断
i=y;
while(i>=0){
	i--;
	if(ban[x][i]=='0'){
		break;
	}else if(ban[x][i]==moji){
		for(i++;i<y;i++){
			ban[x][i]=moji;
			reverse_num++;
		}
		break;
	}
}

i=y;
while(i<8){
	i++;
	if(ban[x][i]=='0'){
		break;
	}else if(ban[x][i]==moji){
		for(i--;i>y;i--){
			ban[x][i]=moji;
			reverse_num++;
		}
		break;
	}
}
//左斜め上方向の判断
i=x;
j=y;
while(i>=0&&j>=0){
	i--;
	j--;
	if(ban[i][j]=='0'){
		break;
	}else if(ban[i][j]==moji){
		for(i++,j++;i<x;i++,j++){
			ban[i][j]=moji;
			reverse_num++;
		}
		break;
	}
}

i=x;
j=y;
while(i<8&&j<8){
	i++;
	j++;
	if(ban[i][j]=='0'){
		break;
	}else if(ban[i][j]==moji){
		for(i--,j--;i>x;i--,j--){
			ban[i][j]=moji;
			reverse_num++;
		}
		break;
	}
}

//右斜め上方向の判断
i=x;
j=y;
while(i<8&&j>=0){
	i++;
	j--;
	if(ban[i][j]=='0'){
		break;
	}else if(ban[i][j]==moji){
		for(i--,j++;i>x;i--,j++){
			ban[i][j]=moji;
			reverse_num++;
		}
		break;
	}
}

i=x;
j=y;
while(i>=0&&j<8){
	i--;
	j++;
	if(ban[i][j]=='0'){
		break;
	}else if(ban[i][j]==moji){
		for(i++,j--;i<x;i++,j--){
			ban[i][j]=moji;
			reverse_num++;
		}
		break;
	}
}

return reverse_num;
}




int reverse(char moji,char *pt,int x,int y){
char *pt2;
int i,j;
int reverse_num=0;
char ban[8][8];
pt2=pt;

//配列に一時的に入れる(便宜上)
for(i=0;i<8;i++){
	for(j=0;j<8;j++){
		ban[i][j]=*pt;
		pt++;
	}
}

//縦方向の判断
i=x;
while(i>=0){
	i--;
	if(ban[i][y]=='0'){
		break;
	}else if(ban[i][y]==moji){
		for(i++;i<x;i++){
			ban[i][y]=moji;
			reverse_num++;
		}
		break;
	}
}

i=x;
while(i<8){
	i++;
	if(ban[i][y]=='0'){
		break;
	}else if(ban[i][y]==moji){
		for(i--;i>x;i--){
			ban[i][y]=moji;
			reverse_num++;
		}
		break;
	}
}
//横方向の判断
i=y;
while(i>=0){
	i--;
	if(ban[x][i]=='0'){
		break;
	}else if(ban[x][i]==moji){
		for(i++;i<y;i++){
			ban[x][i]=moji;
			reverse_num++;
		}
		break;
	}
}

i=y;
while(i<8){
	i++;
	if(ban[x][i]=='0'){
		break;
	}else if(ban[x][i]==moji){
		for(i--;i>y;i--){
			ban[x][i]=moji;
			reverse_num++;
		}
		break;
	}
}
//左斜め上方向の判断
i=x;
j=y;
while(i>=0&&j>=0){
	i--;
	j--;
	if(ban[i][j]=='0'){
		break;
	}else if(ban[i][j]==moji){
		for(i++,j++;i<x;i++,j++){
			ban[i][j]=moji;
			reverse_num++;
		}
		break;
	}
}

i=x;
j=y;
while(i<8&&j<8){
	i++;
	j++;
	if(ban[i][j]=='0'){
		break;
	}else if(ban[i][j]==moji){
		for(i--,j--;i>x;i--,j--){
			ban[i][j]=moji;
			reverse_num++;
		}
		break;
	}
}

//右斜め上方向の判断
i=x;
j=y;
while(i<8&&j>=0){
	i++;
	j--;
	if(ban[i][j]=='0'){
		break;
	}else if(ban[i][j]==moji){
		for(i--,j++;i>x;i--,j++){
			ban[i][j]=moji;
			reverse_num++;
		}
		break;
	}
}

i=x;
j=y;
while(i>=0&&j<8){
	i--;
	j++;
	if(ban[i][j]=='0'){
		break;
	}else if(ban[i][j]==moji){
		for(i++,j--;i<x;i++,j--){
			ban[i][j]=moji;
			reverse_num++;
		}
		break;
	}
}


//ptに変更値を格納
for(i=0;i<8;i++){
	for(j=0;j<8;j++){
		*pt2=ban[i][j];
		pt2++;
	}
}
/*
printf("<check>\r\n");
for(i=0;i<8;i++){
	for(j=0;j<8;j++){
		printf("%c ",ban[i][j]);
	}
	printf("\r\n");
}
printf("</check>\r\n\r\n");
*/

return reverse_num;
}


int set(char moji,char *pt,int x,int y){
int num;
char *pt2;
pt2=pt;

if(try_set(moji,pt,x,y)>=1){
	for(num=0;num<x*8+y;num++){
		pt++;
	}
	*pt=moji;
	reverse(moji,pt2,x,y);
	return 0;
}else{
	printf("\r\nERROR1\r\n");
	return -1;
}
}







●AI_EASY.c●
<stdio.h>
"func.h"

ai_easy(char moji,char *pt,int turn){
int x,y;
int i,j;
char *pt2;
char ban[8][8];
pt2=pt;

//配列に入れて整理 以降pt2使用
for(i=0;i<8;i++){
	for(j=0;j<8;j++){
		ban[i][j]=*pt;
		pt++;
	}
}

for(i=0;i<8;i++){
	for(j=0;j<8;j++){
		if(try_set(moji,pt2,i,j)!=0){
			if(set(moji,pt2,i,j)==-1){
				return -1;
			}else{
				return 0;
			}
		}
	}
}
return -1;
}

ai_max(char moji,char *pt,int turn){
int x,y;
int i,j;
char *pt2;
char ban[8][8];
int max_point=0;
pt2=pt;

//配列に入れて整理 以降pt2使用
for(i=0;i<8;i++){
	for(j=0;j<8;j++){
		ban[i][j]=*pt;
		pt++;
	}
}

for(i=0;i<8;i++){
	for(j=0;j<8;j++){
		if(try_set(moji,pt2,i,j)>max_point){
			max_point=try_set(moji,pt2,i,j);
			x=i;
			y=j;
		}	
	}
}
if(max_point==0){
	return -1;
}else{
	set(moji,pt2,x,y);
	return 0;
}
}

manual_set(char moji,char *pt,int turn){
int x,y;
print(pt);
printf("%cのターンです!>x y\r\n",moji);
scanf("%d %d",&x,&y);
if(set(moji,pt,x,y)==-1){
	return -1;
}else{
	return 0;
}
}
●turn_a.c●
<stdio.h>
"func.h"

TRUN_A(char moji,char *pt,int turn){

}

●turn_b.c●
<stdio.h>
"func.h"

TRUN_B(char moji,char *pt,int turn){

}
最終更新:2011年03月18日 08:29