贪食蛇中蛇的移动问题
<P>刚刚开始学习用tc写一些图形程序,想自己编一个贪食蛇,可是刚开始蛇的默认向右边移动就没搞定~~[em08]我的思路是在蛇尾画背景色,蛇头向前移动,但是我按这个思路写了下面几行,试了一下,蛇尾还是不会动,只有蛇头会向右移动,成一条射线了。[em03]请各位指点后辈!不胜感激~~~~[em01]<BR><BR></P><P><BR>struct thesnake<BR>{<BR>int x[maxsize];<BR>int y[maxsize];<BR>int len;/*蛇的长度*/<BR>int life;<BR>int direction;<BR>}snake;</P>
<P><BR> </P>
<P>for(i=startplace;i<=range.rightside+10;i+=10)<BR>{<BR>setcolor(0);/*1是蛇身的颜色*/<BR>bar(i,snake.y[0],i+10,snake.y[0]+10);<BR>snake.x[0]=i;/*蛇头*/<BR>snake.y[0]=startplace;/*startplace是开始移动的位置*/<BR>ake.x[snake.len]=startplace-i;/*蛇尾*/<BR>setcolor(2);/*2是背景色,用背景色重画蛇尾*/<BR>bar(snake.x[snake.len],snake.y[0],snake.x[snake.len]+10,snake.y[0]+10);<BR>delay(70000);<BR>}</P>
回复:(anlogo)把所有程序贴出来才看得明白~~
<P>我把程序又改了一下,以下面这个为准,但是还是有同样的问题~<br></P><P>/*这就是关键部分,程序还没有写完,但是这些已经能够测试蛇的移动了,可以编译,问题就是蛇尾不会移动!!!<br></P>
<P>说明:蛇每一节的尺寸为10*10的正方形,目前该程序完成的功能仅为初始画出蛇并默认向右移动*/<br>#include<stdio.h><br>#include<conio.h><br>#include<graphics.h><br>#define esc 0x011b<br>#define left 0x4b00<br>#define right 0x4d00<br>#define up 0x4800<br>#define down 0x5000<br>#define maxsize 1000<br>struct therange<br>{<br>int top;<br>int bottom;<br>int leftside;<br>int rightside;<br>}range;</P>
<P>struct thesnake<br>{<br>int x[maxsize];<br>int y[maxsize];<br>int len;<br>int life;<br>int direction;<br>}snake;</P>
<P>void drawrange()/*画边界*/<br>{<br>range.top=50;<br>range.bottom=400;<br>range.leftside=50;<br>range.rightside=400;<br>setcolor(4);<br>bar(40,40,50,410);<br>bar(50,400,410,410);<br>bar(40,40,410,50);<br>bar(400,50,410,410);<br>}</P>
<P><br>main()<br>{<br>int x;<br>int y;<br>int i,j;<br>int startplace;<br>int gdrive,gmode;<br>gdrive=DETECT;<br>initgraph(&gdrive,&gmode,"");</P>
<P>setbkcolor(2);</P>
<P>drawrange();</P>
<P><br>startplace=250;/*起始位置*/<br>snake.len=2;/*蛇的最后一节的相对位置*/<br>snake.x[0]=startplace;/*蛇头x坐标*/<br>snake.y[0]=startplace;/*蛇头y坐标*/<br>snake.x[snake.len]=snake.x[0]-30;/*蛇尾的x坐标,开始为一个三节长的蛇*/<br>snake.y[snake.len]=snake.x[0];/*蛇尾的y坐标*/<br>setcolor(0);/*蛇身的颜色*/<br>bar(snake.x[snake.len],snake.y[snake.len],snake.x[0],snake.y[0]);/*画出初始三节的蛇*/</P>
<P><br>while(!kbhit())<br>{<br>delay(700000);<br>snake.x[0]+=10;/*新的蛇头的x坐标*/<br>setcolor(0);/*画出新的蛇头*/<br>bar(snake.x[0],snake.y[0],snake.x[0]+10,snake.y[0]+10);<br>setcolor(2);/*用背景色画蛇尾*/<br>bar(snake.x[snake.len],snake.y[snake.len],snake.x[snake.len]+10,snake.y[snake.len]+10);<br>snake.x[snake.len]+=10;/*画完当前蛇尾后自动保存下一次循环蛇尾的位置*/</P>
<P>}</P>
<P>getch();<br>closegraph();</P>
<P>}</P>
<P></P>
[align=right][color=#000066][此贴子已经被作者于2007-7-27 21:05:54编辑过][/color][/align]
[attach]24940[/attach]<BR>lz看看这个,应该有帮助
回复:(奔跑的鸟)[upload=rar]viewFile.asp?ID=2494...
多谢楼上啊~呵呵[em01]~那个附件里的贪食蛇源码我见过的,没有太仔细看,我想先按自己的思路编,弄好以后再看看高手的~所以我想知道我的蛇尾怎么就动不了[em11] 发现setcolor()用不了,原因是出现颜色叠加现象<BR>在你的程序中,设置了背景色为绿色<BR>当使用bar函数绘图时,无论前景色设置什么颜色,绘出的图象颜色总为白色<BR>望高手指教.<BR>给LZ一个建议放弃使用graphsic库函数<BR>直接对显存操作回复:(anlogo)发现setcolor()用不了,原因是出现颜色...
<P>是的,我也发现这个问题了,换什么颜色都不行~~~~~~~哪位高手解释一下?[em13]</P>[align=right][color=#000066][此贴子已经被作者于2007-7-29 16:48:22编辑过][/color][/align]
<FONT color=#ff0000>错误不少</FONT><br>startplace=250;/*起始位置*/<br>snake.len=2;/*蛇的最后一节的相对位置*/<br>snake.x[0]=startplace;/*蛇头x坐标*/<br>snake.y[0]=startplace;/*蛇头y坐标*/<br>snake.x[snake.len]=snake.x[0]-30;/*蛇尾的x坐标,开始为一个三节长的蛇*/<br>snake.y[snake.len]=snake.x[0];/*蛇尾的y坐标*/<br>setcolor(0);/*蛇身的颜色*/<br>bar(snake.x[snake.len],snake.y[snake.len],snake.x[0],snake.y[0]);/*画出初始三节的蛇*/<FONT color=#ff0000>这里画不出原始的三节蛇<br></FONT><FONT color=#000000><FONT color=#ff0000>snake.x[0]+=10</FONT>;/*新的蛇头的x坐标*/<br>setcolor(0);/*画出新的蛇头*/<br>bar(snake.x[0],snake.y[0],<FONT color=#ff0000>snake.x[0]+10</FONT>,snake.y[0]+10);</FONT><FONT color=#ff0000>这里蛇头坐标不对,画出来是断的<br></FONT><FONT style="BACKGROUND-COLOR: #ffff00" color=#ff0000>蛇尾不动的原因:你不设置填充模式bar函数怎么能正常啊?????setfillstyle(1 , 2);加上这个就行了........</FONT>
[align=right][color=#000066][此贴子已经被作者于2007-7-29 18:11:15编辑过][/color][/align]
回复:(奔跑的鸟)错误不少startplace=250;/*起始位置...
<P>我用蓝色标记,红色是奔跑的鸟的标记<br><br>snake.x[snake.len]=<FONT color=#0000ff>snake.x[0]-30;/*蛇尾的x坐标,开始为一个三节长的蛇*/<br></FONT>snake.y[snake.len]=snake.x[0];/*蛇尾的y坐标*/<br>setcolor(0);/*蛇身的颜色*/<br>bar(<FONT color=#0033ff>snake.x[snake.len],</FONT>snake.y[snake.len],snake.x[0],snake.y[0]);/*画出初始三节的蛇*/<FONT color=#ff0000>这里画不出原始的三节蛇<br></FONT><FONT style="BACKGROUND-COLOR: #66ff00" color=#0000ff>开始我画了一条10*30的bar,所以认为它是三节的啊~<br></FONT></P><P><FONT color=#0000ff><FONT color=#000000><FONT color=#ff0000>snake.x[0]+=10</FONT>;/*新的蛇头的x坐标*/<br>setcolor(0);/*画出新的蛇头*/<br>bar(snake.x[0],snake.y[0],<FONT color=#ff0000>snake.x[0]+10</FONT>,snake.y[0]+10);</FONT><FONT color=#ff0000>这里蛇头坐标不对,画出来是断的<br></FONT></FONT><FONT color=#0000ff><FONT style="BACKGROUND-COLOR: #00ff33">蛇头坐标我看不出来怎么错了啊,但运行发现确实不对~能详细点解释一下吗?十分感谢![em01]<br></FONT></P></FONT>
[align=right][color=#000066][此贴子已经被作者于2007-7-29 20:22:00编辑过][/color][/align]
<P>第一个地方,你的蛇身太窄了bar(snake.x[snake.len],snake.y[snake.len],snake.x[0],snake.y[0<FONT color=#ff0000>]+10);/这样就正常了<BR>蛇头你先加了个10,就已经在原来蛇头的前方10单位处,你后来在绘制图形时候以原来蛇头前方10单位为起点画了一个方型,自然是断的了</FONT></P>
回复:(奔跑的鸟)第一个地方,你的蛇身太窄了bar(sna...
<P>谢谢“<FONT color=#0033ff>大鸟</FONT>”和“<FONT color=#0000ff>anlogo</FONT>”[em17][em01]我修改了一下,终于会动了~<br>现在把我的错误总结一下:<br><br><FONT style="BACKGROUND-COLOR: #ff0000">1.</FONT>蛇身太窄:bar(snake.x[snake.len],snake.y[snake.len],snake.x[0],snake.y[0]<FONT color=#ff0000> +10</FONT>);我粗心大意[em29]<br><br><FONT style="BACKGROUND-COLOR: #00ccff">2.</FONT>setcolor设置的是画笔的颜色,而对bar函数填充,应该使用setfillstyle(),这也解释了anlogo的疑问。</P><P><FONT style="BACKGROUND-COLOR: #00ff00">3.</FONT>while循环第二句,蛇头先加了个10,就已经在原来蛇头的前方10单位处,后来在绘制图形时候以原来蛇头前方10单位为起点画了一个方型,自然是断的了。<br><br></P>
[align=right][color=#000066][此贴子已经被作者于2007-7-29 21:06:52编辑过][/color][/align]
页:
[1]
