/*  リバーシを作る第二回 2000/10/30 宍戸 輝光 */ #include #include typedef struct { int x,y,sc; } CSCORE; 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); int hyouka(BYTE,BYTE [][8]); 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,400,400, 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; char str[64]; 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); 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,max,nn=0; CSCORE sc[60],sc2[60]; BYTE byScore[8][8]; if (te(2)==0) return; for (i=0;i<8;i++) for (j=0;j<8;j++) if (byTemp[j][i]==1) { CopyMemory(byScore,byTemp,64); byScore[j][i]=2; sc[n].x=j; sc[n].y=i; sc[n].sc=hyouka(2,byScore); n++; } if (n<1) return; max=sc[0].sc; for (i=0;imax) max=sc[i].sc; nn=0; for (i=0;i7 || 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; } int hyouka(BYTE byA,BYTE ban[][8]) { int i,j,sc; BYTE byB; if (byA==1) byB=2; else byB=1; sc=0; for (i=1;i<7;i++) /* 端以外の部分の判定 */ for (j=0;j<7;j++) if (ban[j][i]==byA) sc++; else if (ban[j][i]==byB) sc--; for (i=1;i<7;i++) { /* 端1列の判定 */ if (ban[i][0]==byA) sc+=4; else if (ban[i][0]==byB) sc-=4; if (ban[i][7]==byA) sc+=4; else if (ban[i][7]==byB) sc-=4; if (ban[0][i]==byA) sc+=4; else if (ban[0][i]==byB) sc-=4; if (ban[7][i]==byA) sc+=4; else if (ban[7][i]==byB) sc-=4; } /* 四隅の判定 */ if (ban[0][0]==byA) sc+=64; else if (ban[0][0]==byB) sc-=64; if (ban[7][0]==byA) sc+=64; else if (ban[7][0]==byB) sc-=64; if (ban[7][7]==byA) sc+=64; else if (ban[7][7]==byB) sc-=64; if (ban[0][7]==byA) sc+=64; else if (ban[0][7]==byB) sc-=64; return sc; }