#include "DxLib.h" #include #include /* boxの説明 box[n][m]にて      → 配列   [n]12345678 ↓[m]1  2 3 4 5 6 7 8 盤面の左上を(0,0)と表現するよりも(1,1)の方が感覚的にわかりやすいのでboxの0の行と列を使用していません */ //構造体 struct box{ int Color; //1なら黒 2なら白 0は何もなし bool checkFlag; //みたならTRUE bool clearFlag;//裏返すならTRUE int mark;//確認用 }; //プロトタイプ宣言 void init(box (*box)[9]); void field(int,int);//(黒,白,box) 初めてならスタート配置 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 // WinMain関数 Cの int main(){} int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { //////////////////DXライブラリを使う準備///////////////////// // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) return -1; // ウインドウで表示、グラフィックの描画先を裏画面にセット ChangeWindowMode(TRUE),DxLib_Init(),SetDrawScreen( DX_SCREEN_BACK ); // 画面モードの設定 SetGraphMode( 640 , 480 , 16 ) ; /////////////////////////////変数宣言、初期化/////////////////////////// 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 =0; box[n][m].clearFlag=0; } } init(box); ////////////////////////////// メインルーチン///////////////////////////////////////(ルーチンってなんだ) while( 1 ) { // 画面を初期化(真っ黒にする) ClearDrawScreen(); //フラグの初期化 for(n=0;n<=8;n++){// for(m=0;m<=8;m++){ box[n][m].checkFlag=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(box[n][m].mark==1)DrawCircle( 80 - 30 + n*60 , m*60 - 30 , 10 , GREEN, 1 ); } } //クリックがあったら駒を置く関数へ if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){ locate(box,turn); turn= 2-(turn/2);//1の時2へ 2の時1へプレイヤー変更 } //////////////////DXライブラリにおける大切な処理///////////////////// // もしESCキーが押されていたらループから抜ける if( CheckHitKey( KEY_INPUT_ESCAPE) ) break ; // 裏画面の内容を表画面にコピーする ScreenFlip() ; //少し待つ(本来は使うべきではないwaittimer関数→パソコンの更新に合わせて待つ時間を変更する必要があるが今回は省略) WaitTimer(50); // Windows 特有の面倒な処理をDXライブラリにやらせる // -1 が返ってきたらループを抜ける if( ProcessMessage() < 0 ) break ; ///////////////////////////////////////////////////////////////// } // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; } //盤を書く関数 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){ //マウスがクリックされたれたらその場所を保存 if( ( GetMouseInput() & MOUSE_INPUT_LEFT ) != 0 ){ GetMousePoint( &MouseX , &MouseY ) ; //そこが画面内だったら 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 &&reverse(box,turn,n,m)){ //裏返せるなら box[n][m].Color=turn; ok=FALSE; } } } } } } //裏返す関数 bool reverse(box(*box)[9],int turn,int n,int m){ bool boo=FALSE; 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==1 && box[n][m].Color==(2-(turn/2))){ boo=TRUE; box[n][m].mark=1; box[n][m].clearFlag=0; 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=1; 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=1; } if(box[n+x][m+y].clearFlag==1 && box[n][m].checkFlag==1){//戻る時にチェックフラグが付いていて先にクリアフラグがあればここもクリアフラグにする box[n][m].clearFlag=1; box[n][m].checkFlag=0; } } }