囲碁のゲームを作っているのですが...

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
AI

囲碁のゲームを作っているのですが...

#1

投稿記事 by AI » 16年前

囲碁のゲームを作っているのですが、先行と後攻の2人でゲームを作るように

int siro();
int kuro();
int cnt=1;
int q;
short chk_flg=1;
int kari[17][17]={0};
char m[3][3]={"+","○","●"};
char k[6],l[6];
void main(void)
{
int i,j,a=0,b,c;
printf(" 0 1 2 3 4 5 6 7 8 9 101112131415\n");
printf(" __________________________________\n");
for(i=0;i<16;i++){
printf("%2d",i);
printf(" |");
for(j=0;j<16;j++){
printf("%s",m[kari[j]]);
}
printf("|\n");

}

printf("  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\n");
while(a!=1){

kari[j]=kuro();
printf("\n\n");
printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n");
printf(" _________________________________________________\n");
for(i=0;i<16;i++){
printf("%2d",i);
printf("|");
for(j=0;j<16;j++){
printf(" %s",m[kari[j]]);
}
printf(" |\n");

}
printf("  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\n");

kari[j]=siro();
printf("\n\n");
printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n");

printf(" _________________________________________________\n");
for(i=0;i<16;i++){
printf("%2d",i);
printf("|");
for(j=0;j<16;j++){
printf(" %s",m[kari[j]]);
}
printf(" |\n");
}
printf("  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\n");
cnt++;
}
printf("お疲れ様でした。\n");
}

int siro()
{
int i,j,a,b,c,o,u,y=0;
printf("\n%d回目 後攻の番\n",cnt);
printf("縦 ");
rewind(stdin);
gets(k);
o=strlen(k);

for(q=0;q<o;q++){
if(isalpha(k[q])){
chk_flg=0;
}else{
chk_flg=1;
}
}

while(o==0 || chk_flg==0){
printf("\n数値を入れてください1\n");
rewind(stdin);
gets(k);
o=strlen(k);
for(i=0;i<o;i++){
if(isalpha(k[q])){
chk_flg=0;
}else{
chk_flg=1;
}
}
}
printf("横 ");
rewind(stdin);
gets(l);
u=strlen(l);
for(q=0;q<u;q++){
if(isalpha(l[q])){
chk_flg=0;
}else{
chk_flg=1;
}
}

while(u==0 || chk_flg==0){
printf("\n数値を入れてください2\n");
rewind(stdin);
gets(l);
u=strlen(l);
for(q=0;q<u;q++){
if(isalpha(l[q])){
chk_flg=0;
}else{
chk_flg=1;
}
}
}
j=atoi(l);
i=atoi(k);
while(y!=1){
while(i>=16 || j>=16 ||i<0 || j<0){
printf("\n15までだっつーの!!\n");
printf("縦 ");
rewind(stdin);
gets(k);
o=strlen(k);
for(q=0;q<o;q++){
if(isalpha(k[q])){
chk_flg=0;
}else{
chk_flg=1;
}
}

while(o==0 || chk_flg==0){
printf("\n数値を入れてください3\n");
rewind(stdin);
gets(k);
o=strlen(k);
for(q=0;q<o;q++){
if(isalpha(k[q])){
chk_flg=0;
}else{
chk_flg=1;
}
}
}
printf("横 ");
rewind(stdin);
gets(l);
u=strlen(l);
for(q=0;q<u;q++){
if(isalpha(l[q])){
chk_flg=0;
}else{
chk_flg=1;
}
}
while(u==0 || chk_flg==0){
printf("\n数値を入れてください4\n");


このような感じに作って一応完成はしたのですが、先攻か後攻のどちらかに、
コンピュータの処理に任せて自動的にやり、一人でもゲームができるようにもしたいのですが
やり方が分かりません
どうやればできるか教えてください
どうかよろしくお願いしますm(_ _)m

バグ

Re:囲碁のゲームを作っているのですが...

#2

投稿記事 by バグ » 16年前

うーん、囲碁は自由度の高いゲームですから、AIの実装となると、これまた面倒で難しいのではないかと思います。将棋のAI並に難しいんじゃないかなぁ…

検索サイトで『囲碁 AI プログラム』なんかのキーワードで検索すると何かヒットするかもしれません。
あまり役に立てなくてごめんなさい。

YuO

Re:囲碁のゲームを作っているのですが...

#3

投稿記事 by YuO » 16年前

# 15路盤ってまた見ない大きさ……。6, 9と13,あと普通の19路盤は見たことがあるけれど

> やり方が分かりません
をバグさんのようにCPUプログラムの実装方法がわからないではなく,
もっと基本的な,片方をCPUに任せる方法自体がわからないと解釈します。
# 着手可能点をランダムに返す実装を用意しても,それを組み込む方法が解らない,という解釈。

入力部分をまずは別関数にして,戻り値を縦何線横何線という情報を持った構造体にします。
その状態で,現状と同様の実行がなされることを確認します。
# 正確にはパスしたかどうかも必要です。

次に,同じ型を持つCPUプログラムを作ります。
あとは,それぞれの関数を順繰りに呼び出します。
関数ポインタを使うと,人同士・CPU同士・人-CPU・CPU-人の組み合わせが柔軟に処理ができると思います。
# C++ならクラス化してしまうところですが。

たいちう

Re:囲碁のゲームを作っているのですが...

#4

投稿記事 by たいちう » 16年前

参考文献の紹介。
囲碁・将棋どころかオセロでもお腹一杯な私は、内容の保証はできません。

『コンピュータ囲碁の入門』
http://www.amazon.co.jp/dp/4320121503

閉鎖

“C言語何でも質問掲示板” へ戻る