注册 登录
编程论坛 C图形专区

贪食蛇中蛇的移动问题

leopardxp 发布于 2007-07-26 11:31, 2709 次点击

刚刚开始学习用tc写一些图形程序,想自己编一个贪食蛇,可是刚开始蛇的默认向右边移动就没搞定~~我的思路是在蛇尾画背景色,蛇头向前移动,但是我按这个思路写了下面几行,试了一下,蛇尾还是不会动,只有蛇头会向右移动,成一条射线了。请各位指点后辈!不胜感激~~~~


struct thesnake
{
int x[maxsize];
int y[maxsize];
int len;/*蛇的长度*/
int life;
int direction;
}snake;


for(i=startplace;i<=range.rightside+10;i+=10)
{
setcolor(0);/*1是蛇身的颜色*/
bar(i,snake.y[0],i+10,snake.y[0]+10);
snake.x[0]=i;/*蛇头*/
snake.y[0]=startplace;/*startplace是开始移动的位置*/
ake.x[snake.len]=startplace-i;/*蛇尾*/
setcolor(2);/*2是背景色,用背景色重画蛇尾*/
bar(snake.x[snake.len],snake.y[0],snake.x[snake.len]+10,snake.y[0]+10);
delay(70000);
}

11 回复
#2
anlogo2007-07-26 17:50

觉得重画背景有问题:
bar(snake.x[snake.len],snake.y[0],snake.x[snake.len]+10,snake.y[0]+10);

#3
anlogo2007-07-26 17:51
把所有程序贴出来才看得明白~~
#4
leopardxp2007-07-27 20:59
回复:(anlogo)把所有程序贴出来才看得明白~~

我把程序又改了一下,以下面这个为准,但是还是有同样的问题~

/*这就是关键部分,程序还没有写完,但是这些已经能够测试蛇的移动了,可以编译,问题就是蛇尾不会移动!!!

说明:蛇每一节的尺寸为10*10的正方形,目前该程序完成的功能仅为初始画出蛇并默认向右移动*/
#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#define esc 0x011b
#define left 0x4b00
#define right 0x4d00
#define up 0x4800
#define down 0x5000
#define maxsize 1000
struct therange
{
int top;
int bottom;
int leftside;
int rightside;
}range;

struct thesnake
{
int x[maxsize];
int y[maxsize];
int len;
int life;
int direction;
}snake;

void drawrange()/*画边界*/
{
range.top=50;
range.bottom=400;
range.leftside=50;
range.rightside=400;
setcolor(4);
bar(40,40,50,410);
bar(50,400,410,410);
bar(40,40,410,50);
bar(400,50,410,410);
}


main()
{
int x;
int y;
int i,j;
int startplace;
int gdrive,gmode;
gdrive=DETECT;
initgraph(&gdrive,&gmode,"");

setbkcolor(2);

drawrange();


startplace=250;/*起始位置*/
snake.len=2;/*蛇的最后一节的相对位置*/
snake.x[0]=startplace;/*蛇头x坐标*/
snake.y[0]=startplace;/*蛇头y坐标*/
snake.x[snake.len]=snake.x[0]-30;/*蛇尾的x坐标,开始为一个三节长的蛇*/
snake.y[snake.len]=snake.x[0];/*蛇尾的y坐标*/
setcolor(0);/*蛇身的颜色*/
bar(snake.x[snake.len],snake.y[snake.len],snake.x[0],snake.y[0]);/*画出初始三节的蛇*/


while(!kbhit())
{
delay(700000);
snake.x[0]+=10;/*新的蛇头的x坐标*/
setcolor(0);/*画出新的蛇头*/
bar(snake.x[0],snake.y[0],snake.x[0]+10,snake.y[0]+10);
setcolor(2);/*用背景色画蛇尾*/
bar(snake.x[snake.len],snake.y[snake.len],snake.x[snake.len]+10,snake.y[snake.len]+10);
snake.x[snake.len]+=10;/*画完当前蛇尾后自动保存下一次循环蛇尾的位置*/

}

getch();
closegraph();

}



[此贴子已经被作者于2007-7-27 21:05:54编辑过]

#5
奔跑的鸟2007-07-27 22:53
只有本站会员才能查看附件,请 登录

