#include using namespace std; // ボタンIDとハンドル #define BUTTON_ID0 0 #define BUTTON_ID1 1 #define BUTTON_ID2 2 #define BUTTON_ID3 3 #define BUTTON_ID4 4 #define BUTTON_ID5 5 #define BUTTON_ID6 6 #define BUTTON_ID7 7 #define BUTTON_ID8 8 #define BUTTON_ID9 9 #define BUTTON_ID10 10 #define BUTTON_ID11 11 // \e HWND hbtn[12]; // カレントステート #define MENU 0 #define GAME 1 #define PLAY 2 int cs = MENU; // 汎用選手情報 #define WHITE 0 // 何もない枡 #define PL1 1 // 1P #define PL2 2 // 2P #define PL3 3 // 3P #define PL4 4 // 4P // 升目クラス struct cellclass{ int cinfo; // 升目情報を格納 HRGN hrgn; // 対応するリージョンのハンドル cellclass(){ cinfo=WHITE; hrgn=NULL; } }; // 対戦の種類 #define PL 0 // 対人 #define CP 1 // 対CP弱 #define CP2 2 // 対CP弱ダブル #define CP3 3 // 対CP弱トリプル // 終了情報 #define NOT 0 // 終わっていない #define WIN 1 // 勝ちか負け #define NOGAME 2 // 引き分け // 試合情報クラス struct gameinfo{ int mode; // 対戦の種類 int member; // プレイヤーの人数 int first; // 試合の先手 bool isplay; // 試合が始まっているか int now; // 現在の手番 int end; // 終了監視用 cellclass cell[10][10]; cellclass *plastc; // 最新の手のクラスを格納 gameinfo(){ srand((unsigned)time(NULL)); isplay=FALSE; end=NOT; plastc=NULL;} }game; int JudgeEnd() // 終了判定関数 { cellclass *p, *cp=&game.cell[0][0]; // 便宜用ポインタと基準 for(int i=0; i<6; i++){ // まずは横列の揃いを探す for(int j=0; j<10; j++){ // 60の枡を順に見ていく p = cp+i*10+j; if(!(p->cinfo)) ; // 対象が白でなく else if(!((p->cinfo)==((p+10)->cinfo))) ; // 隣が同じで else if(!(((p+10)->cinfo)==((p+20)->cinfo))) ; // その隣が同じで else if(!(((p+20)->cinfo)==((p+30)->cinfo))) ; // 更に隣が同じで else if(!(((p+30)->cinfo)==((p+40)->cinfo))) ; // これが通れば else return WIN; // 五つ揃ったとみなし終了を返す }} for(int i=0; i<10; i++){ // 次は縦列の揃いを探す for(int j=0; j<6; j++){ // これも全部で60 p = cp+i*10+j; if(!(p->cinfo)) ; // 対象が白でなく else if(!((p->cinfo)==((p+1)->cinfo))) ; // 上が同じで else if(!(((p+1)->cinfo)==((p+2)->cinfo))) ; // その上が同じで else if(!(((p+2)->cinfo)==((p+3)->cinfo))) ; // 更に上が同じで else if(!(((p+3)->cinfo)==((p+4)->cinfo))) ; // これが通れば else return WIN; // 五つ揃ったとみなし終了を返す }} for(int i=0; i<6; i++){ // 次は左上から右下への斜めの揃いを探す for(int j=4; j<10; j++){ // 全36通りを見る p = cp+i*10+j; if(!(p->cinfo)) ; // 対象が白でなく else if(!((p->cinfo)==((p+9)->cinfo))) ; // 右下が同じで(+10-1=+9) else if(!(((p+9)->cinfo)==((p+18)->cinfo))) ; // その右下が同じで else if(!(((p+18)->cinfo)==((p+27)->cinfo))) ; // 更に右下が同じで else if(!(((p+27)->cinfo)==((p+36)->cinfo))) ; // これが通れば else return WIN; // 五つ揃ったとみなし終了を返す }} for(int i=0; i<6; i++){ // 最後に左下から右上への揃いを探す for(int j=0; j<6; j++){ // やはり36通り。これで全192通りを見終える p = cp+i*10+j; if(!(p->cinfo)) ; // 対象が白でなく else if(!((p->cinfo)==((p+11)->cinfo))) ; // 右上が同じで(+10+1=+11) else if(!(((p+11)->cinfo)==((p+22)->cinfo))) ; // その右上が同じで else if(!(((p+22)->cinfo)==((p+33)->cinfo))) ; // 更に右上が同じで else if(!(((p+33)->cinfo)==((p+44)->cinfo))) ; // これが通れば else return WIN; // 五つ揃ったとみなし終了を返す }} // 引き分けの判定(全部埋まったら引き分け) p = cp; for(int i=0; i<100; i++,p++) if(!(p->cinfo)) return NOT; return NOGAME; } bool Computer() // cinfo,plastcを書き換え。手番を変え終了情報を格納。 { // 打ったらTRUE,打たなければFALSEを返す。 int line = -1; for(;0>line||9hrgn = CreateRectRgn(20+i*38, 240-j*25, (20+i*38)+28, (240-j*25)+20); }} // forループの終了 if(!(game.isplay)){ // プレイ中でなければ SetWindowText(hbtn[9], "色"); SetWindowText(hbtn[10], "戻"); lptstr = "0〜8 : スタート"; TextOut(hdc, 30, 315, lptstr, lstrlen(lptstr)); lptstr = "←えんい〜"; TextOut(hdc, 240, 315, lptstr, lstrlen(lptstr)); p = &game.cell[0][0]; for(int i=0; i<100; i++,p++){ // セル情報の初期化 hbrush = CreateSolidBrush(RGB(rand()%256,rand()%256,rand()%256)); FillRgn(hdc, p->hrgn, hbrush); // カラフルに DeleteObject(hbrush); p->cinfo = WHITE; } game.plastc = NULL; // 最新を指すポインタにヌルを代入 game.now = PL1; // 手番を先手へ } else { // プレイ中なら SetWindowText(hbtn[9], "9"); SetWindowText(hbtn[10], "崩"); p = &game.cell[0][0]; if(game.end==NOGAME) lptstr = "引き分けです"; else if(game.end==WIN) lptstr = game.now==PL1 ? "勝者:1P" : game.now==PL2 ? "勝者:2P" : game.now==PL3 ? "勝者:3P" : "勝者:4P"; else lptstr = game.now==PL1 ? "1Pの手番です" : game.now==PL2 ? "2Pの手番です" : game.now==PL3 ? "3Pの手番です" : "4Pの手番です"; TextOut(hdc, 30, 315, lptstr, lstrlen(lptstr)); p = &game.cell[0][0]; for(int i=0; i<100; i++,p++){ // 盤面の描画 if(p->cinfo!=WHITE){ // 白でなければ switch(p->cinfo){ case PL1: hbrush=CreateSolidBrush(RGB(0,0xff,0)); break; case PL2: hbrush=CreateSolidBrush(RGB(0,0,0xff)); break; case PL3: hbrush=CreateSolidBrush(RGB(0xff,0,0)); break; case PL4: hbrush=CreateSolidBrush(RGB(0x99,0x99,0x99)); } FillRgn(hdc, p->hrgn, hbrush); // 取得したブラシで塗って DeleteObject(hbrush); // あぼーん } } if(game.plastc!=NULL){ // ヌルでなければ switch(game.plastc->cinfo){ case PL1: hbrush=CreateSolidBrush(RGB(0,0x66,0xff)); break; case PL2: hbrush=CreateSolidBrush(RGB(0xff,0,0x66)); break; case PL3: hbrush=CreateSolidBrush(RGB(0x66,0xff,0)); break; case PL4: hbrush=CreateSolidBrush(RGB(0,0,0)); } FrameRgn(hdc, game.plastc->hrgn, hbrush, 2,2); // フレームを DeleteObject(hbrush); // 最新のますに描く } } EndPaint(hwnd, &ps); p = &game.cell[0][0]; for(int i=0; i<100; i++,p++) // オリジナルのGDIObjectはDeleteしる DeleteObject(p->hrgn); return 0; } return 0; } LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) // プロシージャ { switch(cs){ // カレントステートで分岐 case MENU: // メニューか WndProcMenu(hwnd, msg, wp, lp); break; case GAME: // 五箱ゲームなのか WndProcGame(hwnd, msg, wp, lp); break; case PLAY: WndProcPlay(hwnd, msg, wp, lp); } return DefWindowProc(hwnd, msg, wp, lp); } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR lpCmdLine, int nCmdShow ) { WNDCLASS winc; MSG msg; winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = WndProc; winc.cbClsExtra = winc.cbWndExtra = 0; winc.hInstance = hInstance; winc.hIcon = LoadIcon(NULL , IDI_APPLICATION); winc.hCursor = LoadCursor(NULL , IDC_ARROW); winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = TEXT("winc"); if (!RegisterClass(&winc)) return -1; HWND hwnd = CreateWindow(TEXT("winc"), TEXT("API ex"), WS_OVERLAPPED | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 420, 400, NULL, NULL, hInstance, NULL); if(hwnd==NULL) return -1; hbtn[0] = CreateWindow(TEXT("BUTTON"), TEXT("0"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 20, 280, 28, 28, hwnd, (HMENU)BUTTON_ID0, hInstance, NULL); hbtn[1] = CreateWindow(TEXT("BUTTON"), TEXT("1"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 58, 280, 28, 28, hwnd, (HMENU)BUTTON_ID1, hInstance, NULL); hbtn[2] = CreateWindow(TEXT("BUTTON"), TEXT("2"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 96, 280, 28, 28, hwnd, (HMENU)BUTTON_ID2, hInstance, NULL); hbtn[3] = CreateWindow(TEXT("BUTTON"), TEXT("3"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 134, 280, 28, 28, hwnd, (HMENU)BUTTON_ID3, hInstance, NULL); hbtn[4] = CreateWindow(TEXT("BUTTON"), TEXT("4"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 172, 280, 28, 28, hwnd, (HMENU)BUTTON_ID4, hInstance, NULL); hbtn[5] = CreateWindow(TEXT("BUTTON"), TEXT("5"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 210, 280, 28, 28, hwnd, (HMENU)BUTTON_ID5, hInstance, NULL); hbtn[6] = CreateWindow(TEXT("BUTTON"), TEXT("6"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 248, 280, 28, 28, hwnd, (HMENU)BUTTON_ID6, hInstance, NULL); hbtn[7] = CreateWindow(TEXT("BUTTON"), TEXT("7"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 286, 280, 28, 28, hwnd, (HMENU)BUTTON_ID7, hInstance, NULL); hbtn[8] = CreateWindow(TEXT("BUTTON"), TEXT("8"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 324, 280, 28, 28, hwnd, (HMENU)BUTTON_ID8, hInstance, NULL); hbtn[9] = CreateWindow(TEXT("BUTTON"), TEXT("9"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 362, 280, 28, 28, hwnd, (HMENU)BUTTON_ID9, hInstance, NULL); hbtn[10] = CreateWindow(TEXT("BUTTON"), TEXT("?"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 172, 310, 28, 28, hwnd, (HMENU)BUTTON_ID10, hInstance, NULL); hbtn[11] = CreateWindow(TEXT("BUTTON"), TEXT("\\e"), WS_CHILD | WS_VISIBLE | BS_DEFPUSHBUTTON, 210, 310, 28, 28, hwnd, (HMENU)BUTTON_ID11, hInstance, NULL); while(GetMessage(&msg, NULL, 0, 0)) DispatchMessage(&msg); return msg.wParam; }