2013-05-12 88 views
2

我打算在装配中做一个游戏(一些简单的,而不是复杂的蛇),我需要两个堆栈。如果你能告诉我如何创建和使用两个堆栈,我会很高兴。 只是为了知识,我需要堆栈来检查蛇是否自己切割,并绘制蛇的身体。在装配中的两个堆栈

+0

只能有一个调用堆栈,除非你是多踩踏。其余的必须是用户堆栈(即手动管理)。算法不是太困难。 – 2013-05-12 14:30:47

+1

你能否解释为什么你需要一个堆栈来检查蛇是否相交?如果您将运动场表示为二维数组,您可以通过检查蛇的一部分是否会在另一个线段已经位于的同一单元格中检测到。 – Michael 2013-05-12 14:35:45

+0

@TJR检查我的答案。看看它是否有帮助 – qwr 2013-05-12 15:12:25

回答

3

。创建蛇阵列。并转移他们。并添加头snake[0] (x;y ofhead)然后清除snake[snake_size]这是尾巴。 如果是地图,你可以对地图[X,Y]区和标志蛇体绘制整个地图循环使用地图扔值 伪代码:

map[x,y]=1 //snake body 
map[x,y]=0 //nothing 
map[x,y]=2 //fruit 
map[x,y]=-1 //fench 

这里移动蛇是简单的代码:(移蛇阵到右):

。(注意:我们的蛇阵元字(2字节),所以写snake[x]实际上应该指向snake[x*2]地址;在该移动之后

 mov cx, snake_size 
     ; di=snake_size*2 
     mov di, snake_size  
     add di,di ;// di=di*2 
    move_array: 
     ; snake[x]=snake[x-1]; 
     mov ax, snake[di-2] ; 
     mov snake[di], ax 
     ; --x (x=x-1) 
     sub di, 2 
     loop move_array 

//c style loop code will be 
for(int i=snake_size;i>0;i--){ 
    snake[i]=snake[i-1]; 
} 

添加新位置头snake[0]和明确tail=snake[snake_size]标记那些在地图上,太: enter image description here

因为如果他吃水果,你应该检查头部位置地图[head.x,head.y] == 2或fench见到你用-1检查

看看他是否切断。你应该循环扔整个身体,看看是否头部碰撞体

和未来的堆栈

  • 是阵列费罗的行为。
  • 您需要商店索引。
  • 增值到MEM [指数],增加指数推;mem[index]=value;++index;
  • 啪下降指数,并返回MEM [指数]的时候,当;--index;return mem[index]
+0

如果你的意思是对蛇做一个数组 - 你将如何改变它的大小。如果没有,你怎么知道尾巴(删除尾巴后,你需要在地图上找到它的新位置)。顺便说一下,地图是一个数组? – TJR 2013-07-29 13:38:54

+0

@TJR对于蛇,我们得到了蛇的最大长度的容量,这个长度决不会超过(mapx * mapy)/ 2。我们得到了保持当前蛇尺寸的s_size。如果我们增加s_size,那么蛇的大小将会改变,因此我们清除尾部的蛇[s_size]。 .map是二维数组,我们使用地图进行cheking和显示目的。也检查我的答案。我改进了格式并使事情更加清晰 – qwr 2013-07-30 08:18:57