学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import *
setFrameRate(60)
W = 768
H = 1024
m = 5
CW = 100
OX = (W - CW * m) // 2
colors = ["#EE412F", "#38E62F", "#8F37E2", "#FDB323", "#008DB6"]
isOver = True
score = 0
speed = 1
count = 0
cubes = []
pool = []
def getCube():
if len(pool):
return pool.pop()
return box(-CW, -CW, CW, CW, "red", "black")
hero = getCube()
tf = text("", -100, -100, 40, "black", "center")
overTf = text("", 50, "black", "center")
def shuffle(arr):
n = len(arr)
for i in range(0, n-1):
for j in range(i+1,n):
if random(10) > 5:
temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
pass
def setCubeColor(cube, color):
cube.change(color)
cube.color = color
return cube
def randomCubeColor(cube):
return setCubeColor(cube, colors[random(0, len(colors)-1)])
def updateScore():
tf.change(str(score))
def moveCube(cube, x, y):
cube.move(x, y)
cube.x0 = x
cube.y0 = y
pass
def moveCubeBy(cube, dx, dy):
moveCube(cube, cube.x0 + dx, cube.y0 + dy)
def moveHero(x, y):
moveCube(hero, x, y)
tf.move(x, y)
def moveHeroBy(dx, dy):
moveHero(hero.x0 + dx, hero.y0 + dy)
def addLine(oy):
shuffle(colors)
if len(cubes):
c = cubes[-1]
dy = (oy - CW) - c.y0
for cube in cubes:
moveCubeBy(cube, 0, dy)
moveHeroBy(0, dy)
else:
i = int((hero.x0 - OX) / CW)
if colors[i] == hero.color:
j = 0 if i != 0 else 1
tmp = colors[i]
colors[i] = colors[j]
colors[j] = tmp
for i in range(m):
cube = getCube()
cubes.append(cube)
moveCube(cube, OX + i * CW + CW // 2, oy)
setCubeColor(cube, colors[i])
pass
def reset():
global isOver,score, speed, count
isOver = False
score = 0
speed = 1
count = 0
moveHero(0, 0)
randomCubeColor(hero)
pool.extend(cubes)
cubes.clear()
for i in range(5):
addLine(H + CW // 2)
while hero.color == cubes[2].color:
randomCubeColor(hero)
moveHero(cubes[2].x0, cubes[2].y0 - CW)
updateScore()
overTf.hide()
overTf.change("Game Over")
pass
def tryAddLine():
if len(cubes) == 0:
addLine(hero.y0 + CW)
elif cubes[-1].y0 + speed < H:
addLine(cubes[-1].y0 + CW)
pass
def checkOver():
global isOver
if hero.y0 < -CW // 2:
isOver = True
overTf.show()
overTf.front()
pass
def checkTap():
if x >= OX and x <= OX + CW * m:
moveHero(OX + (x - OX) // CW * CW + CW // 2, hero.y0)
pass
def removeLine():
for i in range(m):
cube = cubes.pop(0)
pool.append(cube)
pass
def checkCube():
global score, speed, count
while True:
i = int((hero.x0 - OX) / CW)
if cubes[i].color == hero.color:
removeLine()
score += 1
speed += 0.05
count += 1
moveHeroBy(0, CW)
tryAddLine()
pass
else:
break
if count >= 5:
c = hero.color
while c == hero.color:
randomCubeColor(hero)
count = 0
if hero.y0 > H - CW // 2:
dy = H - CW // 2 - hero.y0
moveHeroBy(0, dy)
for cube in cubes:
moveCubeBy(cube, 0, dy)
pass
def tap():
if isOver:
reset()
else:
checkTap()
pass
pass
def loop():
if isOver:
return
for cube in pool:
cube.hide()
for cube in cubes:
cube.show()
moveCubeBy(cube, 0, -speed)
moveHeroBy(0, -speed)
checkCube()
tryAddLine()
checkOver()
updateScore()
pass
reset()
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。