求求你,别杀我
2025-01-24 18:43:02
发布于:上海
#include <windows.h>
#include <queue>
#include <ctime>
#include <array>
DWORD PlayerX=0,PlayerY=0;
constexpr DWORD WIDTH=640,HEIGHT=480,HARD_COEFFICIENT=25;
std::array<std::array<signed char,HEIGHT>,WIDTH>mainMap;
BOOL isRightPath(){
std::queue<DWORD>m_xq,m_yq;std::array<signed long long,4>m_dx{-1,0,0,1},m_dy{0,-1,1,0};std::array<std::array<signed char,HEIGHT>,WIDTH>m_visits{};
m_xq.push(0),m_yq.push(0);m_visits.at(0).at(0)=1;
while(m_xq.size()){
for(int i=0;i<4;++i){
signed long long m_nowX=m_xq.front()+static_cast<signed long long>(m_dx.at(i)),m_nowY=m_yq.front()+static_cast<signed long long>(m_dy.at(i));
if(m_nowX<0||m_nowX>=WIDTH||m_nowY<0||m_nowY>=HEIGHT||m_visits.at(m_nowX).at(m_nowY)||mainMap.at(m_nowX).at(m_nowY)==2)continue;
if(m_nowX==WIDTH-1&&m_nowY==HEIGHT-1)return 1;
m_xq.push(m_nowX),m_yq.push(m_nowY),m_visits.at(m_nowX).at(m_nowY)=1;
}
m_xq.pop(),m_yq.pop();
}
return 0;
}
HBRUSH hBrushRed,hBrushBlack,hBrushGreen;
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
switch(Message) {
case WM_CREATE:{
startCreateMap:srand(time(0));
for(int i=0;i<WIDTH;++i)for(int j=0;j<HEIGHT;++j)mainMap.at(i).at(j)=(rand()/36)%97<HARD_COEFFICIENT?2:0;
mainMap.at(PlayerX).at(PlayerY)=1,mainMap.at(WIDTH-1).at(HEIGHT-1)=3;
if(!isRightPath())goto startCreateMap;
SetTimer(hwnd,0,12,0);
hBrushRed=CreateSolidBrush(RGB(255,0,0)),hBrushBlack=CreateSolidBrush(RGB(0,0,0)),hBrushGreen=CreateSolidBrush(RGB(0,255,0));
break;
}
case WM_DESTROY: {
PostQuitMessage(0);
DeleteObject(hBrushRed);DeleteObject(hBrushBlack);DeleteObject(hBrushGreen);
break;
}
case WM_TIMER:{
break;
}
case WM_PAINT:{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
SelectObject(hdc,hBrushRed);SelectObject(hdc,hBrushBlack);SelectObject(hdc,hBrushGreen);
for(int i=0;i<WIDTH;++i)for(int j=0;j<HEIGHT;++j){
RECT rc;
rc={2*i,2*j,2*i+2,2*j+2};
switch(mainMap.at(i).at(j)){
case 1:{
FillRect(hdc,&rc,hBrushRed);
break;
}
case 2:{
FillRect(hdc,&rc,hBrushBlack);
break;
}
case 3:{
FillRect(hdc,&rc,hBrushGreen);
break;
}
}
}
EndPaint(hwnd, &ps);
break;
}
case WM_KEYDOWN:{
int OriginalPlayerX=PlayerX,OriginalPlayerY=PlayerY;
if(wParam=='W')--PlayerY;
if(wParam=='A')--PlayerX;
if(wParam=='S')++PlayerY;
if(wParam=='D')++PlayerX;
if(PlayerX==WIDTH-1&&PlayerY==HEIGHT-1)Beep(324,500);
if(PlayerX<0||PlayerX>=WIDTH)PlayerX=OriginalPlayerX;
if(PlayerY<0||PlayerY>=HEIGHT)PlayerY=OriginalPlayerY;
if(mainMap.at(PlayerX).at(PlayerY)==2)PlayerX=OriginalPlayerX,PlayerY=OriginalPlayerY;
mainMap.at(PlayerX).at(PlayerY)=1;mainMap.at(OriginalPlayerX).at(OriginalPlayerY)=0;
RECT rc{PlayerX*2>4ul?(PlayerX*2)-4ul:0ul,PlayerY*2>4ul?(PlayerY*2)-4ul:0ul,std::min(PlayerX*2+4ul,WIDTH*2-1ul),std::min(PlayerY*2+4ul,HEIGHT*2-1ul)};
if(OriginalPlayerX!=PlayerX||OriginalPlayerY!=PlayerY)InvalidateRect(hwnd,&rc,1);
break;
}
default:
return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
WNDCLASSEX wc;
HWND hwnd;
MSG msg;
memset(&wc,0,sizeof(wc));
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WndProc;
wc.hInstance = hInstance;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.lpszClassName = "WindowClass";
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */
if(!RegisterClassEx(&wc)) {
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, /* x */
CW_USEDEFAULT, /* y */
1350,//660, /* width */
1100,//523, /* height */
NULL,NULL,hInstance,NULL);
if(hwnd == NULL) {
MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
return 0;
}
while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
TranslateMessage(&msg); /* Translate key codes to chars if present */
DispatchMessage(&msg); /* Send it to WndProc */
}
return msg.wParam;
}
这里空空如也
有帮助,赞一个