酷代码 AI
菜单

用c++写一个图形界面程序,有一个绿球和72个黄球,绿球和黄球随机移动,移动后原位置的球立即消失。当绿球碰到黄球时,黄球变为绿球,同时加入绿球阵营。当所有球都变绿时,输出从程序开始到现在的时间,不含第三方内容

以下是一个使用C++结合Windows API实现图形界面程序的示例代码,满足有一个绿球和72个黄球,绿球和黄球随机移动,移动后原位置的球立即消失,当绿球碰到黄球时,黄球变为绿球并加入绿球阵营,当所有球都变绿时,输出从程序开始到现在的时间。 ```cpp #include <windows.h> #include <iostream> #include <vector> #include <ctime> // 定义球的结构体 struct Ball { int x; int y; int radius; bool isGreen; }; // 全局变量 const int WINDOW_WIDTH = 800; const int WINDOW_HEIGHT = 600; const int BALL_RADIUS = 10; const int NUM_YELLOW_BALLS = 72; std::vector<Ball> balls; clock_t startTime; // 绘制球的函数 void DrawBalls(HDC hdc) { for (const Ball& ball : balls) { HBRUSH brush; if (ball.isGreen) { brush = CreateSolidBrush(RGB(0, 255, 0)); // 绿色 } else { brush = CreateSolidBrush(RGB(255, 255, 0)); // 黄色 } HPEN pen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0)); SelectObject(hdc, brush); SelectObject(hdc, pen); Ellipse(hdc, ball.x - ball.radius, ball.y - ball.radius, ball.x + ball.radius, ball.y + ball.radius); DeleteObject(brush); DeleteObject(pen); } } // 移动球的函数 void MoveBalls() { for (Ball& ball : balls) { int dx = rand() % 3 - 1; int dy = rand() % 3 - 1; ball.x += dx; ball.y += dy; // 边界检查 if (ball.x - ball.radius < 0) ball.x = ball.radius; if (ball.x + ball.radius > WINDOW_WIDTH) ball.x = WINDOW_WIDTH - ball.radius; if (ball.y - ball.radius < 0) ball.y = ball.radius; if (ball.y + ball.radius > WINDOW_HEIGHT) ball.y = WINDOW_HEIGHT - ball.radius; } } // 检查绿球和黄球碰撞的函数 void CheckCollisions() { Ball& greenBall = balls[0]; for (size_t i = 1; i < balls.size(); ++i) { Ball& yellowBall = balls[i]; int dx = greenBall.x - yellowBall.x; int dy = greenBall.y - yellowBall.y; int distance = dx * dx + dy * dy; if (distance <= (BALL_RADIUS * 2) * (BALL_RADIUS * 2) && !yellowBall.isGreen) { yellowBall.isGreen = true; } } } // 检查是否所有球都变绿的函数 bool AllBallsGreen() { for (const Ball& ball : balls) { if (!ball.isGreen) { return false; } } return true; } // 窗口过程函数 LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); DrawBalls(hdc); EndPaint(hwnd, &ps); break; } case WM_TIMER: { MoveBalls(); CheckCollisions(); if (AllBallsGreen()) { clock_t endTime = clock(); double elapsedTime = (double)(endTime - startTime) / CLOCKS_PER_SEC; std::cout << "所有球都变绿了,用时: " << elapsedTime << " 秒" << std::endl; KillTimer(hwnd, 1); } 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, LPSTR lpCmdLine, int nCmdShow) { // 初始化随机数种子 srand((unsigned int)time(NULL)); // 注册窗口类 WNDCLASS wc = {}; wc.lpfnWndProc = WndProc; wc.hInstance = hInstance; wc.lpszClassName = L"BallWindowClass"; RegisterClass(&wc); // 创建窗口 HWND hwnd = CreateWindow(wc.lpszClassName, L"Ball Movement", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL); // 初始化球 balls.push_back({ rand() % (WINDOW_WIDTH - 2 * BALL_RADIUS) + BALL_RADIUS, rand() % (WINDOW_HEIGHT - 2 * BALL_RADIUS) + BALL_RADIUS, BALL_RADIUS, true }); for (int i = 0; i < NUM_YELLOW_BALLS; ++i) { balls.push_back({ rand() % (WINDOW_WIDTH - 2 * BALL_RADIUS) + BALL_RADIUS, rand() % (WINDOW_HEIGHT - 2 * BALL_RADIUS) + BALL_RADIUS, BALL_RADIUS, false }); } // 记录开始时间 startTime = clock(); // 设置定时器 SetTimer(hwnd, 1, 100, NULL); // 显示窗口 ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); // 消息循环 MSG msg = {}; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } ``` 代码说明: 1. 结构体 `Ball`:定义了球的属性,包括位置 `(x, y)`、半径 `radius` 和是否为绿色 `isGreen`。 2. `DrawBalls` 函数:用于在窗口中绘制所有球,根据球的颜色选择不同的画刷。 3. `MoveBalls` 函数:使所有球随机移动,并进行边界检查,确保球不会移出窗口。 4. `CheckCollisions` 函数:检查绿球和黄球是否碰撞,如果碰撞则将黄球变为绿球。 5. `AllBallsGreen` 函数:检查是否所有球都变为绿色。 6. `WndProc` 函数:窗口过程函数,处理窗口消息,包括绘制、定时器和销毁消息。 7. `WinMain` 函数:程序入口,注册窗口类,创建窗口,初始化球,设置定时器,显示窗口并进入消息循环。 注意事项: - 该程序使用Windows API实现图形界面,只能在Windows系统上运行。 - 定时器每隔100毫秒触发一次,可根据需要调整定时器的时间间隔。 [2026-01-23 08:45:57 | AI问答 | 1806点数解答]

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