c++windows api黑色背景显示一个随机可通行迷宫,显示一个圆在起点,可通过上下左右键移动,直到终点,显示从起点到现在的时间。
以下是一个使用 Windows API 实现的 C++ 程序,它可以显示一个随机可通行的迷宫,在起点处显示一个圆,允许用户通过上下左右键移动这个圆,直到到达终点,并显示从起点开始到当前的时间。 ```cpp #include <windows.h> #include <iostream> #include <ctime> #include <cstdlib> #include <vector> // 迷宫的大小 const int MAZE_WIDTH = 21; const int MAZE_HEIGHT = 21; // 迷宫数组 char maze[MAZE_HEIGHT][MAZE_WIDTH]; // 玩家位置 int playerX, playerY; // 起点和终点位置 int startX, startY, endX, endY; // 时间记录 clock_t startTime; // 生成迷宫 void generateMaze() { // 初始化迷宫为墙 for (int y = 0; y < MAZE_HEIGHT; ++y) { for (int x = 0; x < MAZE_WIDTH; ++x) { if (x % 2 == 0 || y % 2 == 0) { maze[y][x] = '#'; } else { maze[y][x] = ' '; } } } // 随机选择起点和终点 startX = 1; startY = 1; endX = MAZE_WIDTH - 2; endY = MAZE_HEIGHT - 2; // 深度优先搜索生成迷宫 std::vector<int> stackX, stackY; stackX.push_back(startX); stackY.push_back(startY); maze[startY][startX] = ' '; while (!stackX.empty()) { int currentX = stackX.back(); int currentY = stackY.back(); std::vector<int> directions; if (currentX - 2 > 0 && maze[currentY][currentX - 2] == '#') directions.push_back(0); if (currentX + 2 < MAZE_WIDTH - 1 && maze[currentY][currentX + 2] == '#') directions.push_back(1); if (currentY - 2 > 0 && maze[currentY - 2][currentX] == '#') directions.push_back(2); if (currentY + 2 < MAZE_HEIGHT - 1 && maze[currentY + 2][currentX] == '#') directions.push_back(3); if (!directions.empty()) { int randomDirection = directions[rand() % directions.size()]; switch (randomDirection) { case 0: maze[currentY][currentX - 1] = ' '; maze[currentY][currentX - 2] = ' '; stackX.push_back(currentX - 2); stackY.push_back(currentY); break; case 1: maze[currentY][currentX + 1] = ' '; maze[currentY][currentX + 2] = ' '; stackX.push_back(currentX + 2); stackY.push_back(currentY); break; case 2: maze[currentY - 1][currentX] = ' '; maze[currentY - 2][currentX] = ' '; stackX.push_back(currentX); stackY.push_back(currentY - 2); break; case 3: maze[currentY + 1][currentX] = ' '; maze[currentY + 2][currentX] = ' '; stackX.push_back(currentX); stackY.push_back(currentY + 2); break; } } else { stackX.pop_back(); stackY.pop_back(); } } // 设置起点和终点 maze[startY][startX] = 'S'; maze[endY][endX] = 'E'; playerX = startX; playerY = startY; } // 绘制迷宫 void drawMaze(HDC hdc) { for (int y = 0; y < MAZE_HEIGHT; ++y) { for (int x = 0; x < MAZE_WIDTH; ++x) { if (maze[y][x] == '#') { Rectangle(hdc, x * 20, y * 20, (x + 1) * 20, (y + 1) * 20); } else if (maze[y][x] == 'S') { Ellipse(hdc, startX * 20 + 5, startY * 20 + 5, startX * 20 + 15, startY * 20 + 15); } else if (maze[y][x] == 'E') { Ellipse(hdc, endX * 20 + 5, endY * 20 + 5, endX * 20 + 15, endY * 20 + 15); } } } // 绘制玩家 Ellipse(hdc, playerX * 20 + 5, playerY * 20 + 5, playerX * 20 + 15, playerY * 20 + 15); } // 处理按键事件 void handleKeyPress(int key) { int newX = playerX; int newY = playerY; switch (key) { case VK_UP: newY--; break; case VK_DOWN: newY++; break; case VK_LEFT: newX--; break; case VK_RIGHT: newX++; break; } if (maze[newY][newX] != '#') { playerX = newX; playerY = newY; if (playerX == endX && playerY == endY) { // 到达终点 std::cout << "You reached the end! Time: " << (clock() - startTime) / CLOCKS_PER_SEC << " seconds." << std::endl; exit(0); } } } // 窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: srand(time(NULL)); generateMaze(); startTime = clock(); break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // 设置黑色 HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0)); FillRect(hdc, &ps.rcPaint, hBrush); DeleteObject(hBrush); // 绘制迷宫 drawMaze(hdc); // 显示时间 clock_t currentTime = clock(); char timeStr[20]; sprintf_s(timeStr, "Time: %d s", (currentTime - startTime) / CLOCKS_PER_SEC); SetTextColor(hdc, RGB(255, 255, 255)); TextOut(hdc, 10, MAZE_HEIGHT * 20 + 10, timeStr, strlen(timeStr)); EndPaint(hwnd, &ps); break; } case WM_KEYDOWN: handleKeyPress(wParam); InvalidateRect(hwnd, NULL, TRUE); break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wParam, lParam); } return 0; } // 主函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // 注册窗口类 WNDCLASS wc = {}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.lpszClassName = "MazeWindowClass"; RegisterClass(&wc); // 创建窗口 HWND hwnd = CreateWindow(wc.lpszClassName, "Maze Game", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, MAZE_WIDTH * 20 + 20, MAZE_HEIGHT * 20 + 60, NULL, NULL, hInstance, NULL); // 显示窗口 ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg = {}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; } ``` 代码说明: 1. 迷宫生成:使用深度优先搜索算法生成一个随机可通行的迷宫。 2. 玩家移动:通过上下左右键控制玩家在迷宫中移动。 3. 时间记录:记录从起点开始到当前的时间,并在窗口中显示。 4. 图形绘制:使用 Windows API 的绘图函数绘制迷宫、玩家和时间信息。 编译和运行: 将上述代码保存为一个 `.cpp` 文件,使用支持 Windows API 的 C++ 编译器(如 Visual Studio)进行编译和运行。运行程序后,你将看到一个黑色的迷宫窗口,通过上下左右键控制圆在迷宫中移动,直到到达终点,程序将显示你所用的时间。 [2026-01-24 09:37:13 | AI问答 | 2263点数解答]
- [GPT] <script setup> import { ref, onmounted } from 'vue' import { useroute } from 'vue-router' import { selectbyid } from '@/api/job' import { selectqiye } from '@/api/qiye' import { selectjianli } from '@/api/jianli' import { applyforjob, checkshenqing } from '@/api/shenqing' import { elmessage } from 'element-plus' import { addshoucang, cancelshoucang, checkshoucang } from '@/api/shoucang' const token = localstorage.getitem('token') const route = useroute() const userrole = localstorage.getitem('us(136点数解答 | 2024-12-29 17:09:05)216
- [DeepSeek] - ItemId: 12720 #道具id A级赛车 雷诺 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 127758 #道具id 宠物 冰凤 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 21980 #道具id 效率宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 - ItemId: 21986 #道具id 重生宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 这种文本文件如何用易语言读入并显示到超级列表框内 (571点数解答 | 2025-08-23 20:54:40)194
- [DeepSeek] - ItemId: 12720 #道具id A级赛车 雷诺 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 127758 #道具id 宠物 冰凤 ItemNum: 1 #数量 ObtainTime: 1 #时间 AvailPeriod: -1 #0显示数量 -1显示永久 - ItemId: 21980 #道具id 效率宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 - ItemId: 21986 #道具id 重生宝珠LV4 ItemNum: 100 #数量 ObtainTime: 1 #时间 AvailPeriod: 0 #0显示数量 -1显示永久 这种文本文件如何用易语言读入并显示到超级列表框内,并且可以增加新的一样的文本(1317点数解答 | 2025-08-23 20:58:40)198
- [阿里通义] 有如下一段html代码,请用css实现鼠标移入a标签,自动隐藏class="api-name-div"的div <a href="#" class="api-block"> <img src="../image/muwu.jpg"> <div class="api-name-div">幸福就是可以一起睡觉</div> <div class="api-edit-div">编辑</div>(181点数解答 | 2023-10-26 09:52:31)379
- [字节豆包] 题目描述 扶苏来到了一个迷宫,这个迷宫是一个 n 行 m 列的数字矩阵,第 i 行第 j 列写有 一个数字 ai,j。保证 1≤ai,j≤4。 扶苏会在这个迷宫的某一个位置。假设她当前在迷宫的第 i 行第 j 列: 如果 ai,j=1,则她会向上移动一行,即 i 减小 1。 如果 ai,j=2,则她会向下移动一行,即 i 增大 1。 如果 ai,j=3,则她会向左移动一列,即 j 减小 1。 如果 ai,j=4,则她会向右移动一列,即 j 增大 1。 初始时和每次移动到另一个格子后,她都会按上述的规则继续进行新的移动。 当她移动出迷宫,即到达第 0 行、第 0 列、第 n+1 行、第 m+1 列时,称她离开了 迷宫。 现在,你要回答 q 次询问,每次给定一个扶苏的初时位置,你要回答她在多少次移动 后会离开迷宫,或报告她永远不会离开迷宫。 输入格式 第一行是三个整数,表示迷宫的行数 n、列数 m 和询问数 q。 接下来 n 行,每行 m 个整数,表示矩阵 a。 接下来 q 行,每行两个整数 xi,yi,表示一次查询初时在第 xi行yi列时她离开迷宫需 要的步数。(819点数解答 | 2025-11-26 19:27:35)51
- [阿里通义] <a href="#" class="api-block"> <img src="../image/muwu.jpg"> <div class="api-name-div">幸福就是可以一起睡觉</div> <div class="api-edit-div">编辑</div> </a>(182点数解答 | 2023-10-26 09:46:09)331
- [字节豆包] 使用继承,实现“剪刀石头布的游戏”。 小时候很喜欢玩一个游戏,“剪刀石头布”,可以是出拳的形式,或跳格子的形式。现在我们用计算机来玩这个游戏。 电脑用随机数产生剪刀石头布,游戏玩家用输入1,2,3的方式出拳。 游戏玩家输入1或2或3,分别 代表剪刀(1)石头(2)布(3)。 电脑胜出时,显示"winner is computerplayer." 游戏玩家胜出时,显示“winner is personplayer.” 平局时显示"a draw." 函数接口定义: 根据主方法内容,实现三个类的定义,分别是是computerplayer、personplayer、game类。 其中computerplayer、personplayer要继承player类。 根据主方法中的用法,实现game类。 裁判测试程序样例: import java.util.scanner; class player{ string name; player(string name){ this.name = name; } int show() { //出拳方法(451点数解答 | 2024-10-20 19:57:58)431
- [字节豆包] [问题描述]windows 资源管理器(file explorer)是 windows 操作系统中用于管理文件和文件夹的文件管理器,为用户在 windows 操作系统中进行文件和文件夹管理提供了便利和多样的功能。请模拟该软件完成一个自己的文件管理器,具体要求如下:(1) 文件和文件夹操作(60 分):可以创建、复制、粘贴、移动、重命名和删除文件和文件夹。(2) 导航和路径(10 分):允许用户在文件系统中导航,查看文件路径和目录结构,以快速定位文件或文件夹。(3) 搜索(10 分):提供搜索功能,可以按文件名、文件类型、修改日期等进行搜索并定位文件。(4) 文件属性(10 分):允许查看文件的属性,如大小、创建日期、修改日期和文件类型等。(5) 快速访问(10 分):提供快速访问常用文件夹和最近访问的文件功能,方便用户快速打开常用文件或文件夹。(6) 标签页(附加 10 分):允许用户以标签页形式打开多个文件资源管理器窗口,方便在4不同位置之间进行拖放操作或文件整理。[测试数据]参考操作系统中资源管理器。[实现提示]可能用到树、链表、哈希表、栈、队列、图等。,语言方向:Java,系统环(623点数解答 | 2025-01-01 14:59:04)224
- [GPT] 8-1 数据结构大作业:设计并实现一个资源管理器 分数 100 作者 gy 单位 设计并实现一个资源管理器,至少实现以下功能: 1.管理文件和文件夹:用户可以通过资源管理器查看、创建、移动、复制和删除文件和文件夹。 2.快速预览文件和文件夹:资源管理器提供了树状的文件系统结构,使用户能够更直观地认识电脑的文件和文件夹。 3.复制、移动、删除文件:用户可以在资源管理器中复制、移动和删除文件。(654点数解答 | 2024-12-04 19:07:22)306
- [GPT] 8-1 数据结构大作业:设计并实现一个资源管理器 分数 100 作者 gy 单位 设计并实现一个资源管理器,至少实现以下功能: 1.管理文件和文件夹:用户可以通过资源管理器查看、创建、移动、复制和删除文件和文件夹。 2.快速预览文件和文件夹:资源管理器提供了树状的文件系统结构,使用户能够更直观地认识电脑的文件和文件夹。 3.复制、移动、删除文件:用户可以在资源管理器中复制、移动和删除文件。 评分标准:(186点数解答 | 2024-12-04 21:33:38)224
- [字节豆包] 数据结构大作业:设计并实现一个资源管理器 分数 100 作者 gy 单位 设计并实现一个资源管理器,至少实现以下功能: 1.管理文件和文件夹:用户可以通过资源管理器查看、创建、移动、复制和删除文件和文件夹。 2.快速预览文件和文件夹:资源管理器提供了树状的文件系统结构,使用户能够更直观地认识电脑的文件和文件夹。 3.复制、移动、删除文件:用户可以在资源管理器中复制、移动和删除文件。(883点数解答 | 2024-12-05 15:03:36)230
- [字节豆包] 设计并实现一个资源管理器,至少实现以下功能: 1.管理文件和文件夹:用户可以通过资源管理器查看、创建、移动、复制和删除文件和文件夹。 2.快速预览文件和文件夹:资源管理器提供了树状的文件系统结构,使用户能够更直观地认识电脑的文件和文件夹。 3.复制、移动、删除文件:用户可以在资源管理器中复制、移动和删除文件。(427点数解答 | 2024-12-05 15:06:07)340