14
2024
11

python编程学习-俄罗斯方块

学习python编程,在新东方少儿编程官网的自由创作平台做的一些作品。

可以在线运行,效果如下(在新页面中打开链接):

代码如下(用到平台自定义的xdf库):

from xdf import *

W = 768
H = 1024
CW = 64
M = int(W / CW)
N = int(H / CW)
cubes = []
data = []
isOver = False
TIME_STEP = 20
time = 0

score = 0
L = [[[1, 0], [1, 1], [1, 2], [0, 2]],
    [[0, 0],[0, 1], [1, 1], [2, 1]],
    [[0, 0], [1, 0], [0, 1], [0, 2]],
    [[0, 0], [1, 0], [2, 0], [2, 1]]];
B = [[[0,1],[0,2],[1,1],[1,2]],
    [[0,1],[0,2],[1,1],[1,2]],
    [[0,1],[0,2],[1,1],[1,2]],
    [[0, 1], [0, 2], [1, 1], [1, 2]]];
J = [[[0,1],[1,1],[2,0],[2,1]],
    [[0,0],[1,0],[1,1],[1,2]],
    [[0,1],[0,2],[1,1],[2,1]],
    [[1, 0], [1, 1], [1, 2], [2, 2]]];
T = [[[0,1],[1,0],[1,1],[1,2]],
    [[0,1],[1,1],[1,2],[2,1]],
    [[1,0],[1,1],[1,2],[2,1]],
    [[0, 1], [1, 0], [1, 1], [2, 1]]];
I = [[[1,0],[1,1],[1,2],[1,3]],
    [[0,1],[1,1],[2,1],[3,1]],
    [[1,0],[1,1],[1,2],[1,3]],
    [[0, 1], [1, 1], [2, 1], [3, 1]]];
Z = [[[0,0],[0,1],[1,1],[1,2]],
    [[0,1],[1,0],[1,1],[2,0]],
    [[0,0],[0,1],[1,1],[1,2]],
    [[0, 1], [1, 0], [1, 1], [2, 0]]];
S = [[[0,0],[1,0],[1,1],[2,1]],
    [[0,1],[0,2],[1,0],[1,1]],
    [[0,0],[1,0],[1,1],[2,1]],
    [[0, 1], [0, 2], [1, 0], [1, 1]]];
tps = [L,B,J,T,I,Z,S]
tp = 0 #L、B、J、T、I、Z、S
rot = 0 #0、1、2、3
blockArr = []
bottom = [int(M/2)-1, -1]
def getTpArr():
    return tps[tp]

def ij2xy(i, j):
    return [i * CW, j * CW]

def xy2ij(x, y):
    return [int(x / CW), int(y / CW)]

for i in range(M):
    cbr = []
    cubes.append(cbr)
    vr = []
    data.append(vr)
    for j in range(N):
        vr.append(0)
        xy = ij2xy(i, j)
        c = box(xy[0] + 2, xy[1] + 2, CW - 4, CW - 4, 'gray', 'black')
        cbr.append(c)
overTxt = text("游戏结束,按空格键开始", 50, 'red', 'center')
scoreTxt = text("得分", 50, 50, 50, 'red', '')

def checkOver():
    global blockArr,bottom
    for i in range(len(blockArr)):
        if bottom[1] + blockArr[i][1] < 0:
            gameOver()
            return True
    return False

def dispear(j):
    global data
    while j >= 0:
        sm = 0
        for i in range(M):
            v = 0
            if j != 0:
                v = data[i][j - 1]
            data[i][j] = v
            sm = sm + v
        if sm == 0:
            break
        j = j - 1

def addScore():
    global score
    score = score + 100

def checkDispear():
    global M,N,data
    j = N - 1
    while j >= 0:
        sm = 0
        for i in range(M):
            sm = sm + data[i][j]
        if sm == 0: #不用再往上查了
            break
        if sm == M: #可消除
            dispear(j)
            j = j + 1
            addScore()
        j = j - 1

