学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import *
W = 768
H = 1024
CW = W // 6
m = 6
n = 6
ox = 0
oy = (H - n * CW) // 2
def xy2ij(x, y):
return [(x-ox)//CW,(y-oy)//CW]
def ij2xy(i, j):
return [ox+i*CW,oy+j*CW]
blox = [
"blox-t@005z",
"blox-w0@0064",
"blox-w1@0065",
"blox-w2@0066",
"blox-w3@0067",
"blox-w4@0068"
]
bloxSize = [
[1, 1],
[2, 1],
[2, 1],
[3, 1],
[1, 2],
[1, 3]
]
maps = [
[0,5,2,1,0,2],
[0,5,2,1,0,2,2,0,1,3,1,5,5,0,3,5,3,1],
[0,5,2,1,1,2,2,0,0,3,3,5,4,4,2,5,0,1,2,4,4,5,3,0,5,5,0],
[0,5,2,1,0,2,2,0,5,3,3,0,4,1,0,5,3,2,4,2,0,4,2,2,4,0,3,4,5,2,4,5,4,3,3,1],
[0,5,2,1,0,2,2,2,0,4,1,0,5,3,1,4,2,1,4,4,0,4,5,0,4,5,4,2,4,3,2,3,4,2,1,3,2,2,5],
[0,5,2,1,2,2,2,4,0,3,0,1,4,0,2,5,5,2,4,3,0,4,4,1,2,1,3,2,3,3,2,0,4,2,4,5],
[0,5,2,1,0,2,2,2,0,3,3,1,4,1,0,5,2,1,4,3,2,4,0,4,4,5,4,2,4,0,2,4,3,3,2,5],
[0,5,2,1,2,2,2,3,0,3,0,5,4,0,0,5,1,0,2,0,3,2,3,4,4,2,3,5,4,1],
[0,5,2,1,2,2,2,1,0,3,3,4,4,1,2,2,1,1,2,4,0,2,0,5,4,3,0,4,4,1,4,2,4],
[0,5,2,1,0,2,3,0,0,4,3,0,5,2,1,4,4,0,4,5,4,3,3,3,3,2,4,3,2,5,5,1,3],
[0,5,2,1,3,2,2,0,1,4,0,3,2,2,1,2,4,4,2,4,5,4,2,2,4,2,4,4,3,3,4,5,0,4,5,2],
[0,5,2,1,0,2,2,1,1,3,1,0,4,0,0,5,4,0,4,1,3,4,2,2,4,5,1,4,5,3,3,2,4],
[0,5,2,1,2,2,2,3,1,3,0,4,4,1,1,4,2,0,4,5,1,4,4,2,4,4,4,2,1,3,3,0,5],
[0,5,2,1,3,2,2,0,0,4,0,2,5,2,0,2,0,1,2,4,0,2,1,3,2,3,3,2,0,5,2,4,4,2,4,5,4,3,4,5,5,1],
[0,5,2,1,2,2,2,0,0,4,0,2,5,1,2,2,0,1,2,2,1,2,3,3,2,1,5,4,0,4,4,2,3,4,3,4,5,4,0,5,5,1],
[0,5,2,1,0,2,2,4,5,3,2,0,4,0,3,5,4,1,4,2,1,4,5,2,4,2,4,4,3,4,3,1,3],
[0,5,2,1,0,2,2,1,0,3,1,4,4,0,0,5,3,1,2,3,0,2,2,5,4,2,1,2,4,1,5,4,2],
[0,5,2,1,2,2,2,3,0,3,0,4,4,0,1,4,1,1,4,2,0,4,4,1,4,5,1,4,4,3,2,0,5,2,2,5],
[0,5,2,1,0,2,2,1,0,4,0,0,2,1,1,2,1,3,2,0,5,2,3,4,2,3,5,4,0,3,4,3,0,4,3,2,4,4,1,4,5,1,4,5,3,4,2,4],
[0,5,2,1,2,2,2,3,1,3,0,4,4,1,1,5,0,0,2,0,5,4,2,0,4,4,2,4,4,4,5,5,2],
[0,5,2,1,0,2,2,2,3,3,0,0,4,2,1,5,0,3,2,4,3,2,2,4,2,4,4,2,1,5,2,3,5,4,1,3,5,5,0],
[0,5,2,1,0,2,2,4,0,3,0,4,4,0,0,2,4,1,2,1,5,4,2,0,4,3,0,4,2,2,4,5,2,4,5,4],
[0,5,2,1,2,2,2,1,3,3,1,0,4,0,0,5,3,3,2,0,5,2,4,4,4,0,2,4,2,4,5,4,1,5,5,0],
[0,5,2,1,0,2,2,0,4,3,3,0,4,0,0,5,4,2,2,2,4,4,3,2,4,5,1,4,5,3,3,2,1,3,0,3],
[0,5,2,1,2,2,2,0,0,3,0,5,4,1,1,5,4,0,2,3,3,2,4,4,4,2,0,4,2,3,4,3,4],
[0,5,2,1,2,2,2,0,3,3,3,5,4,0,1,5,1,0,2,4,4,4,0,4,4,3,3,5,5,1,5,2,3],
[0,5,2,1,1,2,2,4,1,3,1,3,4,0,1,5,4,2,2,0,4,4,3,0,4,2,4,3,3,5],
[0,5,2,1,3,2,2,1,0,3,0,3,4,3,0,5,0,0,2,4,1,2,4,4,2,0,5,2,2,5,4,2,1,4,5,2,4,3,3],
[0,5,2,1,0,2,2,1,0,3,0,4,4,0,0,5,4,2,2,3,0,2,1,3,2,0,5,4,5,0,4,2,1,4,3,1,4,3,3],
[0,5,2,1,2,2,2,0,1,3,1,3,4,5,3,5,0,2,2,0,5,2,4,5,4,5,1,4,3,4,4,2,4,5,4,1],
[0,5,2,1,2,2,2,1,0,3,3,4,4,0,0,5,4,1,2,1,1,2,4,0,2,0,3,2,2,3,4,3,0,4,2,4,3,3,5,5,5,1],
[0,5,2,1,3,2,2,1,0,3,0,3,4,0,0,2,4,1,2,0,4,4,3,0,4,1,1,4,2,1,4,5,2,4,5,4],
[0,5,2,1,2,2,2,3,1,4,0,0,5,1,0,2,1,3,2,4,4,2,0,5,2,3,5,4,0,2,4,4,2,4,3,3,4,2,4,5,5,1],
[0,5,2,1,2,2,2,0,0,3,2,3,4,4,0,5,5,0,2,2,0,2,0,1,2,2,1,2,1,4,2,1,5,2,4,4,2,4,5,4,0,2,4,0,4,4,3,4],
[0,5,2,1,1,2,2,1,1,3,0,0,4,0,1,5,3,0,2,0,3,2,2,3,4,5,0,4,5,2,4,2,4,3,3,4],
[0,5,2,1,2,2,2,1,0,4,1,1,5,5,0,2,0,3,2,4,4,2,3,5,4,3,0,4,4,1,4,3,3,5,2,3],
[0,5,2,1,2,2,2,4,0,3,1,3,4,1,1,5,0,1,2,4,1,2,3,5,4,3,0,4,2,4,5,4,2,5,5,3],
[0,5,2,1,0,2,2,2,1,3,1,0,4,0,0,5,3,2,2,0,3,2,4,3,4,4,0,4,2,2,3,0,4],
[0,5,2,1,0,2,2,4,1,3,1,4,4,0,3,5,3,0,4,2,1,4,4,2,4,4,4,5,5,2],
[0,5,2,1,3,2,2,1,0,3,0,3,4,1,1,5,0,0,2,4,4,4,2,1,4,4,0,4,5,0,4,5,2,4,3,3,4,2,4],
[0,5,2,1,0,2,2,3,3,3,3,0,4,2,0,5,5,2,2,2,4,2,1,5,2,3,5,4,3,1,4,2,2,4,1,3],
[0,5,2,1,0,2,2,0,5,3,1,0,4,0,3,5,5,0,2,4,4,4,2,1,4,3,1,4,4,0,4,4,2,4,3,4,3,1,3],
[0,5,2,1,0,2,2,4,0,3,1,4,4,0,4,2,4,1,2,0,3,4,4,4,4,5,2,4,4,2,4,3,2,4,3,0,4,2,1],
[0,5,2,1,2,2,2,1,3,3,2,0,4,0,0,5,1,0,2,0,5,2,3,5,4,0,2,4,5,0,4,5,2,4,2,4,5,4,1],
[0,5,2,1,1,2,2,4,1,3,3,0,4,2,0,5,0,0,2,2,4,2,2,5,2,0,5,4,3,1,4,1,3,5,4,3,5,5,2],
[0,5,2,1,1,2,2,1,1,3,0,0,4,0,1,5,4,0,2,2,5,2,4,5,4,3,0,4,5,0,4,2,3,4,1,4,2,0,3]
]
level = 0
mp = maps[level]
pool = []
arr = []
curDrag = [None, 0, 0, 0, 0, 0]
isWin = False
tarWd = None
heroWd = None
winTf = text("过关了,点击进入下一关", 50, "red", "center")
fill("blox-bg@0069")
levelTf = text("第1关", 10, 70, 50, "red")
def getWood(tp):
for wd in pool:
if wd[0]==tp:
pool.remove(wd)
return wd
return [tp, stamp(blox[tp]), 0, 0, 0, 0]
def addWood(tp, i, j):
wd = getWood(tp)
sz = bloxSize[tp]
xy = ij2xy(i + sz[0]/2, j + sz[1]/2)
wd[2] = i
wd[3] = j
wd[4] = xy[0]
wd[5] = xy[1]
wd[1].move(xy[0], xy[1])
wd[1].show()
arr.append(wd)
if tp == 0:
global tarWd
tarWd = wd
elif tp == 1:
global heroWd
heroWd = wd
pass
def clearWood():
for wd in arr:
wd[1].hide()
pool.extend(arr)
arr.clear()
pass
def reStart():
global mp, isWin
winTf.hide()
isWin = False
mp = maps[level]
clearWood()
curDrag[0] = None
levelTf.change("第"+str(level+1)+"关")
for i in range(0, len(mp), 3):
addWood(mp[i], mp[i+1], mp[i+2])
pass
def nextLevel():
global level
if level < len(maps) - 1:
level = level + 1
reStart()
pass
def getWoodUnder():
for wd in arr:
tp = wd[0]
if tp == 0:
continue
sz = bloxSize[tp]
ij = xy2ij(x, y)
if ij[0] >= wd[2] and ij[0] < wd[2] + sz[0] and ij[1] >= wd[3] and ij[1] < wd[3] + sz[1]:
return wd
return None
def touch():
if isWin:
return
global curDrag
wd = getWoodUnder()
if wd != None:
curDrag = [wd, x, y, 0, 0, 0]
sz = bloxSize[wd[0]]
curDrag[5] = 1 if sz[0] > sz[1] else 2
pass
def untouch():
global curDrag
if curDrag[0] != None:
putWood(curDrag[0])
checkWin()
curDrag[0] = None
pass
def touching():
global curDrag
if curDrag[0] != None:
curDrag[3] = x - curDrag[1]
curDrag[4] = y - curDrag[2]
curDrag[1] = x
curDrag[2] = y
wd = curDrag[0]
if curDrag[5] == 1:
wd[4] = wd[4] + curDrag[3]
if canMove(wd):
wd[1].move(wd[4], wd[5])
else:
wd[4] = wd[4] - curDrag[3]
elif curDrag[5] == 2:
wd[5] = wd[5] + curDrag[4]
if canMove(wd):
wd[1].move(wd[4], wd[5])
else:
wd[5] = wd[5] - curDrag[4]
pass
pass
pass
def loop():
pass
def tap():
if isWin:
nextLevel()
pass
def checkWin():
global heroWd
global tarWd
global isWin
if checkHit(heroWd, tarWd):
isWin = True
winTf.show()
winTf.front()
pass
def putWood(wd):
tp = wd[0]
sz = bloxSize[tp]
ij = xy2ij(wd[4] - sz[0] * CW / 2 + CW / 2, wd[5] - sz[1] * CW / 2 + CW / 2)
xy = ij2xy(ij[0] + sz[0]/2, ij[1] + sz[1]/2)
wd[2] = ij[0]
wd[3] = ij[1]
wd[4] = xy[0]
wd[5] = xy[1]
wd[1].move(xy[0], xy[1], 100)
pass
def canMove(wd):
rect = getRect(wd, wd[4], wd[5])
if rect[0] - rect[2] < ox or rect[0] + rect[2] > ox + CW * m or rect[1] - rect[3] < oy or rect[1] + rect[3] > oy + CW * n:
return False
for wd0 in arr:
if wd0[0] == 0 or wd0 == wd:
continue
rect0 = getRect(wd0, wd0[4], wd0[5])
if abs(rect[0] - rect0[0]) < rect[2] + rect0[2] and abs(rect[1] - rect0[1]) < rect[3] + rect0[3]:
return False
return True
def checkHit(wd0, wd1):
rect0 = getRect(wd0, wd0[4], wd0[5])
rect1 = getRect(wd1, wd1[4], wd1[5])
return abs(rect0[0] - rect1[0]) < rect0[2] + rect1[2] and abs(rect0[1] - rect1[1]) < rect0[3] + rect1[3]
def getRect(wd, x0, y0):
tp = wd[0]
sz = bloxSize[tp]
return [x0, y0, sz[0] * CW / 2, sz[1] * CW / 2]
reStart()
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。