碰撞检测 Python 诅咒
Collision Detection Python curses
以下代码是作为玩具代码编写的,用于在 MacBook Pro 上测试 curses 模块(我使用的是 Terminal App 中的默认 python 安装)。
该测试创建了一个由 L 符号表示的 "Enemy",它遵循一个移动循环,以及由“@”表示的玩家。
不管我如何糟糕地处理边界问题(参见宽度和高度处理),我唯一关心的问题是碰撞检测不起作用。不明白是if块错位还是时序错位造成的
代码粘贴:
import curses
import random
from time import sleep
screen = curses.initscr()
screen.keypad(True)
curses.noecho()
screen.nodelay(True)
xpos=1
ypos=1
i=0
h,w = screen.getmaxyx()
w=w-22
h=h-5
e1startxpos=random.randint(5,80)
e1startypos=random.randint(2,15)
e1xpos=[0,0,0,1,1,1,0,0,0,-1,-1,-1]
e1ypos=[1,1,1,0,0,0,-1,-1,-1,0,0,0]
tempe1x = e1startypos+e1ypos[i]
tempe1y = e1startxpos+e1xpos[i]
while True:
screen.clear()
screen.border(0)
screen.addstr(ypos,xpos,"@")
screen.addstr(0,w,"xpos:{0}ypos:{1}h:{2}w:{3}".format(xpos,ypos,h,w))
if (xpos == tempe1x and ypos == tempe1y):#The detector, which should run before another cycle
screen.addstr(1,1,"Collision Detected: Exiting")
screen.refresh()
sleep(1.5) #timing redundant to see the detection of collision
break
else:
tempe1x = tempe1x+e1ypos[i]
tempe1y = tempe1y+e1xpos[i]
screen.addstr(tempe1x,tempe1y,"L")
if(i == len(e1xpos)-1):
i=0
else:
i+=1
screen.refresh()
c = screen.getch()
if c == ord('a'):
if xpos>0:
xpos = xpos-1
elif c == ord('d'):
if xpos<w:
xpos = xpos+1
elif c == ord('w'):
if ypos>0:
ypos = ypos-1
elif c == ord('s'):
if ypos<h:
ypos = ypos+1
elif c == ord('q'):
break
sleep(0.1)
screen.clear()
screen.addstr(0,0,"Gioco Finito")
screen.refresh()
sleep(2)
curses.echo()
curses.endwin()`
PS:我没有在此平台上编辑 post 的经验,因此此代码副本可能会导致缩进不正确
首先,您在此处混淆了 tempe1x
和 tempe1y
的初始化:
tempe1x = e1startypos+e1ypos[i]
tempe1y = e1startxpos+e1xpos[i]
您需要调换 x 和 y:
tempe1x = e1startxpos+e1xpos[i]
tempe1y = e1startypos+e1ypos[i]
接下来,addstr
方法首先获取 y 位置,然后是 x 位置。你对玩家的理解是正确的:screen.addstr(ypos,xpos,"@")
但你通过将 x 位置放在第一位而将其与敌人角色搞砸了:screen.addstr(tempe1x, tempe1y,"L")
。应该是:
screen.addstr(tempe1y,tempe1x,"L")
根据我的经验,这是可行的。我没有使用 curses
库的经验,所以如果您仍然 运行 遇到任何问题,请告诉我。
-贾森
以下代码是作为玩具代码编写的,用于在 MacBook Pro 上测试 curses 模块(我使用的是 Terminal App 中的默认 python 安装)。 该测试创建了一个由 L 符号表示的 "Enemy",它遵循一个移动循环,以及由“@”表示的玩家。 不管我如何糟糕地处理边界问题(参见宽度和高度处理),我唯一关心的问题是碰撞检测不起作用。不明白是if块错位还是时序错位造成的
代码粘贴:
import curses
import random
from time import sleep
screen = curses.initscr()
screen.keypad(True)
curses.noecho()
screen.nodelay(True)
xpos=1
ypos=1
i=0
h,w = screen.getmaxyx()
w=w-22
h=h-5
e1startxpos=random.randint(5,80)
e1startypos=random.randint(2,15)
e1xpos=[0,0,0,1,1,1,0,0,0,-1,-1,-1]
e1ypos=[1,1,1,0,0,0,-1,-1,-1,0,0,0]
tempe1x = e1startypos+e1ypos[i]
tempe1y = e1startxpos+e1xpos[i]
while True:
screen.clear()
screen.border(0)
screen.addstr(ypos,xpos,"@")
screen.addstr(0,w,"xpos:{0}ypos:{1}h:{2}w:{3}".format(xpos,ypos,h,w))
if (xpos == tempe1x and ypos == tempe1y):#The detector, which should run before another cycle
screen.addstr(1,1,"Collision Detected: Exiting")
screen.refresh()
sleep(1.5) #timing redundant to see the detection of collision
break
else:
tempe1x = tempe1x+e1ypos[i]
tempe1y = tempe1y+e1xpos[i]
screen.addstr(tempe1x,tempe1y,"L")
if(i == len(e1xpos)-1):
i=0
else:
i+=1
screen.refresh()
c = screen.getch()
if c == ord('a'):
if xpos>0:
xpos = xpos-1
elif c == ord('d'):
if xpos<w:
xpos = xpos+1
elif c == ord('w'):
if ypos>0:
ypos = ypos-1
elif c == ord('s'):
if ypos<h:
ypos = ypos+1
elif c == ord('q'):
break
sleep(0.1)
screen.clear()
screen.addstr(0,0,"Gioco Finito")
screen.refresh()
sleep(2)
curses.echo()
curses.endwin()`
PS:我没有在此平台上编辑 post 的经验,因此此代码副本可能会导致缩进不正确
首先,您在此处混淆了 tempe1x
和 tempe1y
的初始化:
tempe1x = e1startypos+e1ypos[i]
tempe1y = e1startxpos+e1xpos[i]
您需要调换 x 和 y:
tempe1x = e1startxpos+e1xpos[i]
tempe1y = e1startypos+e1ypos[i]
接下来,addstr
方法首先获取 y 位置,然后是 x 位置。你对玩家的理解是正确的:screen.addstr(ypos,xpos,"@")
但你通过将 x 位置放在第一位而将其与敌人角色搞砸了:screen.addstr(tempe1x, tempe1y,"L")
。应该是:
screen.addstr(tempe1y,tempe1x,"L")
根据我的经验,这是可行的。我没有使用 curses
库的经验,所以如果您仍然 运行 遇到任何问题,请告诉我。
-贾森