オセロプログラムについて

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

オセロプログラムについて

#1

投稿記事 by ひーやん » 9年前

コード:

//
#include <stdio.h>
// map[90] = {0}
// 盤状態:横9*縦10 y*9+xと使う。0行目と9行目は番兵
// dir[]={-10, -9, -8, -1, 1, 8, 9, 10};
// 盤を走査する場合、縦横斜め方向に向かうために足されるべき数
int put, turn, all, done, pass, count, value, i;//変数あれこれ
int map[90] = {0};//盤
int dir[]={-10, -9, -8, -1, 1, 8, 9, 10};//8方向

void check()
{
    if (map[put] == 0)
        for (i=0; i<8; i++) {
            // 8方向走査
            // dir[i]の方向の相手のコマの数を確認
            for (count = 0, value = put+dir[i];
                 map[value] == 3-turn; value += dir[i])
                count++;
            
            if (count && map[value] == turn) {
                // 1枚以上存在し、その上端が自分のコマなら
                all += count;
                value  = put;
                
                // doneがtrueの場合は、実際にひっくり返す
                if (done)
                    do
                        map[value] = turn, value += dir[i];
                while (map[value] != turn);
            }
        }
}

// mapに対応するオセロ駒&改行
char *h=" - o x\n";

int main()
{
    // 0:コマ無し
    // 1:1player
    // 2:2player
    // 3:改行
    for(i=1, map[41] = map[49] = 2; i<10; map[i++*9] = 3)//map[41]=map[49]>>初期配置(黒)を設定 map[i++*9]=3>>一列ごとに改行
        map[40] = map[50] = turn = pass = 1;//map[40]=map[50]>>初期は位置(白)を設定
    
    for (;; all = done = 0) { // 毎回allとdoneを初期化(;;>>一度のみ)
        // 盤の表示
        for(put = 9; put<82; ++put)
            check(), printf("%.2s",&h[map[put]*2]);
        
        if(all)
            // 1枚でも駒が置けた場合はcomは左上から走査
            // 置けた(=allの値が変わった)らturn終了
            for(done = all = pass = put = 8; all==8; check())
                turn - 2 ? (scanf("%d %d",&put,&i), put+=i*9): ++put;
        
        else if(pass)
            // 駒は置けない
            pass=0,printf("pass");
        else
            // 両者とも駒を置けないので終了
            break;
        // turn交代
        turn = 3 - turn;
    }
    return 0;
}
現在強いオセロプログラムをつくりたいと思い、勉強しています。
オセロプログラムは上のプログラムとあわせて2種類つくったことがあります。
1種類は二次元配列を使ったわかりやすいものの長いプログラム
2種類目がこのプログラムです。
このプログラムはとても短くかけるためなんとか理解したいと思ったのですが
とても一人では疑問が多く、こちらで質問させていただくことにしました。

[質問]
1  

コード:

char *h=" - o x\n";
   これは4つ(改行も含め)の文字を宣言していると考えてよいのでしょうか。ポインタにする意味がわからないです。
2  変数のput,all,count,valueがよくわかりません。何のためにあるのか、どう変化するのか。
3  毎回allとdoneを初期化というのはゲーム一回ごとの話ですか?それとも一回のゲームで何度も行うのですか?
   またなぜ行うのですか?
4  mainの中にゲームのメインループが見つからないのですが。存在しますか?

低レベルな質問かもしれませんが回答・解説よろしくお願いします。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: オセロプログラムについて

#2

投稿記事 by h2so5 » 9年前

なぜ自分が作ったプログラムなのに理解できないのでしょうか。

ひーやん

Re: オセロプログラムについて

#3

投稿記事 by ひーやん » 9年前

1つ目はhttp://idehideout.fc2web.com/p/rev/00.html
2つ目はhttp://tricky-code.net/nicecode/code42oseroai.php
を参考にしました。
完全に書き忘れていました。すみません。
悪意とかそういうのは何もありません。ただ、忘れていました。

2つめのほうが短く済むと思ったので勉強しようと思ったのです。

実際にはこの問題を解決次第AIの仕組み、組み込み方を学びたいと考えています。

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

Re: オセロプログラムについて

#4

投稿記事 by h2so5 » 9年前

このコードは短く書くためにわかりやすさを犠牲にしたコードなので参考にしないほうがいいと思います。
良いコードではありません。

ひーやん

Re: オセロプログラムについて

#5

投稿記事 by ひーやん » 9年前

やはりそうですか。わかりました。わかりやすいほうのプログラムでやりたいと思います。
AIの組み込み方がわからないので新しいトピックで質問させていただきます。
回答ありがとうございました。

閉鎖

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