学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。
可以在线运行,效果如下(在新页面中打开链接):
代码如下(用到平台自定义的xdf库):
import time
from xdf import *
W = 768
H = 1024
CW = 64
M = int(W / CW)
N = int(H / CW)
isRunning = False
mps = [
[[4,8],[5, 8],[6,8],[7,8]],
[[6,6],[6,7],[6,8],[6,9]],
[[3,9], [3,8], [4,8], [5,8], [6,8], [7,8], [8,8], [9,8]],
[[5,6], [6,6], [6,7], [6,8], [6,9], [6,10], [6,11], [6,12]],
[[4,9],[5,9],[5,8],[6,8],[6,7],[7,7]],
[[5,10],[5,9],[6,9],[6,8],[7,8],[7,7]],
[[2,10],[2,9],[3,9],[4,9],[4,8],[5,8],[6,8],[6,7],[7,7],[8,7]],
[[4,4],[5,4],[5,5],[5,6],[6,6],[6,7],[6,8],[7,8],[7,9],[7,10]],
[[4,4],[4, 5],[4, 6],[4,7], [4, 8],[5, 8],[6,8],[7,8],[8,8]],
[[3,5],[4, 5],[5, 5],[6,5], [7, 5],[7, 6],[7,7],[7,8],[7,9]],
]
nums = [3,3,4,4,4,4,5,5,6,6]
answers = [
"RRR",
"DDD",
"URT1",
"RDT1",
"RTU0",
"UTR0",
"URRT0",
"RDDT0",
"D十0RT3",
"R十0DT3",
]
mpId = 0
mp = []
cubes = []
heroPos = [0,0]
def ij2xy(i, j):
return [i * CW + CW / 2, j * CW + CW / 2]
def xy2ij(x, y):
return [int(x/CW + 0.5), int(y/CW + 0.5)]
baseUrl = "https://code-file.xdf.cn/files/dingdangweb/20230810/"
for i in range(M):
a = []
cubes.append(a)
for j in range(N):
xy = ij2xy(i, j)
co = '1691645320008_385580.png'
if (j & i) % 2 != (j | i) % 2:
co = '1691645320015_029791.png'
b = stamp(baseUrl + co, xy[0], xy[1])
a.append(b)
target = stamp(baseUrl+"1691645320000_235392.png")
hero = [
stamp(baseUrl + "1691645320028_632517.png"),
stamp(baseUrl + "1691645320013_192993.png"),
stamp(baseUrl + "1691645320030_177936.png"),
stamp(baseUrl + "1691645320027_277487.png"),
stamp(baseUrl + "1691645320026_494298.png"),
stamp(baseUrl + "1691645320000_157226.png"),
stamp(baseUrl + "1691645320026_731721.png"),
stamp(baseUrl + "1691646391107_430018.png"),
]
heroId = 0
levelTf = text("第1关", 600, 50, 50, "red")
numTf = text("目标指令个数:4", 200, 50, 30, "red")
numTf2 = text("输入指令个数:4", 200, 100, 30, "red")
answerTf = text("答案:RRR", 200, 150, 30, "red")
loseTf = text("失败了,重新输入指令", 50, "red", "center")
winTf = text("过关了,进入下一关", 50, "red", "center")
runBtn = box(10, 10, 150, 50, '#cccccc', "black")
runBtnTf = text("输入指令", 85, 45, 30, "black", "center")
ansBtn = box(10, 70, 150, 50, '#cccccc', "black")
ansBtnTf = text("答案", 85, 105, 30, "black", "center")
def refreshMp():
for i in range(M):
for j in range(N):
cubes[i][j].hide()
for i in range(len(mp)):
cubes[mp[i][0]][mp[i][1]].show()
def updateHeroPos(t):
hxy = ij2xy(heroPos[0],heroPos[1])
for sp in hero:
sp.move(hxy[0], hxy[1], t)
def updateTargetPos():
global mp
n = len(mp) - 1
hxy = ij2xy(mp[n][0], mp[n][1])
target.move(hxy[0], hxy[1])
def reset():
global heroPos, mp, mps, mpId,isRunning
isRunning = False
if mpId >= len(mps):
mpId = 0
levelTf.change("第"+str(mpId + 1)+"关")
numTf.change("目标指令个数:" + str(nums[mpId]))
numTf2.change("输入指令个数:0")
answerTf.change("答案:" + answers[mpId])
answerTf.hide()
mp = mps[mpId]
loseTf.hide()
winTf.hide()
heroPos = [mp[0][0], mp[0][1]]
refreshMp()
updateHeroPos(0)
updateTargetPos()
stand()
def stand():
global heroId
heroId = 0
def walk():
global heroId
if heroId == 0:
heroId = 1
def moveHero(x,y):
global heroPos
heroPos[0] = heroPos[0] + x
heroPos[1] = heroPos[1] + y
updateHeroPos(1000 * 0.9)
time.sleep(1)
def moveLeft():
moveHero(-1, 0)
def moveRight():
moveHero(1, 0)
def moveUp():
moveHero(0, -1)
def moveDown():
moveHero(0, 1)
def checkLose():
global mp, heroPos
for i in range(len(mp)):
if heroPos[0] == mp[i][0] and heroPos[1] == mp[i][1]:
return False
lose()
return True
def checkWin():
global mp,heroPos
n = len(mp) - 1
if heroPos[0] == mp[n][0] and heroPos[1] == mp[n][1]:
win()
return True
return False
def lose():
stand()
loseTf.show()
delay(reset, 2000)
def win():
stand()
global mpId
mpId = mpId + 1
winTf.show()
delay(reset, 2000)
def run(cmds):
numTf2.change("输入指令个数:" + str(len(cmds)))
walk()
global isRunning
isRunning = True
#print('hello',cmds)
n = len(cmds)
i = 0
c = 0
zm = "零一二三四五六七八九十"
while i < n and i >= 0:
char = cmds[i]
if char in "左←L":
moveLeft()
elif char in "右→R":
moveRight()
elif char in "上↑U":
moveUp()
elif char in "下↓D":
moveDown()
elif char in zm:
if c == zm.index(char):
i = i + 1
elif char.isdigit():
i = int(char) - 1
elif char in "目标T":
if checkWin():
return
elif char in "清C":
c = -1
c = c + 1
if checkLose():
return;
i = i + 1
if not checkWin():
lose()
def onStart():
global isInput, isRunning
if isRunning:
return
isInput = True
#print("onStart")
isInput = False
def loop():
global isInput,cmds,heroId
for sp in hero:
sp.hide()
hero[heroId].show()
if heroId != 0:
heroId = heroId + 1
if heroId == len(hero):
heroId = 1
if isInput:
isInput = False
cmds = input("指令")
run(cmds)
def showAnswer():
answerTf.show()
runBtn.tap = onStart
ansBtnTf.tap = showAnswer
reset()
也可以下载代码,本地python环境运行(用pygame封装了xdf库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。