学习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库)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。