求救,急,在线等待,拜托大家!(分不够可以加)

gamezealot 2004-08-09 09:19:15
要求:一个很简单的贪吃蛇!
1.整个界面(mfc)都要成为蛇的运行范围。
2.菜单中一个增加结点按钮,一个删除按钮。
3.上,下,左,右,控制蛇的方向。开始运行时向一个方向运动。
********************************************************
下面是我的代码:只实现了一部分
1.建立SDI文件。
2.在***view.cpp里
struct SNAKE
{
int x;
int y;
int flag;//1up,2down,3left,4right;
int lenth;
struct SNAKE *next;
}*tryit;
struct SNAKE *head,*insert;
3.构造函数里
tryit=(struct SNAKE*)malloc(sizeof(struct SNAKE));
tryit->flag=2;
tryit->lenth=1;
tryit->x=0;tryit->y=0;
4.***view::OnDraw()里
CBrush brush;
brush.CreateSolidBrush(RGB(0,0,0));
CRect rt;
rt.SetRect(0,0,400,300);
pDC->FillRect(&rt,&brush);
brush.DeleteObject();
GetClientRect(&rt);

CBrush nodbrush;
nodbrush.CreateSolidBrush(RGB(0,0,255));
pDC->SelectObject(&nodbrush);
CRect rt1;
rt1.SetRect(tryit->x,tryit->y,tryit->x+10,tryit->y+10);
pDC->FillRect(&rt1,&nodbrush);
nodbrush.DeleteObject();
SetTimer(1,300,NULL);
5.view::OnTimer()里
switch(tryit->flag)
{
case 1:
if(tryit->y<=0)
tryit->y=0;
else
tryit->y-=10;
DrawSnake(tryit->x,tryit->y,TRUE,tryit->flag);
break;
case 2:
if(tryit->y>=290)
tryit->y=290;
else
tryit->y+=10;
DrawSnake(tryit->x,tryit->y,TRUE,tryit->flag);
break;
case 3:
if(tryit->x<=0)
tryit->x=0;
else
tryit->x-=10;
DrawSnake(tryit->x,tryit->y,TRUE,tryit->flag);
break;
case 4:
if(tryit->x>=390)
tryit->x=390;
else
tryit->x+=10;
DrawSnake(tryit->x,tryit->y,TRUE,tryit->flag);
break;
}
6.onkeydown()里
switch(nChar)
{
case VK_UP:
tryit->flag=1;
break;
case VK_DOWN:
tryit->flag=2;
break;
case VK_LEFT:
tryit->flag=3;
break;
case VK_RIGHT:
tryit->flag=4;
break;
}
7.建立了一个drawsnake()函数,画蛇的一部分。

***View::DrawSnake(int x, int y, BOOL bErase,int nDir)
{ CDC* pDC=GetDC();
CBrush brush,cleanbrush;
CRect rt1;

brush.CreateSolidBrush(RGB(0,0,255));
pDC->SelectObject(&brush);
rt1.SetRect(x,y,x+10,y+10);
pDC->FillRect(&rt1,&brush);
brush.DeleteObject();
if(bErase)
{
cleanbrush.CreateSolidBrush(RGB(0,0,0));
pDC->SelectObject(&cleanbrush);
switch(nDir)
{
case 1:rt1.SetRect(x,y+10,x+10,y+20);break;//up;
case 2:rt1.SetRect(x,y-10,x+10,y);break;//down
case 3:rt1.SetRect(x+10,y,x+20,y+10);break;//left
case 4:rt1.SetRect(x-10,y,x,y+10);break;//right
}
pDC->FillRect(&rt1,&cleanbrush);
cleanbrush.DeleteObject();
}
}

我只是实现了一开始一个蛇结点运动,然后可以用方向控制,但增加和删除结点怎么实现,请大家帮帮忙,给多少分都没所谓。
...全文
157 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzjlp 2004-08-23
  • 打赏
  • 举报
回复
ft,今天突然发现CSDN上早就有这个程序了。你自己去下吧!
http://www.csdn.net/cnshare/soft/17/17173.shtm
lzjlp 2004-08-11
  • 打赏
  • 举报
回复
不会吧,100多行?定义数据结构就得几十行了!谁这么强!?同情你啊。。。有时间帮你想想吧!可得也得好几天,不知道还来不来得及!呵呵
gamezealot 2004-08-09
  • 打赏
  • 举报
