【问题标题】:Two stack in assembly组装中的两个堆栈
【发布时间】:2013-05-12 14:27:00
【问题描述】:

我想在组装中做一个游戏(简单的东西,而不是复杂的蛇),我需要两个堆栈。如果你能告诉我如何创建和使用两个堆栈,我会很高兴。 只是为了知识,我需要堆栈来检查蛇是否割伤了自己,还需要画蛇的身体。

【问题讨论】:

  • 只有一个调用栈,除非你是多线程的。其余的必须是用户堆栈(即手动管理)。算法难度不大。
  • 你能解释一下为什么你需要一个堆栈来检查蛇是否与自己相交吗?如果您将比赛场地表示为 2D 数组,您可以通过检查蛇的一段是否会最终位于另一段已经位于的同一单元格中来轻松检测到这一点。
  • @TJR 检查我的答案。看看有没有用

标签: assembly graphics x86 stack


【解决方案1】:

.创建蛇数组。并转移它们。并添加 head snake[0] (x;y ofhead) 然后清除 snake[snake_size] 这是 tail 。 如果是地图,您可以在该地图[x,y]区域上标记蛇体并绘制整个地图循环使用地图值抛出它 伪代码:

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

这里是移动蛇的简单代码:(将蛇数组向右移动):

(注意:我们的蛇数组元素 Word(2bytes) 。所以写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] 并在地图上标记它们:

要查看他是否吃水果,您应该使用 map[head.x,head.y] ==2 检查头部位置,或者使用 -1 检查 fench

看他有没有剪。你应该循环抛出整个身体,看看头部是否与身体碰撞

并入栈

  • 它是具有 Filo 行为的数组。
  • 您需要存储索引。
  • 在推送;mem[index]=value;++index;时为该mem[index]添加值并增加索引
  • 并且在弹出时减少索引并返回 mem[index] ;--index;return mem[index]

【讨论】:

  • 如果你的意思是对蛇做一个数组 - 你将如何改变它的大小。如果不是,你怎么知道是尾巴(删除尾巴后你需要在地图上找到它的新位置)。顺便说一句,地图是一个数组?
  • @TJR 对于蛇,我们得到了蛇的最大长度的蛇数组。认为这个长度永远不会超过 (mapx*mapy)/2 。我们得到了保存当前蛇大小的 s_size。如果我们增加 s_size 那么蛇的大小将被改变。因为我们清除了蛇 [s_size] 这是尾巴。 .map 是二维数组。我们使用 map 来检查和显示。还要检查我的答案。我改进了格式并使事情更清晰
猜你喜欢
  • 2018-12-10
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多