//構造体 struct box{ int Color; //1なら黒 2なら白 0は何もなし bool checkFlag; //みたならTRUE bool clearFlag;//裏返すならTRUE int mark;//確認用 }; //プロトタイプ宣言 void init(box (*box)[9]); void field(int,int);//盤を書く  void locate(box(*box)[9],int);//石を置く関数 bool reverse(box(*box)[9],int,int,int);//裏返す関数  int→(最後に置いた石の色,n,m) void revCheck(box(*box)[9],int,int,int,int,int);//裏返せるか判定 int→(置いた石の色,n,m,x,y) /////////////////////////////変数宣言、初期化/////////////////////////// int n,m; box box[9][9]; int turn=1;//1なら黒 2なら白のターン int BLACK=GetColor(0,0,0),WHITE=GetColor(255,255,255),GREEN=GetColor(0,255,0);//色の準備 for(n=0;n<=8;n++){ for(m=0;m<=8;m++){ box[n][m].Color =0; box[n][m].checkFlag =FALSE;//FALSE=0 box[n][m].clearFlag=0; } } //最初の石を置くためだけの関数 init(box); ////////////////////////////// メインルーチン内/////////////////////////////////////// // //フラグの初期化 for(n=0;n<=8;n++){// for(m=0;m<=8;m++){ box[n][m].checkFlag=FALSE;//FALSE=0 box[n][m].clearFlag=0; } } // //盤面の描写 field(BLACK,GREEN); // //box[n][m].Color==1か2なら、そこに黒・白の駒を描写する for(n=1;n<=8;n++){ for(m=1;m<=8;m++){ @ } } @if(box[n][m].Color==1){ DrawCircle( 80 - 30 + n*60 , m*60 - 30 , 25 , BLACK, 1 ); }else if(box[n][m].Color==2){ DrawCircle( 80 - 30 + n*60 , m*60 - 30 , 25 , WHITE, 1 ); } // //クリックがあったら駒を置く関数へ if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){ locate(box,turn); turn= 2-(turn/2);//1の時2へ 2の時1へプレイヤー変更 } // //////関数コーナー/////// //盤を書く関数 void field(int BLACK, int GREEN){ int n=0; //緑で塗りつぶし @ } // @ DrawBox( 80, 0 , 560, 480 ,GREEN, 1 ) ; //1辺60 左右80ずつ余白のある盤を書く for(n=0;n<=8;n++){//ヨコ DrawLine( 80+60*n,0 , 80+60*n , 480 ,BLACK); } for(n=0;n<=8;n++){//タテ DrawLine(80,n*60, 560 , n*60,BLACK ); } // //最初の4つを置くためだけの関数                 黒白 void init(box (*bo)[9]){                     白黒 bo[4][4].Color=1; bo[4][5].Color=2;  bo[5][4].Color=2; bo[5][5].Color=1; } // //駒を置く void locate(box (*box)[9],int turn){ int MouseX , MouseY ; int n,m; bool ok=TRUE; while(ok){//TRUEの間回り続ける A } } //                 A //マウスがクリックされたれたら if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){ //その座標を保存 GetMousePoint( &MouseX , &MouseY ) ; B } //                          B//その座標が画面内だったら for(n=1;n<=8;n++){//どのマスに入るか for(m=1;m<=8;m++){ if(MouseX>80+60*(n-1) && MouseX< 80+60*n &&MouseY>60*(m-1) &&MouseY<60*m &&box[n][m].Color==0 //D ){//+裏返せるなら box[n][m].Color=turn;//turnの色にする ok=FALSE;//ループから抜ける } } } // D&&reverse(box,turn,n,m) // //裏返す関数(丸コピでok) bool reverse(box(*box)[9],int turn,int n,int m){ bool boo=FALSE; //xとyで-1から1までの数値を組み合わせて縦横ななめをrevCheck関数内で見る for(int x=-1;x<=1 ;x++){ for(int y=-1;y<=1;y++){ if(!(x==0&&y==0)){ revCheck(box,turn,n,m,x,y); } } } //石の色が反対で(この条件不要かも)クリアフラグが立ってたら石を裏返す for(n=1;n<=8;n++){ for(m=1;m<=8;m++){ if(box[n][m].clearFlag==TRUE && box[n][m].Color==(2-(turn/2))){ boo=TRUE; box[n][m].mark=1; box[n][m].clearFlag=FALSE; box[n][m].Color=turn; } } } return boo; } //裏返せるかどうかの判定する関数 void revCheck(box(*box)[9],int turn,int n,int m,int x,int y){ if( (n+x<=8) && (m+y<=8)&&(n+x>=1) &&(m+y>=1) ){//配列以上にいかなければ //次にみる場所が置いた石と違う色ならチェックフラグ立てて再起関 if(box[n+x][m+y].Color==(2-turn/2)){ box[n+x][m+y].checkFlag=TRUE; revCheck(box,turn,n+x,m+y,x,y); //↑ではない場合で、今の場所が違う色の石で次にみる場所が置いた石と同じ=行き止まりだったら  ●●●○←これをみたら  }else if(box[n+x][m+y].Color==turn &&box[n][m].Color==(2-turn/2)){ box[n][m].clearFlag=TRUE; } //再起関数から戻る時に通る。この座標にチェックフラグがあり、再起関数で後にみたものにクリアフラグがあればここもクリアフラグ立てる if(box[n+x][m+y].clearFlag==1 && box[n][m].checkFlag==1){ box[n][m].clearFlag=TRUE; box[n][m].checkFlag=FALSE; } } }