回复
我想做一个链表,可我不会,所以就用了结构了!
谁能帮我用链表做做,大分赠送!
snaill 2004-08-09
  • 打赏
  • 举报
回复
你写的代码真是奇怪,做了一个链表的结构却没有链表的操作,那要这个链表干什么?

所谓增加删除就是在链表中增加删除,然后再重画时输出整个链表的内容。这样才符合你定义的结构嘛。可是你的做法未免奇怪了,做了一个链表去当一个结构来用,那当然只能显示一个节点拉
gamezealot 2004-08-09
  • 打赏
  • 举报
回复
对,就是说,增加后的结点和删除后的结点也是受方向键控制的!
上面的代码,没什么大错,大家可以试试!
然后修改一下,帮帮我呀,要做不出来就会被解雇的,郁闷哦...
flyelf 2004-08-09
  • 打赏
  • 举报
回复
增加和删除节点?是指链表中的节点?tryit这个链表?
yeedward 2004-08-09
  • 打赏
  • 举报
回复
删除没必要吧
gamezealot 2004-08-09
  • 打赏
  • 举报
回复
TO:flyelf(空谷清音) 和hooliganstreet()
就是要求自己写呀,拜托大家给看看!
hooliganstreet 2004-08-09
  • 打赏
  • 举报
回复
贪吃蛇要一个增加结点按钮,一个删除按钮做什么>
flyelf 2004-08-09
  • 打赏
  • 举报
回复
何苦非要自己写一个链表呢,mfc中提供了CList来实现,stl中有list或者vector都可以
gamezealot 2004-08-09
  • 打赏
  • 举报
回复
谢谢上面的兄弟,我说详细点吧
是这样的:
老板对我的考核方面:
1。CDC ClientDC,使得MFC的SDI中的界面全有效(蛇的活动范围)。
2。typedef struct snake 考核结构数组。
3。动态分配内存,malloc
4。键盘控制,考核classwizard。
******************************************************************
具体要求:
蛇能在整个视图中活动,按方向键改变方向,按菜单中的增加结点,蛇增加一节,删除则减少

一节。增加和删除后蛇的移动应可以由键盘控制。
他说这个实现非常简单,基本上100多行代码就可以搞定了,可我郁闷呀,~~~~~~~~~~~~~~~~
看了别人好多代码,写成了,他说我写的太复杂(400~500行),让我重做~~~~~~~~~~~~~~~~~~~~
lzjlp 2004-08-09
  • 打赏
  • 举报
回复
看了一下你的代码感觉实现起来有点难!和你说说我以前的算法吧希望能对你有帮助!现在也在忙系统没有时间帮你做出来!呵呵!见下:
首先定义一个蛇运动范围的数组int MoveArea[][];
就是把你的要蛇在里面运动的区域划成正好是蛇结点的大小的一块块的形状,蛇的身体你自己用画图工具画好大小定好,运动的区域也定好!映射到MoveArea数据。比如:MoveArea[i][j]=0表示此处没有蛇节点,1表是蛇身,2,表是蛇头,3表示蛇尾!到时蛇的显示运动就对MoveArea数组进行操作就行了!蛇的方向由程序控制应该不能用于蛇的属性当中。蛇的定义如下:
蛇节点://整条蛇是由节点组成的
struct SNAKENODE
{
int i;
int j;//蛇的身体上的这个节点所在位置MoveArea[i][j]!
struct SNAKENODE *next;
}SNAKENODE;
struct SNAKE
{
SNAKENODE *head;//蛇头
SNAKENODE *hail;//蛇尾
int length;//蛇的长度
}*SNAKE;
蛇的增长就是单循环链表的增节点操作了,蛇的运动就是更改各节点的i,j并设定MoveArea的对应值。而蛇的显示就是扫描数组MoveArea的值然后对应地画到区域上去了!而蛇的运动方向则完全是由对蛇的i,j增减来实现的方便多了!!!
lzjlp 2004-08-09
  • 打赏
  • 举报
回复
学过数据结构没有!(没学就去找本看看,清华那本到处都是!)用里面的动态循环链表就行了。连增删节点的方法都有了!我以前用DEPHI自己也做过一个贪吃蛇!就是用动态循环链表做的很容易就搞定了!而且蛇头和蛇尾(就是表头表尾)不用动!

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