当前位置:首页 > 代码 > 正文

mfc贪吃蛇代码(贪吃蛇mfc程序)

admin 发布:2022-12-19 23:36 143


本篇文章给大家谈谈mfc贪吃蛇代码,以及贪吃蛇mfc程序对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

MFC贪吃蛇编程小问题

无法将参数 1 从“const char [13]”转换为“const wchar_t *” c:\users\

类型不一样不可以转换哦, 一个是char ,一个是 wchar_t ,当然不能转换.

建议你学习炫彩界面库, 比MFC简单, 好多年不用MFC了.

求c++MFC贪吃蛇代码

#include "stdafx.h"

#include "SnakeGame.h"

#include "Resource.h"

#include "Rule.h"

#include "HeroDlg.h"

CSnakeGame::CSnakeGame()

{

m_nScore = 0;

m_psFood.x = 30;

m_psFood.y = 30;

m_nHighScore = 0;

}

CSnakeGame::~CSnakeGame()

{

}

// 消息映射表

BEGIN_MESSAGE_MAP( CSnakeGame, CWnd )

//{{AFX_MSG_MAP(CSnakeGame)

ON_WM_PAINT()

ON_WM_TIMER()

ON_WM_KEYUP()

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

//////////////////////////////////////////////////////////////////////////

// 初始化果实

//////////////////////////////////////////////////////////////////////////

void CSnakeGame::InitFoods()

{

int m_ysX,m_ysY;

while(1)

{

m_ysX=rand()%28; //随机生成横坐标使其与贪吃蛇的身体可以接上

m_ysY=rand()%28; //随机生成纵坐标使其与贪吃蛇的身体可以接上

for(int i=0;i=m_body.GetUpperBound();i++)

{

CPoint ysPoint1=m_body.GetAt(i); //获取贪吃蛇的身体坐标

if(ysPoint1.x!=m_ysX||ysPoint1.y!=m_ysY)//如果身体的横坐标或纵坐标与果实的横纵坐标相同

{

m_psFood = CPoint(m_ysX, m_ysY);//将随机出现的坐标记录为果实坐标

return;

}

}

}

}

//////////////////////////////////////////////////////////////////////////

// 设置游戏等级

//////////////////////////////////////////////////////////////////////////

void CSnakeGame::SetGameLevel(int level)

{

m_nlevel = level;

}

//////////////////////////////////////////////////////////////////////////

// 开始游戏函数

//////////////////////////////////////////////////////////////////////////

BOOL CSnakeGame::GameStart()

{

int nSleep = LOW_LEVEL_SLEEP;

char pszTmp[128] = {0};

switch(m_nlevel)

{

case GAME_LEVEL_HIGH:

nSleep = HIGH_LEVEL_SLEEP;

break;

case GAME_LEVEL_NOR:

nSleep = NOR_LEVEL_SLEEP;

break;

}

GetPrivateProfileString("HERO", "score", "0",

pszTmp, 127, ".\\hero.ini");

m_nHighScore = atoi(pszTmp);

SetTimer(1, nSleep, NULL);

InitGame();

return TRUE;

}

//////////////////////////////////////////////////////////////////////////

// 处理WM_PAINT消息

//////////////////////////////////////////////////////////////////////////

void CSnakeGame::OnPaint()

