オセロプログラム ~7行のC言語で書くコンピュータ対局~

タイトル:オセロプログラム ~7行のC言語で書くコンピュータ対局~

このサイトでは、C言語でのオセロ(リバーシ)のプログラム開発方法を解りやすく説明しています。初級者、初心者でも作れるオセロ実装のコツが満載です。

2ちゃんねるで「七行プログラミング※1」というものが2001年ごろから行われていました。
その中でオセロの実装(人工知能部分も含む)がありましたので参考に紹介します。

※1 ルールとしては、7行×79文字なら言語は問わないとの事です。

7行で書いたオセロのプログラム

#include <stdio.h>
int p,t,a,d,c,v,i,m[90]={0},s,r[]={-10,-9,-8,-1,1,8,9,10};void k(){if(m[p]==0)
for(i=0;i<8;i++){for(c=0,v=p+r[i];m[v]==3-t;v+=r[i])c++;if(c&&m[v]==t){a+=c;v=
p;if(d)do m[v]=t,v+=r[i];while(m[v]!=t);}}}char*h=" - o x\n";int main(){for(i=
1,m[41]=m[49]=2;i<10;m[i++*9]=3)m[40]=m[50]=t=s=1;for(;;a=d=0){for(p=9;p<82;++
p)k(),printf("%.2s",&h[m[p]*2]);if(a)for(d=a=s=p=8;a==8;k())t-2?(scanf("%d %d"
,&p,&i),p+=i*9):++p;else if(s)s=0,printf("pass");else break;t=3-t;}return 0;}

プログラムの使い方

  • 人間は o のコマを使います。
  • コマを置く場所は、座標(左から数える)で指定します

例)

$ ./a.out

 - - - - - - - -
 - - - - - - - -
 - - - - - - - -
 - - - o x - - -
 - - - x o - - -
 - - - - - - - -
 - - - - - - - -
 - - - - - - - -

5 3

 - - - - - - - -
 - - - - - - - -
 - - - - o - - -
 - - - o o - - -
 - - - x o - - -
 - - - - - - - -
 - - - - - - - -
 - - - - - - - -

 - - - - - - - -
 - - - - - - - -
 - - - x o - - -
 - - - x o - - -
 - - - x o - - -
 - - - - - - - -
 - - - - - - - -
 - - - - - - - -

整形したソースコード

#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,
    map[90] = {0}, dir[]={-10, -9, -8, -1, 1, 8, 9, 10};

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[40] = map[50] = turn = pass = 1;
    
    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;
}

オススメ書籍

オセロに強くなりたい人は下記を読むことをお勧めします。

楽天市場で買う 楽天市場で買う 楽天市場で買う 楽天市場で買う

オセロ(将棋等)のプログラムを開発したい人・ゲームプログラマーになりたい人は下記は持っていて損はないでしょう。

楽天市場で買う 楽天市場で買う 楽天市場で買う 楽天市場で買う

ページの先頭へ移動

このページの人気コンテンツ

    Copyright ©2024 .(since 2001/11/18)