当前位置: 首页 > news >正文

C++ Win32API 贪吃蛇游戏

程序代码:

#include <windows.h>
#include <list>
#include <ctime>// 定义游戏区域大小
const int width = 20;
const int height = 20;// 定义贪吃蛇的方向
enum Direction { UP, DOWN, LEFT, RIGHT };// 定义贪吃蛇的节点
struct SnakeNode {int x, y;
};// 全局变量
HINSTANCE hInst;
HWND hWnd;
bool gameOver;
std::list<SnakeNode> snake;
SnakeNode food;
Direction dir;
int score = 0;// 函数声明
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void SetupGame();
void DrawGame(HDC);
void UpdateGame();
void GenerateFood();int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {hInst = hInstance;WNDCLASSEX wcex;MSG msg;// 注册窗口类wcex.cbSize = sizeof(WNDCLASSEX);wcex.style = CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc = WndProc;wcex.cbClsExtra = 0;wcex.cbWndExtra = 0;wcex.hInstance = hInstance;wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);wcex.hCursor = LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wcex.lpszMenuName = NULL;wcex.lpszClassName = TEXT("SnakeGame");wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);RegisterClassEx(&wcex);// 创建窗口hWnd = CreateWindow(TEXT("SnakeGame"), TEXT("贪吃蛇游戏"), WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, 800, 600, NULL, NULL, hInstance, NULL);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);// 初始化游戏SetupGame();// 消息循环while (GetMessage(&msg, NULL, 0, 0)) {TranslateMessage(&msg);DispatchMessage(&msg);}return (int)msg.wParam;
}LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {PAINTSTRUCT ps;HDC hdc;switch (message) {case WM_PAINT:hdc = BeginPaint(hWnd, &ps);DrawGame(hdc);EndPaint(hWnd, &ps);break;case WM_KEYDOWN:switch (wParam) {case VK_UP:dir = UP;break;case VK_DOWN:dir = DOWN;break;case VK_LEFT:dir = LEFT;break;case VK_RIGHT:dir = RIGHT;break;}break;case WM_TIMER:UpdateGame();break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);}return 0;
}void SetupGame() {gameOver = false;dir = RIGHT;snake.clear();snake.push_back({ width / 2, height / 2 });GenerateFood();SetTimer(hWnd, 1, 100, NULL); // 设置定时器,每100毫秒更新一次
}void DrawGame(HDC hdc) {RECT rect;GetClientRect(hWnd, &rect);FillRect(hdc, &rect, (HBRUSH)GetStockObject(WHITE_BRUSH));// 绘制食物HBRUSH hFoodBrush = CreateSolidBrush(RGB(255, 0, 0)); // 红色HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, hFoodBrush);Rectangle(hdc, food.x * 20, food.y * 20, (food.x + 1) * 20, (food.y + 1) * 20);SelectObject(hdc, hOldBrush);DeleteObject(hFoodBrush);// 绘制贪吃蛇HBRUSH hSnakeBrush = CreateSolidBrush(RGB(0, 0, 255)); // 蓝色hOldBrush = (HBRUSH)SelectObject(hdc, hSnakeBrush);for (auto& node : snake) {Rectangle(hdc, node.x * 20, node.y * 20, (node.x + 1) * 20, (node.y + 1) * 20);}SelectObject(hdc, hOldBrush);DeleteObject(hSnakeBrush);
}void UpdateGame() {if (gameOver) return;// 更新贪吃蛇的位置SnakeNode head = snake.front();switch (dir) {case UP: head.y--; break;case DOWN: head.y++; break;case LEFT: head.x--; break;case RIGHT: head.x++; break;}// 检查是否吃到食物if (head.x == food.x && head.y == food.y) {snake.push_front(head);GenerateFood();}else {snake.pop_back();snake.push_front(head);}// 重绘窗口InvalidateRect(hWnd, NULL, TRUE);
}void GenerateFood() {srand(time(NULL));food.x = rand() % width;food.y = rand() % height;
}

运行结果:

http://www.lryc.cn/news/423082.html

相关文章:

  • 【Python实现代码视频/视频转字符画/代码风格视频】
  • 基于级联深度学习算法的前列腺病灶检测在双参数MRI中的评估| 文献速递-基于深度学习的乳房、前列腺疾病诊断系统
  • 基于STM32开发的智能门铃系统
  • 【WebRTC指南】远程视频流
  • 前端构建URL的几种方法比对,以及函数实现
  • 场外个股期权如何发出行权指令?
  • AH8681锂电升压3.7升5V升12V 2A可支持QC2.0 3.0
  • 那些年我们一起遇到过的奇技淫巧
  • 机器学习笔记:编码器与解码器
  • 加密狗创新解决方案助力工业自动化
  • 浅谈文件缓冲区和翻译环境
  • 《腾讯NCNN框架的模型转换x86/mips交叉编译推理》详细教程
  • 关于近期安卓开发书籍阅读观后感
  • Servlet——个人笔记
  • 富格林:戳穿虚假交易保证安全
  • Linux学习——文本处理工具与正则表达式
  • 大厂进阶四:React源码Fiber架构解析
  • MongoDB的WiredTiger存储引擎
  • windows 版本Jenkins的Jenkinsfile中共享变量
  • Android-->产物收集(含apk文件重命名, aab文件重命名)
  • matlab实现迷宫最佳路径规划
  • 【自用】Python爬虫学习(二):网页解析的三种方式(re、bs4、xpath)
  • 从零到一:家政保洁小程序搭建全攻略与功能作用深度解析
  • 单元测试:为工程质量保驾护航
  • 江协科技STM32学习笔记
  • RabbitMQ再回首--往事如梦
  • 头狼择校小程序
  • 【Electron】npm安装Electron项目失败报错问题和解决办法
  • 人工智能提示(prompt)工程入门
  • 【机器学习的基本思想】模型优化与评估