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
↓
X
/
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