学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品 。
仿照游戏 hanyeah-woodworm-像素木虫,用python实现。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import *
W = 768
H = 1024
N = 32
HN = int(N/2)
FLOOR = 26
CW = 24
# 背景,地板,目标,木块,虫子
colors = ["#291814", "#742F29", "#FFEC27", "#FF6E59", "#FFFFFF"]
OX = 0
OY = (H - CW * N) // 2
bits = []
level = 0
isOver = False
levels = [
[[5,5],[[0, 1, 1, 0, 0], [1, 1, 1, 0, 0], [1, 1, 1, 1, 1], [1, 1, 1, 0, 0], [0, 1, 1, 0, 0]]],
[[6,6],[[1, 1, 1, 1, 1], [0, 0, 1, 1, 0], [0, 0, 1, 1, 0], [0, 1, 1, 1, 1], [1, 1, 1, 0, 0], [0, 1, 1, 0, 0]]],
[[5,6],[[1, 1, 1, 1, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 1], [1, 0, 0, 0, 1], [1, 1, 1, 1, 1]]],
[[5,6],[[1, 0, 0, 0, 1], [1, 1, 1, 1, 1], [1, 0, 0, 0, 1], [1, 1, 1, 1, 1], [1, 0, 0, 0, 1]]],
[[5,6],[[0, 0, 1, 0, 0], [0, 1, 1, 1, 0], [1, 1, 1, 1, 1], [0, 1, 1, 1, 0], [0, 0, 1, 0, 0]]],
[[7,6],[[0, 1, 1, 1, 1], [0, 0, 1, 1, 0], [0, 0, 1, 1, 0], [0, 0, 1, 1, 0], [1, 1, 1, 1, 1], [1, 1, 0, 0, 0], [1, 1, 0, 0, 0]]],
[[6,7],[[1, 1, 1, 0, 0, 0], [0, 1, 1, 1, 0, 1], [0, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 1], [0, 1, 1, 1, 0, 1], [1, 1, 1, 0, 0, 0]]],
[[7,5],[[0, 0, 1, 1, 0], [0, 0, 1, 1, 1], [0, 0, 0, 1, 1], [0, 0, 0, 1, 1], [1, 1, 1, 1, 1], [1, 1, 0, 0, 0], [0, 1, 0, 0, 0]]],
[[6,7],[[1, 1, 1, 0, 0, 0], [1, 0, 1, 1, 0, 0], [1, 1, 0, 1, 1, 0], [0, 1, 1, 0, 1, 1], [0, 0, 1, 1, 0, 1], [0, 0, 0, 1, 1, 1]]],
[[4,5],[[1, 1, 1, 1, 1], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [0, 0, 1, 1, 1]]],
[[6,8],[[0, 1, 1, 1, 1, 0], [1, 0, 1, 0, 1, 1], [1, 1, 1, 0, 0, 1], [1, 1, 1, 0, 0, 1], [1, 0, 1, 0, 0, 1], [0, 1, 1, 1, 1, 0]]],
[[5,7],[[0, 1, 0, 1, 0], [1, 1, 1, 1, 1], [0, 1, 0, 1, 0], [1, 1, 1, 1, 1], [0, 1, 0, 1, 0]]],
[[6,8],[[1, 1, 1, 1, 1, 1, 0, 0], [1, 0, 0, 0, 0, 1, 0, 1], [1, 0, 0, 0, 0, 1, 1, 1], [1, 0, 0, 0, 0, 1, 1, 1], [1, 0, 0, 0, 0, 1, 0, 1], [1, 1, 1, 1, 1, 1, 0, 0]]],
[[5,7],[[0, 1, 1, 1, 1, 1], [1, 1, 0, 1, 1, 1], [1, 0, 0, 0, 0, 1], [1, 1, 0, 1, 1, 1], [0, 1, 1, 1, 1, 1]]],
[[5,10],[[1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 0, 1, 0, 0, 1, 0], [1, 0, 0, 1, 0, 0, 1, 0], [1, 0, 0, 1, 0, 0, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1]]],
[[9,10],[[1, 1, 0, 0, 0, 0, 1, 1], [0, 1, 1, 1, 1, 1, 1, 0], [1, 1, 0, 0, 0, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 1, 1, 0], [1, 1, 0, 0, 0, 1, 1, 1], [0, 1, 1, 1, 1, 1, 1, 0], [1, 1, 0, 0, 0, 0, 1, 1]]],
[[10,8],[[0, 0, 1, 1, 0, 1], [0, 0, 1, 0, 1, 1], [0, 1, 1, 1, 0, 1], [0, 1, 1, 0, 1, 1], [1, 1, 1, 1, 0, 1], [1, 1, 1, 0, 1, 1], [1, 0, 1, 1, 0, 1], [1, 0, 0, 1, 1, 1], [1, 1, 0, 1, 1, 1], [0, 1, 1, 1, 1, 0]]]
]
def xy2ij(x, y):
return [int((x - OX)/CW),int((y-OY)/CW)]
def ij2xy(i,j):
return [OX+i*CW,OY+j*CW]
bits = []
worm = [[2,0],[1,0],[0,0]]
for i in range(N):
bits.append([])
for j in range(N):
xy = ij2xy(i,j)
c = 0 if j < FLOOR else 1
b = box(xy[0], xy[1], CW, CW, colors[c])
b.c = c
bits[i].append(b)
head = circle(0, 0, CW/4, "black")
def setB0(b, c):
b.change(colors[c])
b.c = c
def getB(i, j):
if i >= 0 and i < N and j >= 0 and j < N:
return bits[i][j]
return None
def setB(i, j, c):
b = getB(i, j)
if b:
b.change(colors[c])
b.c = c
def getC(i, j):
b = getB(i, j)
return b.c if b else -1
def moveWorm(di, dj):
if isOver:
return
i0 = worm[0][0]
j0 = worm[0][1]
ti = i0 + di
tj = j0 + dj
if getC(ti, tj) in [0,3]:
setB(ti,tj, 4)
setB(worm[2][0],worm[2][1], 0)
worm[2][0] = worm[1][0]
worm[2][1] = worm[1][1]
worm[1][0] = worm[0][0]
worm[1][1] = worm[0][1]
worm[0][0] = ti
worm[0][1] = tj
updateHead()
pass
pass
def wormFallDown():
for [i, j] in worm:
for [i0,j0] in [[i+1,j],[i-1,j],[i,j+1]]:
if getC(i0,j0) in [2,3]:
return
for [i, j] in worm:
if getC(i,j+1) in [1, 2, 3]:
return
for [i, j] in worm:
setB(i,j, 0)
for w in worm:
w[1] = w[1] + 1
for [i, j] in worm:
setB(i,j, 4)
updateHead()
def woodFallDown():
[m,n] = levels[level][0]
i0 = HN + 3
j0 = FLOOR - n
fd = []
for i in range(m):
fd.append([])
for j in range(n):
fd[i].append(True if getC(i0 + i, j0 + j) == 3 else None)
for j in range(n-1,-1,-1):
for i in range(m):
if fd[i][j]:
if getC(i0 + i, j0 + j + 1) in [1, 4]:
fd[i][j] = False
cancelNbFallDown(fd, i, j, m, n)
for i in range(m):
for j in range(n):
j1 = FLOOR - j - 1
if fd[i][n - j - 1]:
setB(i0 + i, j1+1, getC(i0 + i, j1))
setB(i0 + i, j1, 0)
pass
def cancelNbFallDown(fd, i, j, m, n):
nb = [[-1, 0], [1,0],[0,-1],[0,1]]
for [di,dj] in nb:
i1 = i+di
j1 = j+dj
if i1 >= 0 and i1 < m and j1 >= 0 and j1 < n and fd[i1][j1]:
fd[i1][j1] = False
cancelNbFallDown(fd, i1, j1, m, n)
def checkWin():
if isWin():
global isOver
isOver = True
winTf.show()
def isWin():
a = getWoodData()
b = levels[level][1]
if len(a) == len(b) and len(a) and len(a[0]) == len(b[0]):
for i in range(len(a)):
ai = a[i]
bi = b[i]
for j in range(len(ai)):
if ai[j] != bi[j]:
return False
return True
return False
def getWoodData():
[m,n] = levels[level][0]
i0 = HN + 3
j0 = FLOOR - n
minI = m
minJ = n
maxI = 0
maxJ = 0
for i in range(m):
for j in range(n):
if getC(i0+i, j0+j) == 3:
if i > maxI:
maxI = i
if i < minI:
minI = i
if j > maxJ:
maxJ = j
if j < minJ:
minJ = j
a = []
for i in range(minI, maxI + 1):
b = []
a.append(b)
for j in range(minJ, maxJ + 1):
b.append(1 if getC(i0+i, j0+j)==3 else 0)
return a
def updateLevel():
for i in range(N):
for j in range(FLOOR):
setB(i,j, 0)
w = levels[level][0]
t = levels[level][1]
i0 = HN - len(t) - 2
j0 = FLOOR - len(t[0])
for i in range(len(t)):
for j in range(len(t[i])):
if t[i][j] == 0:
setB(i0+i,j0+j, 0)
else:
setB(i0+i,j0+j, 2)
i0 = HN + 3
j0 = FLOOR - w[1]
for i in range(w[0]):
for j in range(w[1]):
setB(i0+i,j0+j, 3)
i0 = HN + 1
j0 = FLOOR - 1
for i in range(len(worm)):
worm[i][0] = i0 - i
worm[i][1] = j0
setB(i0 - i,j0, 4)
updateHead()
def updateHead():
[i, j] = worm[0]
xy = ij2xy(i,j)
head.move(xy[0]+CW/2, xy[1]+CW/2)
def nextLevel():
global level
if level < len(levels) - 1:
level = level+1
else:
level = 0
restart()
def prevLevel():
global level
if level > 0:
level = level-1
else:
level = len(levels) - 1
restart()
def restart():
global isOver
isOver = False
updateLevel()
winTf.hide()
def loop():
if not isOver:
wormFallDown()
woodFallDown()
checkWin()
def tap():
if isOver:
#nextLevel()
pass
def keyup(code,key):
if code == 37: #左
moveWorm(-1, 0)
pass
elif code == 38: # 上
moveWorm(0, -1)
pass
elif code == 39: # 右
moveWorm(1, 0)
pass
elif code == 40: # 下
moveWorm(0, 1)
pass
elif code == 82: # r
restart()
pass
elif code == 78: # n
nextLevel()
pass
elif code == 80: # p
prevLevel()
pass
else:
pass
text("重置", W/2, 40, "red", "center").tap=restart
text("上一关", 0, 40, "red").tap=prevLevel
text("下一关", W, 40, "red","right").tap=nextLevel
winTf = text("恭喜过关","red","center")
winTf.hide()
restart()
class MyKeyBoard:
def __init__(self, x, y, w):
hw = w / 2
hhw = w * 0.75
self.arr = [
box(x, y - w, w, w, "transparent", "red"),
text("↑", x + hw, y - w + hhw, w, "center", "red"),
box(x, y, w, w, "transparent", "red"),
text("↓", x + hw, y + hhw, w, "center", "red"),
box(x - w, y, w, w, "transparent", "red"),
text("←", x - hw, y + hhw, w, "center", "red"),
box(x + w, y, w, w, "transparent", "red"),
text("→", x + w + hw, y + hhw, w, "center", "red"),
]
self.arr[0].tap=self.clickUp
self.arr[2].tap=self.clickDown
self.arr[4].tap=self.clickLeft
self.arr[6].tap=self.clickRight
delay(self.loop, 100)
def loop(self):
for i in range(len(self.arr)):
self.arr[i].front()
delay(self.loop, 100)
def onKeydown(self, keyCode, key):
try:
keyup(keyCode, key)
except e:
pass
def clickUp(self):
self.onKeydown(38, "ArrowLeft")
def clickDown(self):
self.onKeydown(40, "ArrowDown")
def clickLeft(self):
self.onKeydown(37, "ArrowLeft")
def clickRight(self):
self.onKeydown(39, "ArrowRight")
MyKeyBoard(768-160, 1024-80, 80)
'''
FFF = False
def debug():
global FFF
FFF = True
text("DEBUG", W, H-40, "red","right").tap=debug
'''
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。