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

mfc贪吃蛇代码(mfc贪吃蛇源代码)

admin 发布:2022-12-19 23:11 146


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

本文目录一览:

用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的 贪吃蛇 小游戏的实现,附源码下载

求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 从“const char [13]”转换为“const wchar_t *” c:\users\

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

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

求在VC++6.0中运行的贪吃蛇代码

#包括 stdio, h

#包括 process。H

#包括 Windows。H

#包括 conio。H

#包括时间。H

#包括 stdlib。H

#defineWIDTH40

#defineHEIGH12

枚举方向{//方向

离开了,

对的,

向上

};

StructFood{//食品

Intx;

Inty;

};

{//绘制蛇体

intx;

inty;

structNode*next;

};

structSnake{//蛇属性du

intlenth;//长度

enumdirectiondir;//方向

};

structFood*food;//食物

structSnake*snake;//蛇属性

structNode*snode,*tail;//蛇身

intSPEECH=200;

intscore=0;//分数

intsmark=0;//吃食物标zhi记

inttimes=0;

intSTOP=0;

voidInitfood();//产生食物

voidInitsnake();//构造snake

voidEatfood();//头部前进

voidAddnode(intx,inty);//增加蛇身

voiddisplay(structNode*shead);//显示蛇身坐dao标

voidmove();//蛇移动

voiddraw();//画蛇

voidHomepage();//主页

voidkeybordhit();//监控键盘按键

voidAddtail();//吃到食物

voidgotoxy(intx,inty)//定位光标

COORDpos;

pos.X=x-1;

pos.Y=y-1;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);

voidInitsnake()//构造snake

inti;

snake=(structSnake*)malloc(sizeof(structSnake));

tail=(structNode*)malloc(sizeof(structNode));

food=(structFood*)malloc(sizeof(structFood));

snake-lenth=5;//初始长度 5

snake-dir=RIGHT;//初始蛇头方向 右

for(i=2;i=snake-lenth+2;i++)//增加 5 个结点

Addnode(i,2);

voidInitfood()//产生食物

structNode*p=snode;

intmark=1;

srand((unsigned)time(NULL));//以时间为种子产生随机数

while(1)

food-x=rand()%(WIDTH-2)+2;//食物X坐标

food-y=rand()%(HEIGH-2)+2;//食物Y坐标

while(p!=NULL)

if((food-x==p-x)(food-y==p-y))//如果食物产生在蛇身上

