酷代码 AI
菜单

用c++写一个图形界面程序,黑**面有一个绿球和72个黄球,大小为30像素。绿球和黄球随机移动,移动后原位置的球出现黑色轨迹。当绿球碰到黄球时,黄球变为绿球,同时加入绿球阵营。当所有球都变绿时,输出从程序开始到现在的时间,不含第三方内容,不能在任何版本的c++上出现错误

在C++中实现一个图形界面程序,并且不使用第三方库,可以借助Windows API来完成。下面是一个示例代码,该程序会创建一个黑色的窗口,其中包含一个绿球和72个黄球,球会随机移动,移动后会留下黑色轨迹,当绿球碰到黄球时,黄球会变为绿球,当所有球都变为绿球时,会输出从程序开始到现在的时间。 ```cpp #include <windows.h> #include <iostream> #include <vector> #include <ctime> // 球的结构体 struct Ball { int x, y; // 球的位置 COLORREF color; // 球的颜色 int dx, dy; // 球的移动方向 }; const int WINDOW_WIDTH = 800; const int WINDOW_HEIGHT = 600; const int BALL_SIZE = 30; const int NUM_YELLOW_BALLS = 72; std::vector<Ball> balls; Ball greenBall; clock_t startTime; // 初始化球的位置和方向 void initBalls() { srand(static_cast<unsigned int>(time(nullptr))); // 初始化绿球 greenBall.x = rand() % (WINDOW_WIDTH - BALL_SIZE); greenBall.y = rand() % (WINDOW_HEIGHT - BALL_SIZE); greenBall.color = RGB(0, 255, 0); greenBall.dx = (rand() % 3) - 1; greenBall.dy = (rand() % 3) - 1; if (greenBall.dx == 0) greenBall.dx = 1; if (greenBall.dy == 0) greenBall.dy = 1; // 初始化黄球 for (int i = 0; i < NUM_YELLOW_BALLS; ++i) { Ball yellowBall; yellowBall.x = rand() % (WINDOW_WIDTH - BALL_SIZE); yellowBall.y = rand() % (WINDOW_HEIGHT - BALL_SIZE); yellowBall.color = RGB(255, 255, 0); yellowBall.dx = (rand() % 3) - 1; yellowBall.dy = (rand() % 3) - 1; if (yellowBall.dx == 0) yellowBall.dx = 1; if (yellowBall.dy == 0) yellowBall.dy = 1; balls.push_back(yellowBall); } startTime = clock(); } // 检查两个球是否碰撞 bool isCollision(const Ball& ball1, const Ball& ball2) { int dx = ball1.x - ball2.x; int dy = ball1.y - ball2.y; return dx * dx + dy * dy <= BALL_SIZE * BALL_SIZE; } // 更新球的位置 void updateBalls() { // 更新绿球位置 greenBall.x += greenBall.dx; greenBall.y += greenBall.dy; // 边界检测 if (greenBall.x < 0 || greenBall.x > WINDOW_WIDTH - BALL_SIZE) { greenBall.dx = -greenBall.dx; } if (greenBall.y < 0 || greenBall.y > WINDOW_HEIGHT - BALL_SIZE) { greenBall.dy = -greenBall.dy; } // 更新黄球位置 for (auto& ball : balls) { ball.x += ball.dx; ball.y += ball.dy; // 边界检测 if (ball.x < 0 || ball.x > WINDOW_WIDTH - BALL_SIZE) { ball.dx = -ball.dx; } if (ball.y < 0 || ball.y > WINDOW_HEIGHT - BALL_SIZE) { ball.dy = -ball.dy; } // 检查绿球和黄球是否碰撞 if (isCollision(greenBall, ball) && ball.color == RGB(255, 255, 0)) { ball.color = RGB(0, 255, 0); } } } // 绘制球 void drawBalls(HDC hdc) { // 绘制绿球 HBRUSH hBrush = CreateSolidBrush(greenBall.color); SelectObject(hdc, hBrush); Ellipse(hdc, greenBall.x, greenBall.y, greenBall.x + BALL_SIZE, greenBall.y + BALL_SIZE); DeleteObject(hBrush); // 绘制黄球 for (const auto& ball : balls) { hBrush = CreateSolidBrush(ball.color); SelectObject(hdc, hBrush); Ellipse(hdc, ball.x, ball.y, ball.x + BALL_SIZE, ball.y + BALL_SIZE); DeleteObject(hBrush); } } // 检查是否所有球都变绿 bool allBallsGreen() { for (const auto& ball : balls) { if (ball.color != RGB(0, 255, 0)) { return false; } } return true; } // 窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_CREATE: initBalls(); SetTimer(hwnd, 1, 10, nullptr); return 0; case WM_TIMER: { // 清除之前的球 HDC hdc = GetDC(hwnd); HBRUSH hBrush = CreateSolidBrush(RGB(0, 0, 0)); SelectObject(hdc, hBrush); Rectangle(hdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT); DeleteObject(hBrush); updateBalls(); drawBalls(hdc); ReleaseDC(hwnd, hdc); if (allBallsGreen()) { clock_t endTime = clock(); double elapsedTime = static_cast<double>(endTime - startTime) / CLOCKS_PER_SEC; std::cout << "All balls are green! Elapsed time: " << elapsedTime << " seconds." << std::endl; KillTimer(hwnd, 1); } } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, msg, wParam, lParam); } } // 主函数 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { // 注册窗口类 WNDCLASS wc = {}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.lpszClassName = L"BallWindowClass"; RegisterClass(&wc); // 创建窗口 HWND hwnd = CreateWindow(wc.lpszClassName, L"Ball Game", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, nullptr, nullptr, hInstance, nullptr); // 显示窗口 ShowWindow(hwnd, iCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg = {}; while (GetMessage(&msg, nullptr, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return static_cast<int>(msg.wParam); } ``` 代码说明: 1. 结构体 `Ball`:用于存储球的位置、颜色和移动方向。 2. `initBalls` 函数:初始化绿球和黄球的位置和移动方向。 3. `isCollision` 函数:检查两个球是否碰撞。 4. `updateBalls` 函数:更新球的位置,并检查绿球和黄球是否碰撞。 5. `drawBalls` 函数:绘制绿球和黄球。 6. `allBallsGreen` 函数:检查是否所有球都变绿。 7. `WndProc` 函数:窗口过程函数,处理窗口消息,包括定时器消息。 8. `WinMain` 函数:主函数,注册窗口类,创建窗口,显示窗口,并进入消息循环。 编译和运行: 将上述代码保存为 `.cpp` 文件,使用Visual Studio等C++开发环境进行编译和运行。程序会创建一个黑色的窗口,其中包含一个绿球和72个黄球,球会随机移动,当所有球都变为绿球时,会在控制台输出从程序开始到现在的时间。 [2026-01-23 09:01:36 | AI问答 | 2070点数解答]

服务商
相关提问
发财导航,免费问AI
实用工具查看更多