MFC-贪吃蛇

来源:互联网 发布:mac safari 缓存 编辑:程序博客网 时间:2024/05/17 07:03

项目代码:

https://yunpan.cn/cYvqi5UmBdJEJ (提取码:05a6)


// 定义一个贪吃蛇的其中之一typedef struct ty_snake {int x;int y;COLORREF color;} snake;// 游戏区域左侧与顶部const int GAME_SIDE_LEFT = 10;const int GAME_SIDE_TOP = 10;// 游戏区域中的一个方块的宽度const int GAME_WIDTH = 20;// 游戏区域宽和高有多少个方块const int NUMT = 20;// 随机的颜色#define COLOR_RAND RGB(rand()%200+30,rand()%200+30,rand()%200+30)// 定义方向enum DIRECT {UP = -1,DOWN = 1,LEFT = -2,RIGHT = 2};

---------

#pragma once#include <list>class CSnake{public:CSnake();~CSnake();std::list<snake> m_snake;void makeSnake();int m_direction;void Draw();CRect getSnakePos(snake sn);void makeOneSnake();snake m_onesnake;BOOL move();void alterDirect(int direct);BOOL dealOut(snake sn);BOOL haveSnake(snake sn);};
-----------

#include "stdafx.h"#include "Snake.h"#include "time.h"#include <string>#include <algorithm>CSnake::CSnake(){m_direction = UP;}CSnake::~CSnake(){}void CSnake::makeSnake(){srand((unsigned)time(0));snake sn1 = {NUMT/2,NUMT/2,COLOR_RAND};m_snake.push_back(sn1);snake sn2 = { NUMT / 2+1,NUMT / 2,COLOR_RAND };m_snake.push_back(sn2);}void CSnake::makeOneSnake(){srand((unsigned)time(0));m_onesnake = { rand()%NUMT,rand() % NUMT,COLOR_RAND };}void CSnake::Draw(){CClientDC* dc = (CClientDC*)AfxGetMainWnd()->GetDC();dc->FillSolidRect(CRect(GAME_SIDE_LEFT,GAME_SIDE_TOP,GAME_SIDE_LEFT+GAME_WIDTH*NUMT,GAME_SIDE_TOP+GAME_WIDTH*NUMT), RGB(255,255,255));std::for_each(m_snake.begin(), m_snake.end(), [=](snake sn) {dc->FillSolidRect(getSnakePos(sn), sn.color);});dc->FillSolidRect(getSnakePos(m_onesnake), m_onesnake.color);dc->DeleteDC();dc = nullptr;}CRect CSnake::getSnakePos(snake sn){return CRect(GAME_SIDE_LEFT+sn.x*GAME_WIDTH,GAME_SIDE_TOP+sn.y*GAME_WIDTH,GAME_SIDE_LEFT + (sn.x+1)*GAME_WIDTH,GAME_SIDE_TOP + (sn.y+1)*GAME_WIDTH);}BOOL CSnake::move(){snake asn;switch (m_direction){case UP: {asn = {m_snake.front().x,m_snake.front().y-1,m_snake.back().color};break;}case DOWN: {asn = { m_snake.front().x,m_snake.front().y + 1,m_snake.back().color };break;}case LEFT: {asn = { m_snake.front().x-1,m_snake.front().y,m_snake.back().color };break;}case RIGHT: {asn = { m_snake.front().x+1,m_snake.front().y,m_snake.back().color };break;}default:break;}if (dealOut(asn)) {return FALSE;}if (haveSnake(asn)) {m_snake.push_front(m_onesnake);makeOneSnake();move();return TRUE;}m_snake.push_front(asn);m_snake.pop_back();return TRUE;}void CSnake::alterDirect(int direct){if (direct == m_direction) {return;}if (direct == -m_direction) {return;}m_direction = direct;}BOOL CSnake::dealOut(snake sn){if (sn.x < 0 || sn.y < 0 || sn.x >= NUMT || sn.y >= NUMT) {return TRUE;}for (auto e : m_snake) {if (sn.x == e.x && sn.y == e.y) {return TRUE;}}return FALSE;}BOOL CSnake::haveSnake(snake sn){if (sn.x == m_onesnake.x && sn.y == m_onesnake.y) {return TRUE;}return FALSE;}

-----------

初始化

m_stop = 1;m_start = 0;snk = new CSnake;


void CSnakeGameDlg::OnBnClickedOk(){if (!m_start) {snk->makeSnake();snk->makeOneSnake();snk->Draw();SetTimer(1002, 500, 0);m_start = 1;m_stop = 0;return;}if (m_start) {if (m_stop) {SetTimer(1002, 500, 0);m_stop = 0;}else {KillTimer(1002);m_stop = 1;}}}void CSnakeGameDlg::OnBnClickedAgain(){m_stop = 0;m_start = 1;snk->m_snake.clear();snk->makeSnake();snk->makeOneSnake();snk->Draw();SetTimer(1002, 500, 0);}void CSnakeGameDlg::OnBnClickedCancel(){CDialog::OnCancel();}void CSnakeGameDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值switch (nIDEvent){case 1002: {if (snk->move() == FALSE) {KillTimer(nIDEvent);m_start = 0;m_stop = 1;AfxMessageBox(L"游戏结束");}snk->Draw();break;}default:break;}CDialog::OnTimer(nIDEvent);}BOOL CSnakeGameDlg::PreTranslateMessage(MSG* pMsg){// TODO: 在此添加专用代码和/或调用基类if (pMsg->message == WM_KEYDOWN) {switch (pMsg->wParam){case VK_LEFT: {snk->alterDirect(LEFT);break;}case VK_RIGHT: {snk->alterDirect(RIGHT);break;}case VK_DOWN: {snk->alterDirect(DOWN);break;}case VK_UP: {snk->alterDirect(UP);break;}default:break;}return TRUE;}return CDialog::PreTranslateMessage(pMsg);}


0 0