#消消乐
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=[]
'''
vizard--消消乐1.0
猜你喜欢
转载自blog.csdn.net/weixin_58465955/article/details/121392492
今日推荐
周排行