⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qipanfugai.cpp

📁 小弟今天上传几个程序想和大家交流一下,我十分想和大家学习点东西.棋盘覆盖
💻 CPP
字号:
#include<windows.h>
#include"resource.h"

int x1=89,x2=402;
int y1=91,y2=420;
int dx=39,dy=41;
int x,y;                             //画格
int grid[9][9];                      //从1开始
int i=0,j=0;                         //控制变量                           
HDC hdcmem;
HBITMAP hBm[5];
bool IsGiveT;
int Tr,Tl;                         //特殊行、列,从1开始
                      

void ChessBoard(int LR,int LL,int tr,int tl,int size);
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow)
{
	HWND hwnd;
	MSG Msg;
	WNDCLASS wndclass;
	char lpszClassName[]="棋盘覆盖";
	char lpszTitle[]="棋盘覆盖";

	wndclass.style=0;
	wndclass.lpfnWndProc=WndProc;
	wndclass.cbClsExtra=0;
	wndclass.cbWndExtra=0;
	wndclass.hInstance=hInstance;
	wndclass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
	wndclass.hCursor=LoadCursor(NULL,IDI_APPLICATION);
	wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
	wndclass.lpszMenuName=MAKEINTRESOURCE(IDM_MENU1);
	wndclass.lpszClassName=lpszClassName;

	if(!RegisterClass(&wndclass))
	{
		MessageBeep(0);
		return FALSE;
	}

	hwnd=CreateWindow(lpszClassName,
		              lpszTitle,
					  WS_OVERLAPPEDWINDOW|WS_POPUP,               //WS_OVERLAPPEDWINDOW最上顶蓝条      
					  400,
					  50,
                      500,
					  530,
					  NULL,
					  NULL,
					  hInstance,
					  NULL);

	hBm[0]=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP0));
    hBm[1]=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
    hBm[2]=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP2));
    hBm[3]=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP3));
	hBm[4]=LoadBitmap(hInstance,MAKEINTRESOURCE(IDB_BITMAP4));
	
	ShowWindow(hwnd,nCmdShow);
	UpdateWindow(hwnd);
	while(GetMessage(&Msg,NULL,0,0))
	{
		TranslateMessage(&Msg);
		DispatchMessage(&Msg);
	}
    
	return Msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message)
	{
		HDC hDC;
		HBRUSH hBrush;
		HPEN hPen;
		PAINTSTRUCT ps;

    case WM_CREATE:
		for(i=1;i<9;i++)
			for(j=1;j<9;j++)
			{
				grid[i][j]=0;
			}
			IsGiveT=0;
			hDC=GetDC(hwnd);
			hdcmem=CreateCompatibleDC(hDC);
			ReleaseDC(hwnd,hDC);
			break;

	case WM_PAINT:
         hDC=BeginPaint(hwnd,&ps);
         hPen=(HPEN)GetStockObject(BLACK_PEN);
         hBrush=CreateSolidBrush(RGB(20,150,200));
		 SelectObject(hDC,hPen);
		 SelectObject(hDC,hBrush);
		 Rectangle(hDC,x1,y1,x2,y2);                          //构造游戏场所
		 for(i=1;i<9;i++)
			for(j=1;j<9;j++)
			{
				grid[i][j]=0;
			}
		 for(y=y1+dy;y<=y2;)
		 {
			 MoveToEx(hDC,x1,y,NULL);
			 LineTo(hDC,x2,y);
			 y+=dy;
		 }
         for(x=x1+dx;x<=x2;)
		 {
			 MoveToEx(hDC,x,y1,NULL);
			 LineTo(hDC,x,y2);
			 x+=dx;
		 }
		 EndPaint(hwnd,&ps);
		 break;

	case WM_LBUTTONDOWN:
		if(!IsGiveT)
		{
            IsGiveT=1;
			GetMessagePos();                                                               //
		    hDC=GetDC(hwnd);
            if(LOWORD(lParam)<x2&&LOWORD(lParam)>x1&&HIWORD(lParam)<y2&&HIWORD(lParam)>y1) // 
			{
				i=(LOWORD(lParam)-x1)/dx;                            //从0开始                                        
			    j=(HIWORD(lParam)-y1)/dy;
				Tr=i+1;                                              //从1开始
				Tl=j+1;
			    SelectObject(hdcmem,hBm[0]);
			    BitBlt(hDC,(x1+i*dx)+1,(y1+j*dy)+1,dx-1,dy-1,hdcmem,0,0,SRCCOPY); 
			}
		    ReleaseDC(hwnd,hDC);
		}
		break;

	case WM_COMMAND:
		switch(LOWORD(wParam))
		{
		case IDM_CHESSBOARD:
            //
			if(IsGiveT)
			{
				hDC=GetDC(hwnd);
				ChessBoard(1,1,Tr,Tl,8);                           //LR=1,LL=1,tr=Tt,tl=Tl,size=8(2的k次方)
				for(i=1;i<9;i++)
					for(j=1;j<9;j++)
					{
						switch(grid[i][j])
						{
						case 0:
							break;
						case 1:
							SelectObject(hdcmem,hBm[1]);
			                BitBlt(hDC,(x1+(i-1)*dx)+1,(y1+(j-1)*dy)+1,dx-1,dy-1,hdcmem,0,0,SRCCOPY); 
							break;
						case 2:
							SelectObject(hdcmem,hBm[2]);
			                BitBlt(hDC,(x1+(i-1)*dx)+1,(y1+(j-1)*dy)+1,dx-1,dy-1,hdcmem,0,0,SRCCOPY); 
							break;
						case 3:
							SelectObject(hdcmem,hBm[3]);
			                BitBlt(hDC,(x1+(i-1)*dx)+1,(y1+(j-1)*dy)+1,dx-1,dy-1,hdcmem,0,0,SRCCOPY);
							break;
						case 4:
							SelectObject(hdcmem,hBm[4]);
			                BitBlt(hDC,(x1+(i-1)*dx)+1,(y1+(j-1)*dy)+1,dx-1,dy-1,hdcmem,0,0,SRCCOPY);
							break;
						default:
							break;
						}
					}
					ReleaseDC(hwnd,hDC);
			}
			else
				MessageBox(hwnd,"没给特殊格","警告",MB_OK);
			break;
		case IDM_RESET:
			if(IsGiveT)
			{
				InvalidateRect(hwnd,NULL,1);
				IsGiveT=0;
			}
			break;
		case IDM_STATE:
			hDC=GetDC(hwnd);
			SelectObject(hdcmem,hBm[0]);
			BitBlt(hDC,25,3,dx-1,dy-1,hdcmem,0,0,SRCCOPY);

			SelectObject(hdcmem,hBm[1]);
			BitBlt(hDC,50+dx,3,dx-1,dy-1,hdcmem,0,0,SRCCOPY);	
			BitBlt(hDC,50+2*dx,3,dx-1,dy-1,hdcmem,0,0,SRCCOPY);
			BitBlt(hDC,50+dx,3+dy,dx-1,dy-1,hdcmem,0,0,SRCCOPY);

			SelectObject(hdcmem,hBm[2]);
			BitBlt(hDC,75+3*dx,3,dx-1,dy-1,hdcmem,0,0,SRCCOPY);	
			BitBlt(hDC,75+4*dx,3,dx-1,dy-1,hdcmem,0,0,SRCCOPY);
			BitBlt(hDC,75+4*dx,3+dy,dx-1,dy-1,hdcmem,0,0,SRCCOPY);
			
			SelectObject(hdcmem,hBm[3]);
			BitBlt(hDC,100+5*dx,3,dx-1,dy-1,hdcmem,0,0,SRCCOPY);	
			BitBlt(hDC,100+5*dx,3+dy,dx-1,dy-1,hdcmem,0,0,SRCCOPY);
			BitBlt(hDC,100+6*dx,3+dy,dx-1,dy-1,hdcmem,0,0,SRCCOPY);

			SelectObject(hdcmem,hBm[4]);
			BitBlt(hDC,125+7*dx,3+dy,dx-1,dy-1,hdcmem,0,0,SRCCOPY);	
			BitBlt(hDC,125+8*dx,3+dy,dx-1,dy-1,hdcmem,0,0,SRCCOPY);
			BitBlt(hDC,125+8*dx,3,dx-1,dy-1,hdcmem,0,0,SRCCOPY);

			ReleaseDC(hwnd,hDC);
			break;
		}
		break;

	case WM_DESTROY:
		PostQuitMessage(0);
        break;
	default:
		return DefWindowProc(hwnd,message,wParam,lParam);
	}
	return(0);
}