{

CPaintDC dc( this );

CDC MemDC;

MemDC.CreateCompatibleDC( dc );

// 装载背景

CBitmap bmp;

CPen pen;

bmp.LoadBitmap( IDB_BMP_BJ );

pen.CreatePen( PS_SOLID, 1, 0xff );

MemDC.SelectObject( bmp );

MemDC.SelectObject( pen );

MemDC.SetROP2( R2_NOTXORPEN );

CString ysStr; //定义字符串用于显示游戏时间得分等字

MemDC.SetBkMode(TRANSPARENT); //设置字体背景

MemDC.SetTextColor(67); //设置字体颜色

ysStr.Format("当前得分:%d",m_nScore); //初始化字符串

MemDC.TextOut(30,50,ysStr); //输出文本

switch(m_nlevel) //根据等级判断

{

case GAME_LEVEL_LOW: //如果是初级

ysStr.Format("当前等级: 初 级");

break;

case GAME_LEVEL_NOR: //如果是中级

ysStr.Format("当前等级: 中 级");

break;

case GAME_LEVEL_HIGH: //如果是高级

ysStr.Format("当前等级: 高 级");

break;

}

MemDC.TextOut(30,30,ysStr);

//绘制蛇的样式

CPen yspen;

yspen.CreatePen(1,1,RGB(255,255,255)); //定义白色画笔绘制蛇的边框

MemDC.SelectObject(yspen);

CBrush ysbrush;

//

int k=m_body.GetUpperBound()+2; //设置一个变量存储贪吃蛇的身体长度

if(k=10) //如果小于10,那么就为绿色

{

ysbrush.CreateSolidBrush(RGB(0,255,0));

MemDC.SelectObject(ysbrush);

//绘制果实

MemDC.Rectangle(

CRect(10+m_psFood.y*10,

120+m_psFood.x*10,

10+(m_psFood.y+1)*10,

120+(m_psFood.x+1)*10)

);

}

else if(k10k=20) //如果在10和20之间,那么就为绿色

{

ysbrush.CreateSolidBrush(RGB(0,0,255));

MemDC.SelectObject(ysbrush);

//绘制果实

MemDC.Rectangle(

CRect(10+m_psFood.y*10,

120+m_psFood.x*10,

10+(m_psFood.y+1)*10,

120+(m_psFood.x+1)*10)

);

}

else if(k20k=30) //如果在20和30之间,那么就为绿色

{

ysbrush.CreateSolidBrush(RGB(255,255,0));

MemDC.SelectObject(ysbrush);

//绘制果实

MemDC.Rectangle(

CRect(10+m_psFood.y*10,

120+m_psFood.x*10,

10+(m_psFood.y+1)*10,

120+(m_psFood.x+1)*10)

);

}

else //其余情况均为红色

{

ysbrush.CreateSolidBrush(RGB(255,0,0));

MemDC.SelectObject(ysbrush);

//绘制果实

MemDC.Rectangle(

CRect(10+m_psFood.y*10,

120+m_psFood.x*10,

10+(m_psFood.y+1)*10,

120+(m_psFood.x+1)*10)

);

}

//初始化点数组

for(int i=0;i=m_body.GetUpperBound();i++)

{

CPoint ysPoint=m_body.GetAt(i);

MemDC.Rectangle(

CRect(10+ysPoint.y*10,

120+ysPoint.x*10,

10+(ysPoint.y+1)*10,

120+(ysPoint.x+1)*10)

);

}

dc.BitBlt( 0, 0, 325, 425, MemDC,0, 0, SRCCOPY );

}

//////////////////////////////////////////////////////////////////////////

// 处理按键消息

//////////////////////////////////////////////////////////////////////////

void CSnakeGame::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)

{

switch(nChar)

{

case VK_UP: //按向上键

m_nDirect=DIREC_UP; //控制方向变量为DIREC_UP

break;

case VK_DOWN: //按向下键

m_nDirect=DIREC_DOWN; //控制方向变量为DIREC_DOWN

break;

case VK_LEFT: //按向左键

m_nDirect=DIREC_LEFT; //控制方向变量为DIREC_LEFT

break;

case VK_RIGHT: //按向右键

m_nDirect=DIREC_RIGHT; //控制方向变量为DIREC_RIGHT

break;

default:

break;

}

}

//////////////////////////////////////////////////////////////////////////

// 定时器响应函数

//////////////////////////////////////////////////////////////////////////

void CSnakeGame::OnTimer(UINT nIDEvent)

{

CPoint ysPoint=m_body.GetAt(0); //获取蛇身的第一个点坐标

BOOL bTag = FALSE; //定义判断死亡的变量

CRule rule; //游戏规则类

switch(m_nDirect) //根据键盘按下键来选择蛇移动的方向

{

case DIREC_DOWN: //方向变量向下

ysPoint.x++; //点纵坐标自加

break;

case DIREC_UP: //方向变量向上

ysPoint.x--; //点纵坐标自减

break;

case DIREC_RIGHT: //方向变量向右

ysPoint.y++; //点横坐标自加

break;

case DIREC_LEFT: //方向变量向左

ysPoint.y--; //点横坐标自减

break;

}

if(rule.IsOver(ysPoint, m_body)) //游戏结束

{

KillTimer(1); //关闭定时器

if(m_nScore m_nHighScore) //超过最高分

{

HeroWrite(); //写英雄榜

}

else

{

AfxMessageBox("游戏结束,你的分数太低了,没有能进入英雄榜");

}

}

else

{

m_body.InsertAt(0,ysPoint); //将新点添加到蛇的身体中

ReDrawBody(ysPoint); //重绘蛇的身体

if(ysPoint.x==m_psFood.xysPoint.y==m_psFood.y) //如果蛇的身体与果实坐标重合

{

int nlen=m_body.GetUpperBound();//获取蛇身体的长度

m_nScore = m_nlevel * (nlen-3)+999999+1;//统计分数

InitFoods(); //再出现下一个果实

Invalidate(); //窗口重绘

}

else

{

CPoint pt=m_body.GetAt(m_body.GetUpperBound());//将最后一个赋给pt

m_body.RemoveAt(m_body.GetUpperBound()); //将移出最后一个

ReDrawBody(pt); //重新绘制pt这点

}

}

}

//////////////////////////////////////////////////////////////////////////

// 初始化游戏

//////////////////////////////////////////////////////////////////////////

void CSnakeGame::InitGame()

