#include "myWin.h" typedef struct{ int disk, from, to; }moveData; static int pHist, pHtimer; static HDC hBuff; static HBITMAP hBM; void crearBitmap(){ SelectObject(hBuff,GetStockObject(NULL_PEN)); PatBlt(hBuff,0, 0,1000,400,WHITENESS); } void initBitmap(HWND hw){ HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,1000,400); hBuff=CreateCompatibleDC(hdc); SelectObject(hBuff,hBM); crearBitmap(); ReleaseDC(hw,hdc); } void drawRectangle(int X1, int Y1, int X2, int Y2, int color){ HPEN pen=CreatePen(PS_SOLID, 1, 0); SelectObject(hBuff, pen); HBRUSH brush=CreateSolidBrush(color); SelectObject(hBuff, brush); Rectangle(hBuff,X1,Y1,X2,Y2); DeleteObject(brush);DeleteObject(pen); } void dspText(int X,int Y,TCHAR str[]){ HFONT hf=CreateFont(12,0,0,0,FW_NORMAL,FALSE, FALSE, FALSE, SHIFTJIS_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FIXED_PITCH|FF_MODERN, NULL); SelectObject(hBuff,hf); SetTextColor(hBuff,0); SetBkMode(hBuff,TRANSPARENT); TextOut(hBuff,X, Y, str,lstrlen(str)); } int blockColor[7]={0xFF77FF,0xFFFF,0xFF00,0xFF,0xFF5555,0xFFFF00,0xFF77FF}; #define NUM 4 #define MAX 50 typedef struct { int n; int block[NUM]; } State; typedef struct{ int from, to, No; } Move; State state[3],Hstate[MAX][NUM]; Move move[MAX]; void drawState(){ int DX=50,XST=20,DY=20,C;TCHAR str[256]; crearBitmap(); if(pHtimer==0) lstrcpy(str,TEXT("初期状態")); else wsprintf(str,TEXT("(%d) Move No.%d from %d to %d"), pHtimer, move[pHtimer].No, move[pHtimer].from,move[pHtimer].to); dspText(20, 20 ,str); for(int i=0;i<3;i++){ int N=Hstate[pHtimer][i].n; XST+=DX; int YED=NUM*30+100; for(int j=0;j=pHist) pHtimer=0; else pHtimer++; drawState(); InvalidateRect(hw,NULL,TRUE); } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ pHtimer=0; drawState(); InvalidateRect(hw,NULL,FALSE); SetTimer(hw,1,1000, NULL); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ MoveWindow(hw,0,0,300,NUM*80,TRUE); SetWindowText(hw,TEXT("積み木問題")); initBitmap(hw); pHist=search(); procLButtonDown(hw,wp,lp); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); BitBlt(hdc, 0,0,1000,400,hBuff,0,0,SRCCOPY); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){ switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate(hw,wp,lp) ; return 0; case WM_PAINT : procPaint(hw,wp,lp) ; return 0; case WM_TIMER : procTimer(hw,wp,lp) ; return 0; case WM_LBUTTONDOWN : procLButtonDown(hw,wp,lp) ; break; } return DefWindowProc(hw,msg,wp,lp); }