vizard--消消乐1.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()

d=0#y值与水平面的距离
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([2, 4, 2])
viz.MainView.setAxisAngle(1,0,0,90)

balls=[]
#初始界面
for i in range(9):
	for j in range(7):
		billball = viz.add('white_ball.wrl')
		billball.setPosition(i-2,d,j-1)
		if i ==0 or i==8 or j==0 or j==6:#界外黑球,无法与视界内的球相消#似乎可以不用
			billball.color(viz.BLACK)
		else :#视界内球,颜色相同达三个或以上,则相消
			billball.color(random.choice([viz.RED,viz.WHITE,viz.YELLOW,viz.GREEN]))
		balls.append([billball,i,j,billball.getColor()])#列表存储:[球对象,横坐标,纵坐标,颜色值]


#获取对象坐标值
def myGetPosition(object):
	balls.sort(key = lambda x:x[0]!=object)
	pos=balls[0][1:3]#[ball,i,j,color]
	return pos

#获取对象四元组信息【ball,x,y,color】
def myGetBallsMassege(object):
	balls.sort(key = lambda x:x[0]!=object)
	ball_massege=balls[0]
	return ball_massege


#在视界内的球中,先找到与被选球距离为1且相同颜色的球,在递归调用调用自身,找到其他相同颜色的球
same_color_balls=[]
def find_all_same_color_balls(object,color):
	global  same_color_balls,same_color_count,balls
	for ball in balls:#ball是四元组,object的ball的第一个元素
		x1=ball[1];y1=ball[2];x2=myGetPosition(object)[0];y2=myGetPosition(object)[1]
		if ball not in same_color_balls and ball[3]==color and ((x1-x2)**2+(y1-y2)**2)==1 :
			same_color_balls.append(ball)
			find_all_same_color_balls(ball[0],color)

#移除小球
def remove_balls(balls_remove_list):#参数是四元组列表
	print "#####",len(balls),balls
	balls_remove_pos_list=[]
	print "balls_remove_list",balls_remove_list
	for ball in balls_remove_list:
		balls_remove_pos_list.append(ball[1:3])
		print "remove:",ball,"index",balls.index(ball)
		ball[0].remove()
		balls.pop(balls.index(ball))
		print "#####",len(balls),balls
	create_new_balls(balls_remove_pos_list)

#生成新的小球
def create_new_balls(pos):
	global balls
	#viztask.waitTime(3)#?
	for x in pos:
		billball = viz.add('white_ball.wrl')
		billball.setPosition(x[0]-2,d,x[1]-1)
		billball.color(random.choice([viz.RED,viz.WHITE,viz.YELLOW,viz.GREEN]))
		balls_four_massege=[billball,x[0],x[1],billball.getColor()]
		balls.append(balls_four_massege)
		print balls_four_massege,len(balls)
		

#固定视角
viz.mouse(viz.OFF)
#拾取选中
def pickBall():
	global same_color_balls
	object = viz.pick()
	if object.valid():

		find_all_same_color_balls(object,object.getColor())
		#print object.getColor()
		print "same_color_balls",len(same_color_balls),same_color_balls
		if len(same_color_balls)>2:
			remove_balls(same_color_balls)
		same_color_balls=[]#在下一次查询相同球之前,将存储同色球的列表清空
		
vizact.onmousedown(viz.MOUSEBUTTON_LEFT, pickBall)

'''
#判断被选中目标的上左下右
def near_balls(object):
	a=myGetBallsMassege(object)
	balls.sort(key = lambda x:x[1:3]!=[a[1]+1,a[2]])
	target_right = balls[0]
	balls.sort(key = lambda x:x[1:3]!=[a[1]-1,a[2]])
	target_left = balls[0]
	balls.sort(key = lambda x:x[1:3]!=[a[1],a[2]+1])
	target_up = balls[0]
	balls.sort(key = lambda x:x[1:3]!=[a[1],a[2]-1])
	target_down = balls[0]
	return [target_up,target_down,target_left,target_right]#多值return组装在一个元组里
		near_list=near_balls(object)#near_balls返回的每个元素都是列表


same_color_count=0
near_same_color_list=[]
def find_same_color_balls(near_list,color,n):
	global near_same_color_list,same_color_count
	up=near_list[0];down=near_list[1];left=near_list[2];right=near_list[3]#上下左右的球
	if up[3]==color and n!=2 and up[2]!=6 and up not in near_same_color_list:#n==2是上一次搜索的球,不应该重复搜索
		same_color_count+=1
		near_same_color_list.append(up)
		i=up[1]
		j=up[2]
		if i!=0 and i!=8 and j!=0 and j!=6:
			find_same_color_balls(near_balls(up),color,1)
	if down[3]==color and n!=1 and down[2]!=0 and down not in near_same_color_list:#n==2是上一次搜索的球,不应该重复搜索
		same_color_count+=1
		near_same_color_list.append(down)
		i=down[1]
		j=down[2]
		if i!=0 and i!=8 and j!=0 and j!=6:
			find_same_color_balls(near_balls(down),color,1)
	if left[3]==color and n!=2 and left[2]!=6 and left not in near_same_color_list:#n==2是上一次搜索的球,不应该重复搜索
		same_color_count+=1
		near_same_color_list.append(left)
		i=left[1]
		j=left[2]
		if i!=0 and i!=8 and j!=0 and j!=6:
			find_same_color_balls(near_balls(left),color,1)
	if right[3]==color and n!=2 and right[2]!=6 and right not in near_same_color_list:#n==2是上一次搜索的球,不应该重复搜索
		same_color_count+=1
		near_same_color_list.append(right)
		i=right[1]
		j=right[2]
		if i!=0 and i!=8 and j!=0 and j!=6:
			find_same_color_balls(near_balls(right),color,1)
	print "#######",same_color_count
	same_color_count=0
	near_same_color_list=[]
'''

猜你喜欢

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