• 締切済み

Cでオセロゲームプログラム

Cでオセロゲームのプログラムを作ろうと思ってますが 下記のプログラムに構造体、2分木(ゲーム木)、リスト構造、ミンマックス法、バックトラック法等を含みたいのですが どのように書いていったらいいかわかりません。 どなたかわかる方いましたらよろしくお願いします。 #include <stdlib.h> #include <stdio.h> #define BOARD_SIZE 8 #define WALL '*' #define BLACK 'x' #define WHITE 'o' #define NONE ' ' char board[ BOARD_SIZE+2 ][ BOARD_SIZE+2 ] ; void board_initialize() { int i , j ; /* 周囲を壁で囲む */ for( i = 0 ; i < BOARD_SIZE+2 ; i++ ) { board[ 0 ][ i ] = WALL ; board[ BOARD_SIZE+1 ][ i ] = WALL ; board[ i ][ 0 ] = WALL ; board[ i ][ BOARD_SIZE+1 ] = WALL ; } /* 内部を何もない状態にする */ for( i = 1 ; i <= BOARD_SIZE ; i++ ) { for( j = 1 ; j <= BOARD_SIZE ; j++ ) { board[ i ][ j ] = NONE ; } } /* オセロの初期状態の配置 */ board[ BOARD_SIZE/2 ][ BOARD_SIZE/2 ] = WHITE ; board[ BOARD_SIZE/2+1 ][ BOARD_SIZE/2+1 ] = WHITE ; board[ BOARD_SIZE/2 ][ BOARD_SIZE/2+1 ] = BLACK ; board[ BOARD_SIZE/2+1 ][ BOARD_SIZE/2 ] = BLACK ; } void board_print() { int i , j ; printf( " " ) ; for( i = 1 ; i <= BOARD_SIZE ; i++ ) printf( "%2d" , i ) ; printf( "\n" ) ; for( j = 1 ; j <= BOARD_SIZE ; j++ ) { printf( "%2d:" , j ) ; for( i = 1 ; i <= BOARD_SIZE ; i++ ) { switch( board[ j ][ i ] ) { case WALL : printf( "■" ) ; break ; case BLACK : printf( "●" ) ; break ; case WHITE : printf( "○" ) ; break ; case NONE : printf( "+" ) ; break ; } } printf( "\n" ) ; } } int main(void) { board_initialize() ; board_print() ; }

みんなの回答

  • mindassass
  • ベストアンサー率23% (318/1337)
回答No.5

まず実質先制の 白のターンで考えると 白の場所を探す。 白の周囲の黒を探す。 その黒の直線上のに白or壁がなく空きがあること。 置ける場所がなかったらパス それを繰り返す。 リバーシは一手に対しての評価をゲーム中で行うのは非常に困難です。 処理面を考えると全通りから勝つ組み合わせを摘出し それ自体を評価値にし負けない手を選択するよう プログラムを新たに起こしたほうが良いかもしれません。

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

まずは、人対人の対戦ができるようにするのが第一段階でしょう。 次に、どこでもいいから、置けるところに置くというルーチンを作るのが第2段階。 で、評価関数を取り入れるのがその次の段階で、 おっしゃるような方法を取り入れるのは、さらにその後の段階かと思います。

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.3

オセロのプログラミングをするなら、バイブルと呼べる本が「思考ゲームプログラミング」(森田和郎 他、アスキー出版局)です。古い本なので図書館や古本屋で探してみてください。 手始めとして「ある盤面に対して、座標(x, y)に黒の石を置けるかどうかを判定する関数」は書けますか? これが全く見当がつかないようだと、オセロに取り組むにはまだちょっと早いと思われます。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

補足:参考リンク。 それぞれアルゴリズムが書かれているので、それを読んだだけでプログラム化できるだけの技量を持たないと応用できません。まず、アルゴリズム理解するところから始めましょう。次にサンプルプログラムをネット探して動きをデバッガなどで追って理解すること。理解したと思ったら何も見ずに自力でプログラム化、それが出来たらオセロへの応用です。 ・2分木(ゲーム木) http://ja.wikipedia.org/wiki/%E3%82%B2%E3%83%BC%E3%83%A0%E6%9C%A8 ・リスト構造 http://ja.wikipedia.org/wiki/%E9%80%A3%E7%B5%90%E3%83%AA%E3%82%B9%E3%83%88 ・バックトラック法。 http://ja.wikipedia.org/wiki/%E6%B7%B1%E3%81%95%E5%84%AA%E5%85%88%E6%8E%A2%E7%B4%A2 ・ミンマックス方は、ミニマックス法の間違いかな? http://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%8B%E3%83%9E%E3%83%83%E3%82%AF%E3%82%B9%E6%B3%95 ・アルファ・ベータ法 http://ja.wikipedia.org/wiki/%CE%91-%CE%B2%E6%B3%95

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