def checkItem(i, j):
    if j < 0:
        return True
    global M,N,data
    if i < 0 or i >= M or j >= N:
        return False
    if data[i][j] != 0:
        return False
    return True

def checkMoveAble(arr, topI, topJ):
    for i in range(len(arr)):
        ii = arr[i][0]
        jj = arr[i][1]
        if not checkItem(topI + ii, topJ + jj):
            return False
    return True

def putBlock():
    global blockArr,data,bottom
    for i in range(len(blockArr)):
        ii = blockArr[i][0] + bottom[0]
        jj = blockArr[i][1] + bottom[1]
        if jj >= 0:
            data[ii][jj] = 1
    checkDispear()

def createBlock():
    global bottom,tp,tps,rot,blockArr
    tp = random(len(tps))-1
    rot = random(4) - 1
    blockArr = tps[tp][rot]
    bottom = [int(M/2)-1, -1]

def getBlockArr(t, rot):
    global tps
    return tps[t][rot]

def moveLeft():
    global bottom, blockArr
    if checkMoveAble(blockArr, bottom[0] - 1, bottom[1]):
        bottom[0] = bottom[0] - 1
        
def moveRight():
    global bottom,blockArr
    if checkMoveAble(blockArr, bottom[0] + 1, bottom[1]):
        bottom[0] = bottom[0] + 1
        
def moveDown():
    global bottom,blockArr
    if checkMoveAble(blockArr,bottom[0], bottom[1] + 1):
        bottom[1] = bottom[1] + 1
    else:
        if not checkOver():
            putBlock()
            createBlock()

def rotate():
    global bottom,blockArr,rot,tp
    r = (rot + 1) % 4
    arr = getBlockArr(tp, r)
    if checkMoveAble(arr, bottom[0], bottom[1]):
        rot = r
        blockArr = arr
        
def keydown(key, keycode):
    global isOver,time
    if isOver:
        if key == 32:
            reset()
        return
    if key == 37: #left
        moveLeft()
    elif key == 39: #right
        moveRight()
    elif key == 40: #down
        moveDown()
        time = 0
    elif key == 38: #up
        rotate()
    #print(key, keycode)
    
def loop():
    global isOver
    if isOver:
        return
    global time,TIME_STEP
    time = time + 1
    if time >= TIME_STEP:
        time = 0
        moveDown()
    refresh()

def gameOver():
    global isOver,overTxt,time
    isOver = True
    time = 0
    overTxt.show()
    refresh()
    
def reset():
    global isOver,overTxt, time, data,score
    score = 0
    isOver = False
    time = 0
    overTxt.hide()
    for i in range(M):
        for j in range(N):
            data[i][j] = 0 #random(2) - 1
    createBlock()
    refresh()

def refresh():
    global data,cubes,blockArr,bottom, score,scoreTxt
    scoreTxt.change("得分:" + str(score))
    for i in range(M):
        for j in range(N):
            if data[i][j] == 0:
                cubes[i][j].change('gray')
            else:
                cubes[i][j].change('black')
    for i in range(len(blockArr)):
        ii = blockArr[i][0] + bottom[0]
        jj = blockArr[i][1] + bottom[1]
        if jj >= 0:
            cubes[ii][jj].change('black')

reset()

# 加个空格按钮,加个按钮,在触屏设备上也能用
def onClickSpace():
    keydown(32, " ")
btnSpace = text("空格键", 768 - 150, 50, 50, 'red', '')
btnSpace.tap = onClickSpace

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:
            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-14 16:43:25)

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

python编程学习-别踩白块  (2024-11-14 16:38:59)

python编程学习-井字棋  (2024-11-14 16:34:9)

python编程学习-五子棋  (2024-11-14 16:33:23)

python编程学习-乒乓  (2024-11-14 16:32:46)

python编程学习-一笔画关卡生成  (2024-11-14 16:32:6)

python编程学习-一笔画  (2024-11-14 16:31:27)

python编程学习-woblox  (2024-11-14 16:30:47)

python编程学习-where-my-ice-cream  (2024-11-14 16:29:57)

发表评论:

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