吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5261|回复: 16
收起左侧

[Python 转载] 分享一个Python写的俄罗斯方块源码,非常适合新手学习

  [复制链接]
skyaway 发表于 2020-4-26 19:10
运行环境Python3.6.5,pygame1.9.4
按↑改变方向,↓加速下落,←和→移动,有计分功能
使用pygame编写,清晰的函数式编程,把各个动作封装在不同函数中,具体请看代码的函数名和注释,希望能和大家一起在吾爱共同进步!
不想看代码说明的可直接拉到最后下载代码!
import pygame, sys, random, time

def new_draw():
    screen.fill(white)
    for i in range(1, 21):
        for j in range(10):
            bolck = background[i][j]
            if bolck:
                pygame.draw.rect(screen, blue, (j * 25 + 1, 500 - i * 25 + 1, 23, 23))

        x, y = centre
        for i, j in active:
            i += x
            j += y
            pygame.draw.rect(screen, blue, (j * 25 + 1, 500 - i * 25 + 1, 23, 23))

        pygame.display.update()

def move_LR(n):
    """n=-1代表向左,n=1代表向右"""
    x, y = centre
    y += n
    for i, j in active:
        i += x
        j += y
        if j < 0 or j > 9 or background[i][j]:
            break
    else:
        centre.clear()
        centre.extend([x, y])

def rotate():
    x, y = centre
    l = [(-j, i) for i, j in active]
    for i, j in l:
        i += x
        j += y
        if j < 0 or j > 9 or background[i][j]:
            break
    else:
        active.clear()
        active.extend(l)

def move_down():
    x, y = centre
    x -= 1
    for i, j in active:
        i += x
        j += y
        if background[i][j]:
            break
    else:
        centre.clear()
        centre.extend([x, y])
        return
    # 如果新位置未被占用 通过return结束
    # 如果新位置被占用则继续向下执行
    x, y = centre
    for i, j in active:
        background[x + i][y + j] = 1

    l = []
    for i in range(1, 20):
        if 0 not in background[i]:
            l.append(i)
    # l装 行号,鉴于删去后,部分索引变化,对其降序排列,倒着删除
    l.sort(reverse=True)

    for i in l:
        background.pop(i)
        background.append([0 for j in range(10)])
        # 随删随补

    score[0] += len(l)
    pygame.display.set_caption("分数:%d" % (score[0]))

    active.clear()
    active.extend(list(random.choice(all_block)))
    # all_block保存7种形状的信息,手打出来的
    centre.clear()
    centre.extend([20, 4])

    x, y = centre
    for i, j in active:
        i += x
        j += y
        if background[i][j]:
            break
    else:
        return
    alive.append(1)

if __name__ == '__main__':
    pygame.init()
    screen = pygame.display.set_mode((250, 500))
    pygame.display.set_caption("俄罗斯方块")
    fclock = pygame.time.Clock()

    all_block = (((0, 0), (0, -1), (0, 1), (0, 2)),
                 ((0, 0), (0, 1), (-1, 0), (-1, 1)),
                 ((0, 0), (0, -1), (-1, 0), (-1, 1)),
                 ((0, 0), (0, 1), (-1, -1), (-1, 0)),
                 ((0, 0), (0, 1), (1, 0), (0, -1)),
                 ((0, 0), (1, 0), (-1, 0), (1, -1)),
                 ((0, 0), (1, 0), (-1, 0), (1, 1)))
    background = [[0 for i in range(10)] for j in range(24)]
    background[0] = [1 for i in range(10)]
    active = list(random.choice(all_block))
    centre = [20, 4]
    score = [0]

    black = 0, 0, 0
    white = 255, 255, 255
    blue = 0, 0, 255

    times = 0
    alive = []
    press = False
    while True:
        for event in pygame.event.get():
            if event.type == pygame.quit:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    move_LR(-1)
                elif event.key == pygame.K_RIGHT:
                    move_LR(1)
                elif event.key == pygame.K_UP:
                    rotate()
                elif event.key == pygame.K_DOWN:
                    press = True
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_DOWN:
                    press = False
        if press:
            times += 10

        if times >= 50:
            move_down()
            times = 0
        else:
            times += 1

        if alive:
            pygame.display.set_caption("over分数:%d" % (score[0]))
            time.sleep(3)
            break
        new_draw()
        fclock.tick(100)
1.png

俄罗斯方块.zip

1.47 KB, 下载次数: 65, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 5吾爱币 +9 热心值 +5 收起 理由
oceanside019 + 1 + 1 谢谢@Thanks!
丁ding + 1 + 1 谢谢@Thanks!
登场丶谢幕 + 1 + 1 我很赞同!
Zeaf + 1 + 1 学习了
苏紫方璇 + 5 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ciker_li 发表于 2020-4-26 21:59
点结束时关闭的较慢,应该设置一个暂停键,一个退出键
还有玩的过程中,有时候画面会闪烁
生有莫笑 发表于 2020-4-26 22:27
xtuuqtbl 发表于 2020-4-27 10:18
ils 发表于 2020-4-27 10:23
谢谢,正在学习Python,研究研究
huanwuying 发表于 2020-4-27 10:50
新手学习中,谢谢分享
ggpojie 发表于 2020-4-27 14:25
学习下,感谢
夜归雪 发表于 2020-4-27 14:31
感谢分享
北衣 发表于 2020-4-27 15:51
不错看一下
fate·fanxi 发表于 2020-4-27 21:32
谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-5 01:15

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表