/*  リバーシを作る第一回 2000/ 9/13 宍戸 輝光 */ #include #include LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); void drawBoard(); int te(BYTE); int kanou(int,int,BYTE); int ren(int,int,int,int,BYTE); void put(int,int,BYTE); void comp(BYTE); HINSTANCE hInst; HWND hwMain; HBITMAP hBoard,hBack; HDC hdcBoard,hdcBack; BYTE byBoard[8][8],byTemp[8][8]; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){ MSG msg; WNDCLASSEX wndclass ; hInst=hInstance; /* プロセスのハンドルを保存 */ srand((unsigned)time(NULL)); wndclass.cbSize = sizeof(wndclass); wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = WndProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION); wndclass.hCursor = LoadCursor (NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = "CWindow"; wndclass.hIconSm = LoadIcon (NULL, IDI_APPLICATION); RegisterClassEx (&wndclass); hwMain = CreateWindow ("CWindow","色の度数分布表", WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,560,480, NULL,NULL,hInstance,NULL); ShowWindow (hwMain,iCmdShow); /* ウインドウを表示 */ UpdateWindow (hwMain); /* 再描画 */ while (GetMessage (&msg,NULL,0,0)) { /* メッセージループ */ TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; HBRUSH hBrh; PAINTSTRUCT ps; RECT rec={0,0,320,320}; int i,j,x,y; switch (iMsg) { case WM_CREATE: hBack=CreateCompatibleBitmap(GetDC(hwnd),320,320); hBoard=CreateCompatibleBitmap(GetDC(hwnd),320,320); hdcBack=CreateCompatibleDC(GetDC(hwnd)); hdcBoard=CreateCompatibleDC(GetDC(hwnd)); SelectObject(hdcBack,hBack); SelectObject(hdcBoard,hBoard); SelectObject(hdcBack,GetStockObject(BLACK_PEN)); hBrh=CreateSolidBrush(RGB(64,192,0)); FillRect(hdcBack,&rec,hBrh); DeleteObject(hBrh); for (i=0;i<9;i++) { MoveToEx(hdcBack,i*32+32,32,NULL); LineTo(hdcBack,i*32+32,288); MoveToEx(hdcBack,32,i*32+32,NULL); LineTo(hdcBack,288,i*32+32); } for (i=0;i<8;i++) for (j=0;j<8;j++) byBoard[j][i]=0; byBoard[3][4]=1; byBoard[4][3]=1; byBoard[3][3]=2; byBoard[4][4]=2; drawBoard(); return 0; case WM_LBUTTONDOWN: x=(LOWORD(lParam)-40)/32; y=(HIWORD(lParam)-40)/32; if (x<0 || x>7 || y<0 || y>7 || kanou(x,y,1)==0) return 0; put(x,y,1); drawBoard(); InvalidateRgn(hwnd,NULL,FALSE); UpdateWindow (hwnd); /* 再描画 */ Sleep(100); if (te(2)>0) comp(2); if (te(1)==0 && te(2)==0) { MessageBox(hwnd,"ゲーム終了","ゲーム終了",MB_OK); return 0; } while (te(1)==0) { MessageBox(hwnd,"パス","パス",MB_OK); comp(2); } return 0; case WM_PAINT: hdc=BeginPaint(hwnd,&ps); BitBlt(hdc,8,8,320,320,hdcBoard,0,0,SRCCOPY); EndPaint(hwnd,&ps); return 0; case WM_DESTROY : PostQuitMessage(0); return 0; } return DefWindowProc (hwnd, iMsg, wParam, lParam) ; } void comp(BYTE byA) { int i,j,n=0; POINT pt[60]; for (i=0;i<8;i++) for (j=0;j<8;j++) if (byTemp[j][i]==1) { pt[n].x=j; pt[n].y=i; n++; } if (n<1) return; n=rand() % n; put(pt[n].x,pt[n].y,2); drawBoard(); InvalidateRgn(hwMain,NULL,FALSE); UpdateWindow (hwMain); /* 再描画 */ } void drawBoard() { int i,j; BitBlt(hdcBoard,0,0,320,320,hdcBack,0,0,SRCCOPY); for (i=0;i<8;i++) for (j=0;j<8;j++) { if (byBoard[j][i]==1) SelectObject(hdcBoard,GetStockObject(BLACK_BRUSH)); else if (byBoard[j][i]==2) SelectObject(hdcBoard,GetStockObject(WHITE_BRUSH)); if (byBoard[j][i]!=0) Ellipse(hdcBoard,j*32+34,i*32+34,j*32+62,i*32+62); } } void put(int x,int y,BYTE byA) { /* コマを盤面に置く */ int i,j,k,n,nn=0,xx,yy; if (x<0 || x>7 || y<0 || y>7 || byBoard[x][y]!=0) return; /* 8方向のコマの繋がりを判定し、処理 */ for (i=-1;i<2;i++) for (j=-1;j<2;j++) { xx=x+j; yy=y+i; n=ren(x,y,j,i,byA); for (k=0;k0) /* ひっくり返せるならコマを置く */ byBoard[x][y]=byA; } int te(BYTE byA) { /* 可能な手を調べる */ int i,j,n=0; for (i=0;i<8;i++) for (j=0;j<8;j++) if (kanou(j,i,byA)>0) { byTemp[j][i]=1; n++; } else byTemp[j][i]=0; return n; } int kanou(int x,int y,BYTE byA) { /* (x,y)にコマを置けるか判定 */ int i,j,n=0; for (i=-1;i<2;i++) for (j=-1;j<2;j++) if (ren(x,y,j,i,byA)>0) return 1; return 0; } int ren(int x,int y,int dx,int dy,BYTE byA) { /* コマのつながりを調べる */ int xx,yy,n=0; BYTE byB; if (byA==1) byB=2; else byB=1; xx=x+dx; yy=y+dy; if (xx<0 || xx>7 || yy<0 || yy>7 || (dx==0 && dy==0) || byBoard[x][y]!=0 || byBoard[xx][yy]!=byB) return 0; while (xx>=0 && xx<8 && yy>=0 && yy<8 && byBoard[xx][yy]==byB) { xx+=dx; yy+=dy; n++; } if (xx>=0 && xx<8 && yy>=0 && yy<8 && byBoard[xx][yy]==byA) return n; else return 0; }