学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
from xdf import *
levels = [
'sswwwsss;sswtwsss;sswpwwww;wwwbpbtw;wtpbmwww;wwwwbwss;ssswtwss;ssswwwss',
'wwwww;wpmpw;wpppw;wpbpw;wpbpw;wpbpw;wpppw;wpppw;wpppw;wpppw;wtttw;wwwww',
'ssswwwwwws;swwwppppws;wwtpbwwpww;wttbpbppmw;wttpbpbpww;wwwwwwppws;ssssswwwws',
'ssssswww;ssssswtw;swwwwwtw;wwpbpptw;wpppbbtw;wppbwptw;wwwpwwpw;wppbpppw;wmpppwww;wwwwwwss',
'sssssswwwws;sssssswpmww;sssssswpttw;sssssswbttw;sswwwwwpbtw;swwpppwbptw;wwppwbwpxtw;wppwppppxtw;wpbppbwptww;wpwpwpbpwws;wpwpppwpwws;wppbwbppwss;wwpppppwwss;swwwwwwwsss',
'ssswwwwwwwss;ssswtttttwss;ssswtppptwss;ssswtppptwss;ssswwwpwwwss;wwwwwpppwwww;wpppwpbpwppw;wppbpbpbpbmw;wwbwwpbpwpww;wpbppwpwpppw;wpppppbppppw;wwwwwpppwwww;sssswwwwwsss',
'sswwwws;wwwppww;wpbmttw;wpwpttw;wpwbwww;wpwpppw;wpppbpw;wwpbppw;swppwww;swwwwss',
'ssswwwwws;swwwpppww;wwpbpbpmw;wppppwbpw;wpbwwwppw;wptttwbpw;wwtbtbppw;swwttpwww;sswwwwwss',
'wwwwwwww;wppppppw;wpbxxxpw;wpxppxpw;wpxppxpw;wpxxxtpw;wpppppmw;wwwwwwww',
'sssssswwwwss;wwwwwwwppwss;wppwpppppwss;wpbbpbwppwss;wppwwtwpwwww;wwpwwtwppbpw;wwpwptpbpwpw;wpppxttwpppw;wppwptpwpwww;wwpwwtwwbwss;swpppppbmwss;swppwwwwwwss;swwwwsssssss',
'swwwwss;swppwss;wwppwww;wpbtppw;wptbxpw;wmptbpw;wwwppww;sswwwws',
'wwwwwss;wpppwww;wtwbppw;wpmbxpw;wppbppw;wwtwtww;swpppws;swwwwws',
'wwwwwswwwww;wpppwwwpppw;wpbbpwtpbpw;wpbttttxwmw;wpwxtbttbpw;wpbptwpbbpw;wpppwwwpppw;wwwwwswwwww',
'wwwwwww;wtppppw;wmwxppw;wppbppw;wwwpxww;sswppws;sswwwws'
]
level = 0
mp = []
CW = 0
M = 0
N = 0
W = 768
H = 1024
oxy = 0.001
cubes = []
isPlaying = False
hero = 0
hintTxts = [
box(oxy,oxy, 768, 1024, "black"),
text("点击空格开始", 768/2, 1024/2 - 100, 60, "red", "center"),
text("←↑↓→键控制移动", 768/2, 1024/2, 60, "red", "center"),
text("按下‘r’重新开始", 768/2, 1024/2 + 100, 60, "red", "center"),
text("点击任意位置开始", 768/2, 1024/2 + 200, 60, "red", "center")
]
winTxt = text("点击空格进入下一关", 768/2, 1024/2, 80, "red", "center")
levelTxt = text("第1关", 1, 60, 50, "red")
def showWin():
winTxt.show()
winTxt.front()
def hideWin():
winTxt.hide()
def showHint():
for i in range(len(hintTxts)):
hintTxts[i].front()
hintTxts[i].show()
def hideHint():
for i in range(len(hintTxts)):
hintTxts[i].hide()
def initLevel():
global level,mp,CW,M,N,W,H,cubes,oxy,hero,levelTxt
s = levels[level]
n = len(s)
mp = []
for i in range(n):
c = s[i]
if c != ';':
mp.append(c)
N = s.index(';')
M = int((n + 1) / (N + 1))
CW = min(int(W/N), int(H/M))
n = len(cubes)
for i in range(M * N - n):
cb = [
box(200, 200, CW, CW, "black", "black"), # wall
box(200, 200, CW / 2, CW / 2, "red", "black"), # hole
box(200, 200, CW, CW, "green", "black"), # box
circle(100, 100, CW / 2, "red") # hero
]
cb[1].rotate(45)
cubes.append(cb)
for i in range(len(mp)):
setPos(i)
if mp[i] == 'm' or mp[i] == 'y':
hero = i
levelTxt.front()
levelTxt.change("第"+ str(level + 1) + "关")
def n2xy(n):
global CW,M,N,W,H,oxy
return (
(W - CW * N + CW) / 2 + CW * (n % N) + oxy,
(H - CW * M + CW) / 2 + CW * int(n / N) + oxy
)
def setPos(i):
cb = cubes[i]
xy = n2xy(i)
for j in range(len(cb)):
cb[j].move(xy[0], xy[1])
cb[0].size(CW)
cb[1].size(CW / 2)
cb[2].size(CW)
cb[3].size(CW / 2)
def hideCb(i):
global level,mp,CW,M,N,W,H,cubes,oxy
cb = cubes[i]
cb[0].hide()
cb[1].hide()
cb[2].hide()
cb[3].hide()
def showCb(i, c):
global level,mp,CW,M,N,W,H,cubes,oxy
hideCb(i)
cb = cubes[i]
if c == 'w':
cb[0].show()
elif c == 't':
cb[1].show()
elif c == 'b':
cb[2].show()
elif c == 'm':
cb[3].show()
elif c == 'x':
cb[1].show()
cb[2].show()
elif c == 'y':
cb[1].show()
cb[3].show()
def render():
global level,mp,CW,M,N,W,H,cubes,oxy
n0 = M * N
n1 = len(cubes)
for i in range(n1):
if i < n0:
showCb(i, mp[i])
else:
hideCb(i)
def tryMoveHero(di, dj):
global level,mp,CW,M,N,W,H,cubes,oxy,hero
i0 = int(hero / N)
j0 = hero % N
i1 = i0 + di
j1 = j0 + dj
c0 = mp[hero]
n1 = i1 * N + j1
c1 = mp[n1]
#print('tryMoveHero', hero)
#print(i0, j0, c0)
#print(i1, j1, c1)
if c1 == 'w':
return False
if c1 == 'b' or c1 == 'x':
i2 = i1 + di
j2 = j1 + dj
n2 = i2 * N + j2
c2 = mp[n2]
if c2 == 'b' or c2 == 'x' or c2 == 'w':
return False
#
if c2 == 'p':
mp[n2] = 'b'
else:
mp[n2] = 'x'
#
if c1 == 'b':
mp[n1] = 'm'
else:
mp[n1] = 'y'
else:
if c1 == 'p':
mp[n1] = 'm'
else:
mp[n1] = 'y'
if c0 == 'm':
mp[hero] = 'p'
else:
mp[hero] = 't'
hero = n1
render()
return True
def moveLeft():
return tryMoveHero(0, -1)
def moveUp():
return tryMoveHero(-1, 0)
def moveRight():
return tryMoveHero(0, 1)
def moveDown():
return tryMoveHero(1, 0)
def checkWin():
global isPlaying,mp
for i in range(len(mp)):
c = mp[i]
if c == 'b':
return False
showWin()
isPlaying = False
def keydown(keyCode, key):
global isPlaying,level,levels
if keyCode == 82:
initLevel()
render()
hideHint()
hideWin()
isPlaying = True
return
if isPlaying:
if keyCode == 37:
moveLeft() and checkWin()
elif keyCode == 38:
moveUp() and checkWin()
elif keyCode == 39:
moveRight() and checkWin()
elif keyCode == 40:
moveDown() and checkWin()
else:
if keyCode == 32:
isPlaying = True
level = level + 1
if level >= len(levels):
level = 0
initLevel()
render()
hideHint()
hideWin()
showHint()
hideWin()
isPlaying = False
level = -1
# 添加控制按钮,方便在触屏设备上玩。
# 点击任意位置代替“空格”,点击方向按钮,代替方向键。
def tap():
keydown(32, " ")
def clickRestart():
keydown(82, "r")
btnRestart = text("重新开始", 1, 1000, 50, "red")
btnRestart.tap=clickRestart
class MyKeyBoard:
def __init__(self, x, y, w):
hw = w / 2
hhw = w * 0.75
self.arr = [
box(x, y - w, w, w, "white", "red"),
text("↑", x + hw, y - w + hhw, w, "center", "red"),
box(x, y, w, w, "white", "red"),
text("↓", x + hw, y + hhw, w, "center", "red"),
box(x - w, y, w, w, "white", "red"),
text("←", x - hw, y + hhw, w, "center", "red"),
box(x + w, y, w, w, "white", "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:
keydown(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-200, 1024-100, 100)
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。