lz看看这个,应该有帮助
#6
leopardxp2007-07-28 12:11
回复:(奔跑的鸟)[upload=rar]viewFile.asp?ID=2494...
多谢楼上啊~呵呵~那个附件里的贪食蛇源码我见过的,没有太仔细看,我想先按自己的思路编,弄好以后再看看高手的~所以我想知道我的蛇尾怎么就动不了
#7
anlogo2007-07-29 10:36
发现setcolor()用不了,原因是出现颜色叠加现象
在你的程序中,设置了背景色为绿色
当使用bar函数绘图时,无论前景色设置什么颜色,绘出的图象颜色总为白色
望高手指教.
给LZ一个建议放弃使用graphsic库函数
直接对显存操作
#8
leopardxp2007-07-29 13:02
回复:(anlogo)发现setcolor()用不了,原因是出现颜色...

是的,我也发现这个问题了,换什么颜色都不行~~~~~~~哪位高手解释一下?

[此贴子已经被作者于2007-7-29 16:48:22编辑过]

#9
奔跑的鸟2007-07-29 18:10
错误不少
startplace=250;/*起始位置*/
snake.len=2;/*蛇的最后一节的相对位置*/
snake.x[0]=startplace;/*蛇头x坐标*/
snake.y[0]=startplace;/*蛇头y坐标*/
snake.x[snake.len]=snake.x[0]-30;/*蛇尾的x坐标,开始为一个三节长的蛇*/
snake.y[snake.len]=snake.x[0];/*蛇尾的y坐标*/
setcolor(0);/*蛇身的颜色*/
bar(snake.x[snake.len],snake.y[snake.len],snake.x[0],snake.y[0]);/*画出初始三节的蛇*/这里画不出原始的三节蛇
snake.x[0]+=10;/*新的蛇头的x坐标*/
setcolor(0);/*画出新的蛇头*/
bar(snake.x[0],snake.y[0],snake.x[0]+10,snake.y[0]+10);
这里蛇头坐标不对,画出来是断的
蛇尾不动的原因:你不设置填充模式bar函数怎么能正常啊?????setfillstyle(1 , 2);加上这个就行了........

[此贴子已经被作者于2007-7-29 18:11:15编辑过]

#10
leopardxp2007-07-29 20:20
回复:(奔跑的鸟)错误不少startplace=250;/*起始位置...

我用蓝色标记,红色是奔跑的鸟的标记

snake.x[snake.len]=snake.x[0]-30;/*蛇尾的x坐标,开始为一个三节长的蛇*/
snake.y[snake.len]=snake.x[0];/*蛇尾的y坐标*/
setcolor(0);/*蛇身的颜色*/
bar(snake.x[snake.len],snake.y[snake.len],snake.x[0],snake.y[0]);/*画出初始三节的蛇*/这里画不出原始的三节蛇
开始我画了一条10*30的bar,所以认为它是三节的啊~

snake.x[0]+=10;/*新的蛇头的x坐标*/
setcolor(0);/*画出新的蛇头*/
bar(snake.x[0],snake.y[0],snake.x[0]+10,snake.y[0]+10);
这里蛇头坐标不对,画出来是断的
蛇头坐标我看不出来怎么错了啊,但运行发现确实不对~能详细点解释一下吗?十分感谢!

[此贴子已经被作者于2007-7-29 20:22:00编辑过]

#11
奔跑的鸟2007-07-29 20:30

第一个地方,你的蛇身太窄了bar(snake.x[snake.len],snake.y[snake.len],snake.x[0],snake.y[0]+10);/这样就正常了
蛇头你先加了个10,就已经在原来蛇头的前方10单位处,你后来在绘制图形时候以原来蛇头前方10单位为起点画了一个方型,自然是断的了

#12
leopardxp2007-07-29 21:04
回复:(奔跑的鸟)第一个地方,你的蛇身太窄了bar(sna...

谢谢“大鸟”和“anlogo我修改了一下,终于会动了~
现在把我的错误总结一下:

1.蛇身太窄:bar(snake.x[snake.len],snake.y[snake.len],snake.x[0],snake.y[0] +10);我粗心大意

2.setcolor设置的是画笔的颜色,而对bar函数填充,应该使用setfillstyle(),这也解释了anlogo的疑问。

3.while循环第二句,蛇头先加了个10,就已经在原来蛇头的前方10单位处,后来在绘制图形时候以原来蛇头前方10单位为起点画了一个方型,自然是断的了。

[此贴子已经被作者于2007-7-29 21:06:52编辑过]

1