{

m_body.RemoveAll();

m_body.Add(CPoint(3, 8));

m_body.Add(CPoint(3, 7));

m_body.Add(CPoint(3, 6));

m_body.Add(CPoint(3, 5));

srand((unsigned)time(NULL)); //初始化随机数生成器

m_nDirect = DIREC_RIGHT; //初始时向右

m_nScore = 0; //初始化分数

InitFoods(); //初始化果实函数

Invalidate(); //重绘窗口

}

//////////////////////////////////////////////////////////////////

//重绘指定点

//////////////////////////////////////////////////////////////////

void CSnakeGame::ReDrawBody(CPoint pt)

{

InvalidateRect(

CRect(10+pt.y*10,

120+pt.x*10,

10+(pt.y+1)*10,

120+(pt.x+1)*10)

);

}

//////////////////////////////////////////////////////////////////////////

// 英雄榜写入及弹出

//////////////////////////////////////////////////////////////////////////

void CSnakeGame::HeroWrite()

{

CHeroDlg dlg;

dlg.SetWriteFlg(TRUE); //设置可标志

dlg.m_level = m_nlevel; //设置等级

dlg.m_score = m_nScore; //设置分数

dlg.DoModal(); //弹出对话框

}

用mfc设计贪吃蛇游戏源代码,最好有解析

1.算法

1. 首先,用一个结构体数组来标记蛇的X位置和Y位置,还有每一节的方向。用一变量标识蛇的长度。

2. 在蛇非转弯的移动时用定时器来自动移动,不管蛇是哪种形状,都只需在每次移动时先将各节向后移动(蛇尾舍弃,新的蛇尾由蛇尾的上一节代替):如蛇本身为snake[0]到snake[3],就是将snake[0]到snake[2]一起移动到snake[1]到snake[3]: 将 snake[2]的XY坐标赋值snake[3]的XY坐标 ,snake[1]的XY坐标 赋值给snake[2]的XY坐标 ,snake[0]的XY坐标 赋值给snake[1]的XY坐标 。再判断蛇头的方向,然后将蛇头顺着这个方向向前移动一格就是蛇头snake[0]的XY坐标 。而蛇除蛇头外各节的方向由函数SetDirection()来确定(明显此种情况,蛇头的方向不变),SetDirection()的思想是根据蛇的每一节的前一节的相对位置来确定本节的方向。(其实这个函数是多余的,真正用到的只有蛇头的方向)。

3. 蛇在转弯时,也是各节一次向后移,蛇头的位置顺着转弯的方向移动,方向由转弯方向确定。

4. 蛇在吃到食物时,长度加一,蛇头的位置变成食物的位置,方向不变。蛇的本身每节的XY位置都向后移。如蛇本身为snake[0]到snake[3], 就是将snake[0]到snake[3]一起移动到snake[1]到snake[4]。

5. 基于对话框的应用程序,响应按键消息需在PreTranslateMessage里,而不是像文档视图模式那样在OnKeyDown里响应。

6. 每次蛇在转弯时只能有一种方向按键能响应,即要么左右转,要么上下转。蛇头方向向左或向右时,只能上下转;蛇头方向向上或向下时,只能左右转。

7. 食物的位置由rand函数随机产生。

2.添加如下函数和变量

1 void HuaFangGe(int bianChang, int gridShumu); //如在400*400的方格里绘制20*20个格子,则bianChang = 400;gridShumu = 20;

2 void InitSnackSite(); //初始化蛇的位置

3

4 int snakeLength; //表示蛇的长度

5 int foodX; //食物的X位置

6 int foodY; //食物的Y位置

7 bool start; //标志是否开始

8 bool reStart; //标志是否重新开始

9

10 struct SNAKE

11 {

12 int x;

13 int y;

14 char direction; //某位置的方向为前一个位置相对于该位置的方向,由SetDirection()确定

15 }snake[200];

16

17 void DrawRed(int x, int y); //指定点0*0到20*20,画相应颜色,下同(红头绿身蓝尾)

18 void DrawGreen(int x, int y);

19 void DrawBlue(int x, int y);

20 void DrawBlack(int x, int y); //根据SetFoodXY()所确定的foodX和foodY来画食物。

21

22 void DrawSnakeFood(); //根据数组snakeSite数组的标识信息类绘制蛇的形状位置颜色。

23 void SetFoodXY(); //随机绘制食物的XY位置

24

25 bool leftRight; //确定是否能上下走(蛇本身在上下走,再按上下就无用了)

26 bool upDown; //确定是否能左右走(蛇本身在左右走,再按左右就无用了)

27

28 void MoveSite(); //蛇移动过程中,设置“除蛇头”外各节的x和y的位置,顺序前移。

29 void SetDirection(); //蛇移动过程中,设置“除蛇头”外各节的方向

30

31 void TurnLeft(); //当蛇左转时

32 void TurnRight(); //当蛇右转时

33 void GoUp(); //当蛇向上时

34 void GoDown(); //当蛇向下时

可以参考这里:

【原创】基于MFC的 贪吃蛇 小游戏的实现,附源码下载

mfc贪吃蛇代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于贪吃蛇mfc程序、mfc贪吃蛇代码的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/30524.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载