23
2025
05

python编程学习-woodworm

学习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
'''
« 上一篇下一篇 »

相关文章:

python编程学习-woodworm关卡编辑器  (2025-5-23 15:28:45)

woodworm-像素木虫  (2025-5-22 8:57:29)

python编程学习-黑白棋  (2024-11-15 11:43:40)

python编程学习-迷宫04  (2024-11-15 11:43:7)

python编程学习-迷宫03  (2024-11-15 11:42:42)

python编程学习-迷宫02  (2024-11-15 11:42:16)

python编程学习-迷宫01  (2024-11-15 11:41:55)

python编程学习-连连看  (2024-11-15 11:41:16)

python编程学习-进入大圈  (2024-11-15 11:40:57)

python编程学习-跳伞  (2024-11-15 11:40:27)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。