{//则重新生成食物

mark=0;//食物生成无效

break;

p=p-next;

if(mark==1)//如果食物不在蛇身上,生成食物,否则重新生成食物

gotoxy(food-x,food-y);

printf("%c",3);

break;

mark=1;

p=snode;

voidmove()//移动

structNode*q,*p=snode;

if(snake-dir==RIGHT)

Addnode(p-x+1,p-y);

if(smark==0)

while(p-next!=NULL)

q=p;

p=p-next;

q-next=NULL;

free(p);

if(snake-dir==LEFT)

Addnode(p-x-1,p-y);

if(smark==0)

while(p-next!=NULL)

q=p;

p=p-next;

q-next=NULL;

free(p);

if(snake-dir==UP)

Addnode(p-x,p-y-1);

if(smark==0)

while(p-next!=NULL)

q=p;

p=p-next;

q-next=NULL;

free(p);

if(snake-dir==DOWN)

Addnode(p-x,p-y+1);

if(smark==0)

while(p-next!=NULL)

q=p;

p=p-next;

q-next=NULL;

free(p);

voidAddnode(intx,inty)//增加蛇身

structNode*newnode=(structNode*)malloc(sizeof(structNode));

structNode*p=snode;

newnode-next=snode;

newnode-x=x;

newnode-y=y;

snode=newnode;//结点加到蛇头

if(x2||x=WIDTH||y2||y=HEIGH)//碰到边界

STOP=1;

gotoxy(10,19);

printf("撞墙,游戏结束,任意键退出!\n");//失败

_getch();

free(snode);//释放内存

free(snake);

exit(0);

while(p!=NULL)//碰到自身

if(p-next!=NULL)

if((p-x==x)(p-y==y))

STOP=1;

gotoxy(10,19);

printf("撞到自身,游戏结束,任意键退出!\n");//失败

_getch();

free(snode);//释放内存

free(snake);

exit(0);

p=p-next;

voidEatfood()//吃到食物

Addtail();

score++;

voidAddtail()//增加蛇尾

structNode*newnode=(structNode*)malloc(sizeof(structNode));

structNode*p=snode;

tail-next=newnode;

newnode-x=50;

newnode-y=20;

newnode-next=NULL;//结点加到蛇头

tail=newnode;//新的蛇尾

voiddraw()//画蛇

structNode*p=snode;

inti,j;

while(p!=NULL)

gotoxy(p-x,p-y);

printf("%c",2);

tail=p;

p=p-next;

if(snode-x==food-xsnode-y==food-y)//蛇头坐标等于食物坐标

smark=1;

Eatfood();//增加结点

Initfood();//产生食物

if(smark==0)

gotoxy(tail-x,tail-y);//没吃到食物清除之前的尾结点

printf("%c",'');//如果吃到食物,不清楚尾结点

else

times=1;

if((smark==1)(times==1))

gotoxy(tail-x,tail-y);//没吃到食物清除之前的尾结点

printf("%c",'');//如果吃到食物,不清楚尾结点

smark=0;

gotoxy(50,12);

printf("食物: %d,%d",food-x,food-y);

gotoxy(50,5);

printf("分数:%d",score);

gotoxy(50,7);

printf("速度:%d",SPEECH);

gotoxy(15,14);

printf("按o键加速");

gotoxy(15,15);

printf("按p键减速");

gotoxy(15,16);

printf("按空格键暂停");

voidHideCursor()//隐藏光标

CONSOLE_CURSOR_INFOcursor_info={1,0};

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), cursor_info);

voidHomepage()//绘主页

intx,y;

HideCursor();//隐藏光标

printf("----------------------------------------\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("|\t\t\t\t|\n");

printf("----------------------------------------\n");

gotoxy(5,13);

printf("任意键开始游戏!按W.A.S.D控制方向");

_getch();

Initsnake();

Initfood();

gotoxy(5,13);

printf("");

voidkeybordhit()//监控键盘

charch;

if(_kbhit())

ch=getch();

switch(ch)

case'W':

case 'w':if(snake-dir==DOWN)//如果本来方向是下,而按相反方向无效

break;

else

snake-dir=UP;break;

case'A':

case 'a':if(snake-dir==RIGHT)//如果本来方向是右,而按相反方向无效

break;

else

snake-dir=LEFT;break;

case'S':

case 's':if(snake-dir==UP)//如果本来方向是上,而按相反方向无效

break;

else

snake-dir=DOWN;break;

case'D':

case 'd':if(snake-dir==LEFT)//如果本来方向是左,而按相反方向无效

break;

else

snake-dir=RIGHT;break;

case'O':

case'o':

if(SPEECH=150)//速度加快

SPEECH=SPEECH-50;

break;

case'P':

case'p':

if(SPEECH=400)//速度减慢

SPEECH=SPEECH+50;

break;

case''://暂停

gotoxy(15,18);

printf("游戏已暂停,按任意键恢复游戏");

system("pausenul");

gotoxy(15,18);

printf("");

break;

default:break;

intmain(void)//程序入口

Homepage();

while(!STOP)

keybordhit();//监控键盘按键

move();//蛇的坐标变化

draw();//蛇的重绘

Sleep(SPEECH);//暂时挂起线程

return0;

扩展资料:

注意事项:

1.代码将源信息转换为易于通信或存储的符号。译码(译码)是还原和译码的过程,它将代码符号转换为接受者能够理解的形式。

2.编码的原因之一是为了在普通语言(口头或书面)难以实现的情况下进行交流。例如,一面旗帜可以用一个特定的标记来表达一个特定的信息,而站在远处的另一个人可以解释标记来重现该信息。

关于mfc贪吃蛇代码和mfc贪吃蛇源代码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

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

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


取消回复欢迎 发表评论:

分享到

温馨提示

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

联系我们反馈

立即下载