void ChessBoard(int LR,int LL,int tr,int tl,int size)                 //LR   当前棋盘的左上角行
{                                                                     //LL   当前棋盘的左上角列
	if(size==1)                                                       //tr   当前棋盘中的特殊格行
		return;                                                       //tr   当前棋盘中的特殊格列
                                                                      //size 当前棋盘2的k次方               
	int s=size/2;

	if(tr<LR+s&&tl<LL+s)
	{
		grid[LR+s-1][LL+s]=4;
        grid[LR+s][LL+s-1]=4;
		grid[LR+s][LL+s]=4;
		ChessBoard(LR,LL,tr,tl,s);
        ChessBoard(LR,LL+s,LR+s-1,LL+s,s);
        ChessBoard(LR+s,LL,LR+s,LL+s-1,s);
		ChessBoard(LR+s,LL+s,LR+s,LL+s,s);
	}

	if(tr<LR+s&&tl>=LL+s)
	{
		grid[LR+s-1][LL+s-1]=3;
        grid[LR+s][LL+s-1]=3;
		grid[LR+s][LL+s]=3;
		ChessBoard(LR,LL+s,tr,tl,s);
        ChessBoard(LR,LL,LR+s-1,LL+s-1,s);
        ChessBoard(LR+s,LL,LR+s,LL+s-1,s);
		ChessBoard(LR+s,LL+s,LR+s,LL+s,s);
	}

	if(tr>=LR+s&&tl<LL+s)
	{
		grid[LR+s-1][LL+s-1]=2;
        grid[LR+s-1][LL+s]=2;
		grid[LR+s][LL+s]=2;
		ChessBoard(LR+s,LL,tr,tl,s);
        ChessBoard(LR,LL,LR+s-1,LL+s-1,s);
        ChessBoard(LR,LL+s,LR+s-1,LL+s,s);
		ChessBoard(LR+s,LL+s,LR+s,LL+s,s);
	}

	if(tr>=LR+s&&tl>=LL+s)
	{
		grid[LR+s-1][LL+s-1]=1;
        grid[LR+s-1][LL+s]=1;
		grid[LR+s][LL+s-1]=1;
		ChessBoard(LR+s,LL+s,tr,tl,s);
        ChessBoard(LR,LL,LR+s-1,LL+s-1,s);
        ChessBoard(LR,LL+s,LR+s-1,LL+s,s);
		ChessBoard(LR+s,LL,LR+s,LL+s,s);
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -