用MFC写一个贪吃蛇程序
时间: 2023-06-25 14:05:58 浏览: 75
好的,以下是基于MFC的简单贪吃蛇程序:
1. 创建一个MFC应用程序,并命名为SnakeGame。
2. 在资源视图中,添加一个位图资源,命名为IDB_SNAKE,用于绘制贪吃蛇和食物。
3. 在stdafx.h文件中添加以下头文件:
```
#include <vector>
using namespace std;
```
4. 在SnakeGameDlg.h文件中添加以下代码:
```
#pragma once
#include <vector>
using namespace std;
#define ROWS 30
#define COLS 30
#define BLOCK_SIZE 20
class CSnakeGameDlg : public CDialogEx
{
public:
CSnakeGameDlg(CWnd* pParent = nullptr);
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_SNAKEGAME_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnPaint();
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
private:
vector<CPoint> m_snake; // 贪吃蛇身体
CPoint m_food; // 食物
int m_direction; // 移动方向
CBitmap m_bmpSnake; // 贪吃蛇位图
CBitmap m_bmpFood; // 食物位图
void InitGame(); // 初始化游戏
void DrawBlock(CDC* pDC, int x, int y, COLORREF color); // 绘制方块
void MoveSnake(); // 移动贪吃蛇
bool IsGameOver(); // 判断游戏是否结束
};
```
5. 在SnakeGameDlg.cpp文件中添加以下代码:
```
#include "pch.h"
#include "framework.h"
#include "SnakeGame.h"
#include "SnakeGameDlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
#define TIMER_ID 1
CSnakeGameDlg::CSnakeGameDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_SNAKEGAME_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_direction = VK_RIGHT;
}
void CSnakeGameDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CSnakeGameDlg, CDialogEx)
ON_WM_PAINT()
ON_WM_TIMER()
ON_WM_KEYDOWN()
END_MESSAGE_MAP()
BOOL CSnakeGameDlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 初始化游戏
InitGame();
// 设置定时器
SetTimer(TIMER_ID, 100, NULL);
return TRUE;
}
void CSnakeGameDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
// 绘制游戏区域
for (int i = 0; i < ROWS; i++)
{
for (int j = 0; j < COLS; j++)
{
DrawBlock(&dc, j * BLOCK_SIZE, i * BLOCK_SIZE, RGB(255, 255, 255));
}
}
// 绘制贪吃蛇
for (auto& pt : m_snake)
{
DrawBlock(&dc, pt.x * BLOCK_SIZE, pt.y * BLOCK_SIZE, RGB(0, 255, 0));
}
// 绘制食物
DrawBlock(&dc, m_food.x * BLOCK_SIZE, m_food.y * BLOCK_SIZE, RGB(255, 0, 0));
}
void CSnakeGameDlg::OnTimer(UINT_PTR nIDEvent)
{
// 移动贪吃蛇
MoveSnake();
// 更新界面
Invalidate(FALSE);
CDialogEx::OnTimer(nIDEvent);
}
void CSnakeGameDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch (nChar)
{
case VK_LEFT:
case VK_RIGHT:
case VK_UP:
case VK_DOWN:
m_direction = nChar;
break;
default:
break;
}
CDialogEx::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CSnakeGameDlg::InitGame()
{
// 初始化贪吃蛇
m_snake.push_back(CPoint(5, 5));
m_snake.push_back(CPoint(4, 5));
m_snake.push_back(CPoint(3, 5));
// 随机生成食物
srand((unsigned int)time(NULL));
m_food.x = rand() % COLS;
m_food.y = rand() % ROWS;
// 加载位图资源
m_bmpSnake.LoadBitmap(IDB_SNAKE);
m_bmpFood.LoadBitmap(IDB_SNAKE + 1);
}
void CSnakeGameDlg::DrawBlock(CDC* pDC, int x, int y, COLORREF color)
{
CBrush brush(color);
CBrush* pOldBrush = pDC->SelectObject(&brush);
pDC->Rectangle(x, y, x + BLOCK_SIZE, y + BLOCK_SIZE);
pDC->SelectObject(pOldBrush);
}
void CSnakeGameDlg::MoveSnake()
{
// 计算贪吃蛇头部位置
CPoint head = m_snake.front();
switch (m_direction)
{
case VK_LEFT:
head.x--;
break;
case VK_RIGHT:
head.x++;
break;
case VK_UP:
head.y--;
break;
case VK_DOWN:
head.y++;
break;
default:
break;
}
// 判断是否吃到食物
if (head == m_food)
{
m_snake.insert(m_snake.begin(), head);
// 随机生成新的食物
m_food.x = rand() % COLS;
m_food.y = rand() % ROWS;
return;
}
// 移动贪吃蛇身体
for (int i = m_snake.size() - 1; i > 0; i--)
{
m_snake[i] = m_snake[i - 1];
}
m_snake[0] = head;
// 判断游戏是否结束
if (IsGameOver())
{
KillTimer(TIMER_ID);
MessageBox(_T("游戏结束!"), _T("提示"), MB_OK | MB_ICONINFORMATION);
PostQuitMessage(0);
}
}
bool CSnakeGameDlg::IsGameOver()
{
// 判断是否碰到边界
CPoint head = m_snake.front();
if (head.x < 0 || head.x >= COLS || head.y < 0 || head.y >= ROWS)
{
return true;
}
// 判断是否碰到贪吃蛇身体
for (int i = 1; i < m_snake.size(); i++)
{
if (head == m_snake[i])
{
return true;
}
}
return false;
}
```
6. 运行程序,即可开始游戏。使用方向键控制贪吃蛇的移动方向,吃到食物后贪吃蛇会变长。当贪吃蛇碰到边界或自己的身体时,游戏结束。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)