贪吃2.0

#贪吃蛇
import viz
import math
import vizact
import vizmat
import random
import vizcam
import viztask
import vizshape
import vizproximity
import vizinfo

viz.setMultiSample(4)
viz.fov(60)
viz.go()
viz.phys.enable()

d=0
grid = vizshape.addGrid()#网格
grid.color(viz.RED)
grid.setAxisAngle(0,0,0,90)
grid.setPosition(0,d,0)
world_axes = vizshape.addAxes()#坐标轴
world_axes.setPosition(0,d,0)
world_axes.alpha(0.4)
#背景
ground=viz.addChild('tut_ground.wrl')
ground.collidePlane()
ground.setPosition(0,d,0,)

viz.MainView.setPosition([0, 4, 0])
viz.MainView.setAxisAngle(1,0,0,90)
#固定视角
viz.mouse.setScale( 0, 0)

#定义蛇的头部及其运动
snake_speed=10
snake = viz.add('white_ball.wrl')
snake.setPosition(0,d,0)
#snake.setScale(0.2,0.2,0.2)
#snake.enable(viz.COLLIDE_NOTIFY)
snake.enable(viz.ROTATE_NONE)
snake.color(viz.RED)
def move_up():
    moveForward = vizact.move(0,0,snake_speed,0.005)
    snake.runAction(moveForward)
def move_down():
    moveForward = vizact.move(0,0,-snake_speed,0.005)
    snake.runAction(moveForward)
def move_right():
    moveForward = vizact.move(snake_speed,0,0,0.005)
    snake.runAction(moveForward)
def move_left():
    moveForward = vizact.move(-snake_speed,0,0,0.005)
    snake.runAction(moveForward)
vizact.whilekeydown(viz.KEY_UP,move_up,)
vizact.whilekeydown(viz.KEY_DOWN,move_down,)
vizact.whilekeydown(viz.KEY_RIGHT,move_right,)
vizact.whilekeydown(viz.KEY_LEFT,move_left,)

foods=[]
pos_foods=[]
foodsRunAction=[]
n=10#球数
def random_pos_create():
	x=(random.random()-0.5)*4	
	z=(random.random()-0.5)*4
	return [x,d,z]
for i in range(n):
	pos=random_pos_create()
	newTarget = viz.addChild('white_ball.wrl')
	newTarget.setPosition(pos)
	foods.append(newTarget)
	foodsRunAction.append(newTarget.runAction)
	pos_foods.append(pos)

#显示得分
import vizinfo
scorePanel = vizinfo.InfoPanel('Score: 0', icon=False)
scorePanel.score = 0


def snake_grow():
	while 1:
		yield viz.waitTime(0.001)
		for i in snake_list:
			#print "###",i
			i.runAction(vizact.moveTo(snake.getPosition(viz.ABS_GLOBAL),speed=1))
viztask.schedule(snake_grow())

snake_list=[]
def snake_append(i):#蛇的身体,除了头部以外
	snake.runAction(vizact.moveTo([0,0,1],speed=1))#speed不能省略
	snake_list.append(foods[i])
def delete_and_create(i):
	snake_append(i)
	#foods[i].remove()#先删除该小球,再重新随机一个新的小球
	#print "###",i,snake.getPosition(viz.ABS_GLOBAL)[0]-foods[i].getPosition(viz.ABS_GLOBAL)[0]
	x=(random.random()-0.5)*4
	z=(random.random()-0.5)*4
	pos=[x,d,z]
	newTarget = viz.add('white_ball.wrl')
	newTarget.setPosition(pos)
	foods.pop(i)
	pos_foods.pop(i)
	print 'remove',i
	foods.insert(i,newTarget)
	pos_foods.insert(i,pos)
	scorePanel.score += 1
	scorePanel.setText('Score: {}'.format(scorePanel.score))

def collide():
	list=[]#记录被吃小球的下标的列表
	while 1:
		pos_snake=snake.getPosition(viz.ABS_GLOBAL)
		for i in foods:
			if math.sqrt((pos_foods[foods.index(i)][0]-pos_snake[0])**2+(pos_foods[foods.index(i)][2]-pos_snake[2])**2)<0.2:
				list.append(foods.index(i))#记录被接触球在列表中的下标
		for i in list:
			delete_and_create(i)
		list=[]#小球已经被吃,列表清空
		yield viz.waitTime(0.001)
viztask.schedule(collide())

猜你喜欢

转载自blog.csdn.net/weixin_58465955/article/details/121347320