無理です。思考ルーチンの基本部分さえ書いていない状況では思考ルーチンそのものを丸々書いてくれって事になります。そのような依頼はここでは削除対象になります。まぁ、掲示板に掲載できるほど小さくも無いでしょうが。 「思考ルーチンの作り方が分らない」→「思考ルーチンの仕組みが分らない」→「そもそも思考ルーチンの仕様を箇条書きにも出来ない」ってことだと思うので、そこから始めてください。もし既に出来ているなら、書いてもらえますでしょうか? ・構造体。 基本仕様が決まらないとどのような情報を保持して良いかわからないので書けません。本人が決めるべきことです。 ・2分木(ゲーム木)、リスト構造、ミンマックス法、バックトラック法。 そいうテクニックの前に、もっと簡単な思考ルーチンから初めて発展させていくのが良いかと思います。挑戦は良いですが一度に挑戦しすぎです。 それぞれのサンプルプログラムはググれば沢山見つかりますので、それを参考にして自力でまずプログラムできる様になってからオセロの思考ルーチンに応用してください。

関連するQ&A

  • RPGゲームの簡単なプログラムを打ってみたんですがうまく表示されません

    RPGゲームの簡単な初歩的なサンプルプログラムを自分で打ってみたんですが、思った通りに表示されません。 以下のソースのどこかおかしいとこありますでしょうか。 #include<stdio.h> #include<windows.h> #define MAP_SIZE_Y 10 #define MAP_SIZE_X 10 int x = 4,y = 5; int j,i; int map[100][100] = { {1,1,1,1,1,1,1}, {1,0,0,3,0,0,1}, {1,0,0,0,0,0,1}, {1,0,2,0,2,0,1}, {1,0,0,0,0,0,1}, {1,1,1,1,1,1,1}, }; void DrawMap(){ for(j = 0; i < MAP_SIZE_Y; j++){ for(i = 0; i < MAP_SIZE_X; i++){ if(j == y && i == x){ printf("勇"); }else{ switch ( map[j][i]){ case 1: printf("■"); break; case 2: printf("兵"); break; case 3: printf("王"); break; default:printf(" "); break; } } } printf("\n"); } } void main(){ while(1) { system("cls"); DrawMap(); } }

  • c言語迷路問題!!!緊急

    以下のプログラム毎行一つずつ、コマンド書いてほしいです。地図大きから書いてないでず、他のコマンドよろしくお願いします、ありがとうございます。 #include <stdio.h> #define MAP_X 39 // X座標 #define MAP_Y 43 // Y座標 #define LOL 24 void map() ; // 地図 void cm() ; void trap() ; void map1() ; int ws[ LOL * MAP_X ] ; int wk[ MAP_X * MAP_Y ] = { }; int a = 1 ; char com ; int pz = 1599 ; int main( void ) { int flg = 1 ; map() ; while( flg != 0 ) { cm() ; switch( com ) { case 'w' : if( wk[ pz - 39 ] == 0 ) { wk[ pz - 39 ] = 2 ; wk[ pz ] = 0 ; pz -= 39 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 's' : if( wk[ pz + 39 ] == 0 ) { wk[ pz + 39 ] = 2 ; wk[ pz ] = 0 ; pz += 39 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'a' : if( wk[ pz - 1 ] == 0 ) { wk[ pz - 1 ] = 2 ; wk[ pz ] = 0 ; pz -= 1 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'd' : if( wk[ pz + 1 ] == 0 ) { wk[ pz + 1 ] = 2 ; wk[ pz ] = 0 ; pz += 1 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'j' : if( wk[ pz + 2 ] == 0 ) { wk[ pz + 2 ] = 4 ; wk[ pz ] = 0 ; pz += 2 ; map() ; } else { printf( "コマンド入力 : " ) ; } break ; case 'e' : printf( "GAME OVER\n" ) ; flg = 0 ; break ; } } } void map() { int i ; map1() ; for( i = 0 ; i < MAP_X * LOL ; i++ ) { if( ( i / MAP_X ) == a ) { printf( "\n" ) ; a++ ; } switch( ws[ i ] ) { case 1 : printf( "■" ) ; break ; case 2 : printf( "※" ) ; break ; case 3 : printf( "宝" ) ; break ; case 4 : printf( "☆" ) ; break ; case 5 : printf( "" ) ; break ; default : printf( " " ) ; break ; } } a = 1 ; printf( "\n" ) ; printf( "コマンド入力 : " ) ; } void map1() { int i ; for ( i = 0 ; i < (LOL * MAP_X) ; i++ ) { ws[i] = wk[i + (MAP_X * 19 ) ] ; } } void cm() { scanf( "%s" , &com ) ; }

  • プログラミングCの質問です

    現在10×10の市松模様を表示させるというプログラムを作成しています。 #define文、IF文、for文の使用、printfを使って■と□を表示させることが条件です。 間違っているところの指摘をお願いします。 #include <stdio.h> #define N 10 int main(void) { for( i=1 ; i<=N ; ++i ) { for( j=1 ; j<=N ; ++j ) } if( (i+j) % 2 ){ printf("■"); }else printf("□"); } printf("\n"); i++; } return 0; }

  • Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が

    Cプログラムで15パズルを作ってみたのですがうまく動作しません。何処が間違っているのかずっと考えているのですがいまだに解決策が見つかりません。ヒントでもいいのでお願します。 #include <stdio.h> int init(void); void show(void); int chk_cmp(void); char input(void); int move(char cmd); #define N 4 int panel[N][N] = { { 1, 2, 3, 4}, { 5, 6, 7, 8}, { 9, 10, 11, 0}, {13, 14, 15, 12} }; int x, y; int main(void) { printf("これは15パズルです。\n" "左上から右に向かって「1」から「15」が並ぶよう,\n" "「0」を動かしてください。\n" "操作はテンキーで行います。( 8(上),4(左),6(右),2(下) )\n"); if( !init() ) { printf("パネルの初期化に失敗しました。「0」のパネルがありません。\n"); return 1; } while(1) { show(); if( chk_cmp() ) { printf("完成です!\n"); break; } while(1) { if( move(input()) ) { break; } else { printf("そっちには動かせません。\n"); } } } return 0; } int init(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(panel[i][j]==0){ x=j; y=i; return 1; } } } return 0; } void show(void) { int i,j; printf("---------------\n"); for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ printf("%3d",panel[i][j]); } printf("\n"); } printf("---------------\n\n"); } int chk_cmp(void) { int i,j; for(i=0;i<=N-1;i++){ for(j=0;j<=N-1;j++){ if(i==N-1&&j==N-1){ if(panel[i][j]!=0){ return 0; } }else{ if(panel[i][j]!=N*i+j+1){ return 0; } } } } return 1; } char input(void) { int comand; while(1){ scanf("%d",&comand); if(comand==8||comand==4||comand==6||comand==2){ break; } printf("8(上),4(左),6(右),2(下)を入力してください。"); } return comand; } int move(char cmd) { int dx=0, dy=0; if(cmd==8){dy=-1;}//上 if(cmd==4){dx=-1;}//左 if(cmd==6){dx=1;}//右 if(cmd==2){dy=1;}//下 if(x+dx>=0&&x+dx<=N-1&&y+dy>=0&&y+dy<=N-1){ panel[y][x]==panel[y+dy][x+dx]; panel[y+dy][x+dx]==0; y+=dy; x+=dx; return 1; } else{return 0;} }

  • C言語の実行について、

    #include <stdio.h> #define N 2 void main(void) { int i ,j ; for( i=1 ; i <= N ; ++i) { for( j=i ; j < N+2 ; ++j) { printf("j=%d\n",j); } printf("i=%d\n",i); } } を実行すると、 j=1,j=2,j=3,i=1,j=2,j=3,i=2となったんですが、 どういった順序で行われているのでしょうか? よろしくお願いします。

  • Cプログラムがどうしても動きません

    Cを勉強中です。 年齢に-1が入力されるまで、名前、年齢、性別を聞くプログラムを作っているのですが、どうしてもうまく動きません。 具体的には、年齢を聞かれず、年齢?性別?_とまとめて表示されてしまいます。 ぜひともどこが間違っているか教えてください。お願いしますm(_ _)m #include<stdio.h> typedef struct{ char name[20]; int year; char sex[6]; }student; void read_data(int,student*); void write_data(int,student*); int main(void){ student data[10]; int i=0,j=0; do{ read_data(i,data); i++; }while(data[i-1].year!=-1); for(j=0;j<=i-1;j++){ write_data(j,data); } return 0; } void read_data(int i,student *data){ printf("%d人目\n",i); printf("名前?\n",i); scanf("%s\n",&(data[i].name)); printf("年齢?\n",i); scanf("%d\n",&(data[i].year)); printf("性別?\n",i); scanf("%s\n",&(data[i].sex)); return; } void write_data(int j,student *data){ printf("%d人目\t",j+1); printf("名前:%s",data[j].name); printf("年:%d",data[j].year); printf("性:%s",data[j].sex); return; }

  • Cのプログラムがどうしても動きません

    Cを勉強中なのですが、以下のプログラムがうまくいきません。 (studentは構造体で定義した型です。) iが0でない5の倍数の時にreallocでメモリを増やそうと思ったのですが、 「21行目」(reallocの行)で記述エラーを発見しました。 「lvalue」を付け忘れています。 と表示されます。 どこが間違っているのでしょうか?教えてくださいm(_ _)m #include<stdio.h> typedef struct{ char name[20]; int year; char sex[6]; }student; void read_data(int,student*); void write_data(int,student*); int main(void){ student data[5]; int i=0,j=0; do{ read_data(i,data); i++; if(i%5==0 && i!=0){ data=realloc(data,(sizeof(student))*(i+5)); } }while(data[i-1].year!=-1); } for(j=0;j<i-1;j++){ write_data(j,data); } free(heap); return 0; } void read_data(int i,student *data){ printf("%d人目\n",i); printf("名前?\n",i); scanf("%s",(data[i].name)); printf("年齢?\n",i); scanf("%d",&(data[i].year)); printf("性別?\n",i); scanf("%s",(data[i].sex)); return; } void write_data(int j,student *data){ printf("%d人目\t",j+1); printf("名前:%s\n",data[j].name); printf("年:%d\n",data[j].year); printf("性:%s\n",data[j].sex); return; }

  • C言語でのプログラム

    全対最短経路(フロイドのアルゴリズム)のプログラムを作成したんですが、以下のようなメッセージが出てしまい、どこが悪いのかさっぱりわかりません。どなたかご教授願えないでしょうか? <プログラム> #include<stdio.h> #define NC 999 /* It should be large enough. */ #define N 5 void floyd(int, int [][], int [][], int [][]); int W[N][N] = { { 0, 1, NC, 1, 5 }, { 9, 0, 3, 2, NC }, { NC, NC, 0, 4, NC }, { NC, NC, 2, 0, 3 }, { 3, NC, NC, NC, 0 }, }; int P[N][N]; int D[N][N]; main() { floyd(N, W, D, P); } void floyd(int n, int W[][], int D[][], int P[][]) { int i, j, k; for(i=0;i<n;i++){ for(j=0;j<n;j++){ P[i][j] = 0; } } for(i=0;i<n;i++){ for(j=0;j<n;j++){ D[i][j] = W[i][j]; } } for(k=0;k<n;k++){ for(i=0;i<n;j++){ for(j=0;j<n;j++){ if(D[i][k]+D[k][j]<D[i][j]){ P[i][j] = k; D[i][j] = D[i][k] + D[k][j]; } } } } printf("?nall pairs of the shortest pathes:?n"); for(i=0;i<n;i++){ for(j=0;j<n;j++){ printf("%3d ", D[i][j]); } printf("?n"); } printf("?n"); } <エラーメッセージ> In function `floyd': :30: error: invalid use of array with unspecified bounds :36: error: invalid use of array with unspecified bounds :43: error: invalid use of array with unspecified bounds :44: error: invalid use of array with unspecified bounds :45: error: invalid use of array with unspecified bounds :54: error: invalid use of array with unspecified bounds

  • C言語のプログラムをエクセルに書き込む方法

    C言語のプログラムをエクセルに書き込みたいのですが、自分が理解していないのか、上手にできません。 前、質問(No.421727)して、教えてもらったのですがソートプログラムの実行結果もおかしい感じです。 #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 void filewrite(int j,int i,int a[]); void main(void){ int min,s,t,i,j,k,a[N]; srand((unsigned int)time(NULL)); for(i=0;i<N;i++) a[i]=rand()%1000+1; for(j=0;j<i-1;j++){ min=a[j]; s=j; for(k=j+1;k<i;k++){ if(a[k]<min){ min=a[k]; s=k; } } t=a[j];a[j]=a[s];a[s]=t; if(j%100 == 99){ for(s=0;s<i;s++) printf("%d\t",a[s]); } filewrite(j,i,a); } } void filewrite(int j,int i,int a[]) { int s; FILE *fp; char name[15]; printf("\nfilename="); scanf("%s",name); if((fp=fopen(name,"w"))==NULL){ printf("\nCan't open the sourse file\n"); exit(1); } if(j%100 == 99){ for(s=0;s<i;s++) fprintf(fp,"%d\n",a[s]); fclose(fp); } } よろしくお願いします。

  • c言語 プログラム ピラミッド

    プログラミングについて教えてください プログラムは ピラミッドの図形をユーザーが指定した数字で正三角形の ピラミッドの段数を指定できるプログラムです 例えば「5」と打てば ********* ■ ********■■■ ******■■■■■ ****■■■■■■■ **■■■■■■■■■ このような感じに表示されます *の部分は空白です #include<stdio.h> int main (void) { int num,i,j,h; printf("ピラミッドの高さを入力してください : "); scanf("%d" ,&num); for(i=1; i<=num; i++){ for(j=num; j>=i+1; j--){ printf(" ",j); } for(h=1; h<=j; h++){ printf("■"); } printf("\n"); } return 0; } ここまで出来ています、詰まっているのでご教授ください よろしくお願いします