1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

コンピュータとオセロ対戦2 ~ランダムに返す~

Last updated at Posted at 2021-09-06

前回の記事(普通にオセロ)

#今回の目標

オセロ対戦で、ランダムに打ち返してくるプログラムを作る

#ここから本編

基本的には前回とほぼ同じです。
mainだけ変えます。

##基本戦略

ランダムに打ち返すといっても簡単ではありません。
ランダムに決めた場所に常に置けるとは限らないからです。
つまり、 置ける場所の候補の中から 、ランダムで選ばなければなりません。
そのためには

  1. 盤面の一つ一つの場所を調べ、置ける場所を探す
  2. 置ける場所をメモしておく
  3. メモした場所からランダムに選ぶ

というステップが考えられます。
というかこれ、後々使います。
が、せっかくC言語使ってることですし楽しちゃいます。
ということで考えたのは、

  1. ランダムに場所を選ぶ
  2. そこがたまたま置けない位置だったら1に戻る、置けたら置く

です。
雑な方法ですが、C言語の速度なら一瞬で打ち返してきます。

##main

ほぼ前回と同じ。
boradが盤面、turnがターンです。
また、コンピュータとの対戦なので「黒」、「白」がそれぞれ「あなた」、「わたし」に変わっています。コンピュータ目線なので「あなた」がプレイヤーです。
先攻、後攻はここでは変えられません。
プレイヤーのターンは前回と同じ動作をします。
乱数を使っているのでtime.hは必須ですね。

random.c
int main(){
    int line, col;
    bool my_check = true, old_check = true;
    srand((unsigned int)time(NULL));

    // check_allで反転させられるので
    turn = false;
    setup();
    print();

    long now = time(NULL);
    while ((my_check = check_all()) || all_none()){
        if (turn) printf("\nあなたのターンです\n");
        else printf("\nわたしのターンです\n");
        if (my_check){
            if (turn){
                que(&line, &col);
                while (!check(line, col)){
                    printf("その位置には置けません\n");
                    que(&line, &col);
                }
                put(line, col);
            }else{
                line = rand() % SIZE + 1, col = rand() % SIZE + 1;
                while (!check(line, col)){
                    line = rand() % SIZE + 1, col = rand() % SIZE + 1;
                }
                printf("行: %d\n列: %d\n", line, col);
                put(line, col);
            }
        }else{
            printf("置ける場所がありません\n");
        }
        if (!my_check && !old_check) break;
        old_check = my_check;
    }

    printf("\n試合時間: %ld秒\n", time(NULL) - now);
    count();

    return 0;
}

#フルバージョン

この中のrandom.cです。

#実際にやってみる

強くはないですが、中盤で調子に乗って追いつめすぎると打てる手がなくなってきて負けたりします。
手加減しつつ戦うと勝てました。

#次回は

自分で考えて打ち返してもらいます。
一手先まで読んで打ち返すプログラムを考えます。
次回

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?