Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我如何控制蛇的运动';谁的身体?_Python_Pygame - Fatal编程技术网

Python 我如何控制蛇的运动';谁的身体?

Python 我如何控制蛇的运动';谁的身体?,python,pygame,Python,Pygame,我想实现一个蛇游戏。那条蛇蜿蜒穿过操场。每当蛇吃了一些食物,蛇的长度就会增加一个元素。 蛇身上的元素沿着它的头部就像一条链子 snake\u x,snake\u y=WIDTH//2,HEIGHT//2 正文=[] 移动x,移动y=(1,0) 食物x,食物y=新食物(身体) 运行=真 运行时: 对于pygame.event.get()中的事件: 如果event.type==pygame.QUIT: 运行=错误 如果event.type==pygame.KEYDOWN: 如果event.key==

我想实现一个蛇游戏。那条蛇蜿蜒穿过操场。每当蛇吃了一些食物,蛇的长度就会增加一个元素。 蛇身上的元素沿着它的头部就像一条链子

snake\u x,snake\u y=WIDTH//2,HEIGHT//2
正文=[]
移动x,移动y=(1,0)
食物x,食物y=新食物(身体)
运行=真
运行时:
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_LEFT:move_x,move_y=(-1,0)
elif event.key==pygame.K_RIGHT:move_x,move_y=(1,0)
elif event.key==pygame.K_UP:move_x,move_y=(0,-1)
elif event.key==pygame.K_DOWN:move_x,move_y=(0,1)
蛇x=(蛇x+移动x)%WIDTH
蛇y=(蛇y+移动y)%HEIGHT
如果蛇x==食物x和蛇y==食物y:
食物x,食物y=新食物(身体)
body.append((snake_x,snake_x))
# [...]

当蛇头向前移动时,我如何实现身体部位沿着蛇头的路径移动?

通常,你必须区分两种不同类型的蛇。在第一种情况下,蛇在网格中移动,每次蛇移动时,它都会在网格中向前移动一个区域。在另一种类型中,蛇的位置不在光栅中,也不在网格的字段上捕捉,该位置是自由的,蛇在字段中平滑滑动。
在前一种情况下,身体的每个元素都会像头部一样捕捉到栅格的字段。另一个更为巧妙,因为主体元素的位置取决于元素的大小和蛇头的动态先前位置


首先是蛇,它被捕捉到网格上

snake的元素可以存储在元组列表中。每个元组包含网格中snakes元素的列和行。对列表中项目的更改直接跟随蛇的移动。如果蛇移动,则新位置的一个标记将添加到列表的头部,而列表的尾部将被删除

例如,我们有一条具有以下元素的蛇:

body=[(3,3)、(3,4)、(4,4)、(5,4)、(6,4)]
当蛇头从
(3,3)
移动到(
3,2
)时,新的蛇头位置将添加到列表的头部(
主体。插入(0,(3,2)
):

body=[(3,2)、(3,3)、(3,4)、(4,4)、(5,4)、(6,4)]
最后删除ist的尾部(
delbody[-1]
):

body=[(3,2)、(3,3)、(3,4)、(4,4)、(5,4)]

最简单的例子:

导入pygame
随机输入
pygame.init()
列,行,大小=10,10,20
screen=pygame.display.set_模式((列*大小,行*大小))
clock=pygame.time.clock()
background=pygame.Surface((列*大小,行*大小))
背景填充((255,255,255))
对于范围内的i(1,列):
pygame.draw.line(背景,(128128128),(i*SIZE-1,0),(i*SIZE-1,ROWS*SIZE),2)
对于范围内的i(1行):
pygame.draw.line(背景,(128128128),(0,i*SIZE-1),(列*SIZE,i*SIZE-1),2)
def随机位置(车身):
尽管如此:
pos=random.randrange(列),random.randrange(行)
如果pos不在阀体中:
打破
返回位置
长度=1
正文=[(列//2,行//2)]
dir=(1,0)
食物=随机位置(身体)
运行=真
运行时:
时钟滴答作响(5)
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
运行=错误
如果event.type==pygame.KEYDOWN:
如果event.key==pygame.K_LEFT:dir=(-1,0)
elif event.key==pygame.K_RIGHT:dir=(1,0)
elif event.key==pygame.K_UP:dir=(0,-1)
elif event.key==pygame.K_DOWN:dir=(0,1)
body.insert(0,body[0][:])
正文[0]=(正文[0][0]+dir[0])%列,(正文[0][1]+dir[1])%行
如果身体[0]==食物:
食物=随机位置(身体)
长度+=1
而长度(车身)>长度:
del body[-1]
屏幕光点(背景,(0,0))
pygame.draw.rect(屏幕,(255,0255),(食物[0]*大小,食物[1]*大小,大小,大小))
对于i,枚举中的位置(正文):
颜色=(255,0,0)如果i==0其他(0192,0)如果(i%2)==0其他(255,128,0)
pygame.draw.rect(屏幕,颜色,(位置[0]*大小,位置[1]*大小,大小,大小))
pygame.display.flip()

现在,蛇完全自由定位

我们必须在列表中跟踪蛇头访问过的所有位置。我们必须将蛇身的元素像珍珠链一样放置在列表中的位置上

关键是,计算链中身体的最后一个元素与轨迹上的以下位置之间的距离。 当发现一个距离足够大的新点时,将向链(主体)添加一个新的珍珠(元素)

dx,dy=body[-1][0]-pos[0],body[-1][1]-pos[1]
如果math.sqrt(dx*dx+dy*dy)>=距离:
正文.附加(pos)
以下函数有3个参数。
track
是头部位置的列表。
no_pearls
是shakes body的元素数,
distance
是元素之间的距离。该函数创建并返回蛇体位置的列表

def创建车身(轨迹、无珍珠、距离):
body=[(磁道[0])]
轨道i=1
对于范围内的i(1,无珍珠):
当轨道i=距离:
正文.附加(pos)
打破
而len(身体)<无珍珠:
body.append(磁道[-1])
删除轨道[轨道i:]
返回体
最简单的例子:

导入pygame
导入运行