def setup(): size(600,600) global x, y, v, bx, by, curBall, aliveBall, deadBall global COLOR, c, bc #球需要有速度,位置,颜色三个属性 #对应x,y坐标、x,y速度、c #上方球由于固定,可以只有位置和颜色属性 #对应bx,by和bc x, y = width/2, height-15 #初始化球在中下的外汇返佣位置,速度为0,颜色随机给一个 vx, vy = 0, 0 bx, by = [], [] curBall = [] aliveBall = [] deadBall = [] COLOR = [color(227,41,54),color(41,188,227),color(41,227,48),color(250,239,13)] #COLOR颜色列表,c和bc表示列表中的第几个颜色,而不是直接表示颜色 c = int(random(len(COLOR))) bc = [] for i in range(20): for j in range(10): ball.append([i*30, j*30]) curBall.append(len(curBall))#显示的球 aliveBall.append(len(aliveBall))#活着的球 ballc.append(int(random(len(COLOR))))#死了的球 def draw(): global loc, v, ball, curBall, deadBall global COLOR, c, ballc background(255) def findDead(i): d = [i]#打中了第i号球,d[]记录接下来找到的应该死掉的球 def tmp(i): for j in curBall: #找和i相邻且同色的球, #首先排除掉已经找到的球,然后需要颜色编号相同,其次需要距离小于两球半径之和 if j not in d and ballc[j]==ballc[i] and dist(ball[i][0],ball[i][1],ball[j][0],ball[j][1])<31: d.append(j)#确认过眼神,找到对的球j,用小本本记下来 #接下来再找刚刚找到的球的下一个应该死掉的球 tmp(j) tmp(i) #这样一直找下一个该死的泡泡龙 #就得到了所有该死的球 (逃 return d #画会动的球 fill(COLOR[c]) ellipse(x,y,30,30) for i in curBall: #画每个还没死的球 fill(COLOR[bc[i]]) ellipse(bx[i], by[i], 30, 30) #检查有没有被撞到 if dist(bx[i], by[i], x, y)<30: if bc[i] == c: #某个同色球被撞到 #找它旁边该死的球,以及旁边该死的球的旁边的该死的球,以及******* tmp = findDead(i) #找到了这一次所有该死的球 #把他们从生死簿上重新做标记 #地狱+1 #人间-1 deadBall.extend(tmp) for t in tmp: aliveBall.remove(t) #不管有没有撞到该死的球,都应该飞回原点 (逃 x, y = width/2, height-15 vx, vy = 0, 0 #顺便换个马甲再来 c = int(random(len(COLOR))) curBall = aliveBall[:] #更新一下,现在显示的球全是没死的球 x += vx y += vy #左右碰壁就反弹 if x>width-15 or x<15: vx = -vx # 上面碰壁也反弹 if y<15: vy = -vy #下面碰壁就还原 if y>height-15: x, y = width/2, height-15 vx, vy = 0, 0 #换个马甲 c = int(random(len(COLOR))) def mousePressed(): global vx, vy #按下鼠标就发射,给个速度就可 vx = (mouseX-width/2)/100.0 vy = (mouseY-height+15)/100.0