15
2024
11

python编程学习-推箱子

学习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库)。



« 上一篇下一篇 »

相关文章:

python编程学习-收不完的西瓜  (2024-11-15 11:35:0)

python编程学习-拼图  (2024-11-15 11:33:25)

python编程学习-扫雷  (2024-11-15 11:32:58)

python编程学习-小学数学加减分解题  (2024-11-15 11:32:29)

python编程学习-对角棋  (2024-11-15 11:32:8)

python编程学习-密室逃生  (2024-11-15 11:31:35)

python编程学习-围住神经猫  (2024-11-15 11:31:6)

python编程学习-四子棋  (2024-11-15 11:30:32)

python编程学习-华容道  (2024-11-14 16:43:25)

python编程学习-动画  (2024-11-14 16:39:37)

发表评论:

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