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