要知道什么是‘递归’.|

2c237c6

园龄:1年4个月粉丝:2关注:0

关于我用python写俄罗斯方块这件事(俄罗斯方块源码)

我一开始想写个游戏是从俄罗斯方块开始,开始和大多数人一样都是从网上找资源,然后依照资源学习,但是学到一半却发现教程上的资源都不够完整,怎么说就像是故意留出来的bug,想让你通过前面的学习去完善,开始的时候我并不怎么认为,只是想这个博主,只是不想将源码共享,这是正常情况源码对程序员来说就是自己的孩子,谁又会将自己的孩子给其他人呢?

与是我就在网上找其他教程,但是都是少点东西,于是我便从基础开始学,一点点理解俄罗斯方块的原理,其实俄罗斯方块很简单无非那几个逻辑,我用python实现,就创建几个类去实现相应功能就可以了

# 俄罗斯方块基本类
# 方块
# 旋转
# 移动
# 物块
# 形状
# 碰撞检测
# 绘制

然后就是俄罗斯方块逻,如果你想用Python实现俄罗斯方块游戏的逻辑,可以考虑以下几个关键的逻辑和功能:

1. 游戏区域的表示:使用二维数组或列表来表示游戏区域的网格。每个元素可以表示一个方块的状态,如是否被占据。

2. 方块的表示与移动:定义不同形状的方块,并使用坐标来表示方块在游戏区域中的位置。实现方块的移动(左右移动、旋转)以及碰撞检测,确保方块在合法范围内移动。

3. 方块的下落与固定:实现方块的自动下落和手动下落功能,以及判断方块是否需要固定在游戏区域中。

4. 行消除:检测并消除已填满的行,更新游戏区域的状态,并计算得分。

5. 游戏结束条件:判断游戏是否结束,例如当方块堆积到游戏区域的顶部时。

6. 用户输入与界面交互:监听用户的键盘输入或者鼠标点击等事件,响应用户的操作,并更新游戏区域的状态。

7. 游戏循环:使用游戏循环来控制游戏的进行,包括更新游戏状态、绘制游戏界面、处理用户输入等。

这些是俄罗斯方块游戏实现的基本逻辑和功能,在写程序前依照这个思路写下去就可以了。

先要了解我们要实现的要求,在依照要求去学就可以了,现在我发现网上大多的教程都没有去教我们要完全学会要学什么,总是步骤,可能他们那些大佬认为我们菜酱知道这些东西现在我学会了俄罗斯方块我就告诉大家要学什么。

首先是要学pygame当然不是全学毕竟我们也暂时用不上怎么多,要使用Python实现俄罗斯方块游戏,

你将可以使用Pygame库来创建游戏窗口、处理用户输入、绘制图形等。

以下是一些在Pygame中常用的函数和模块:

1. pygame.init():初始化Pygame库。

2. pygame.display.set_mode():创建游戏窗口。

3. pygame.event.get():获取所有待处理的事件。

4. pygame.event.pump():处理所有待处理的事件。

5. pygame.key.get_pressed():检测按键状态。

6. pygame.draw.rect():绘制矩形。

7. pygame.draw.polygon():绘制多边形。

8. pygame.draw.line():绘制线段。

9. pygame.time.Clock():控制游戏帧率。

10. pygame.font.Font():加载字体文件。

11. pygame.font.render():渲染文本。

12. pygame.mixer.Sound():加载声音文件。

13. pygame.mixer.music.load():加载音乐文件。

14. pygame.mixer.music.play():播放音乐。

15. pygame.image.load():加载图像文件。

16. pygame.transform.scale():缩放图像。

这些函数和模块是Pygame库中常用的功能,可以帮助你实现俄罗斯方块游戏的各个方面,如绘制游戏界面、处理用户输入、播放音效和音乐等。你可以根据具体需求,在代码中适时调用这些函数和模块来完成相应的功能。

这些就是pygame我们要用的函数

好大家看看代码实现

import pygame, sys
import random
import time

# 物块的形状是二维数组
all_block = [
    [[0, 0], [0, 1], [0, 2], [0, 3], ],  # 一个物体4个方块组成
    [[0, 0], [0, 1], [1, 0], [1, 1], ],  # 7个列表表示7种形状
    [[0, 0], [1, 0], [0, 1], [0, 2], ],
    [[0, 0], [0, 1], [0, -1], [0, -2], ],
    [[0, 0], [0, 1], [1, 1], [1, 2], ],
    [[0, 0], [0, -1], [1, -1], [1, -2], ],
    [[0, 0], [0, 1], [0, -1], [1, 0]],
]

backgroud = [[0 for column in range(0, 10)] for row in range(0, 23)]  # 创造列表集
backgroud[0] = [1 for colum in range(0, 10)]  # 把0层修改为[1*10]

# 设置全局变量
select_block = list(random.choice(all_block))  # 从7个形状中随机选择一种
initial_position = [21, 5]
times = 0  # 计时
score = [0]  # 得分
gameover = []  # 游戏结束
press = False  # 按键加速
# 初始化
pygame.init()
screen = pygame.display.set_mode((400, 800))  # 设置窗口大小


def block_down():
    y, x = initial_position#initial_position = [21, 5]
    y -= 1#表示移动
    for row, column in select_block:
        row += y
        column += x
        if backgroud[row][column]:  # 注意
            break
    else:
        initial_position.clear()
        initial_position.extend([y, x])  # [x,y]定义:[一个列表集,第一个值表示1行row,第二个值表示column
        return
    y, x = initial_position
    for row, column in select_block:
        row += y     #对当前选择的方块
        column += x
        backgroud[row][column] = 1
    complete_row = []
    for row in range(1, 21):
        if 0 not in backgroud[row]:
            complete_row.append(row)
    for row in complete_row:
        backgroud.pop(row)
        backgroud.append(list(0 for column in range(0, 10)))  # 注意
    score[0] += len(complete_row)
    pygame.display.set_caption('Tetris,Your Score: ' + str(score[0]) + 'By Tonymot')
    initial_position.clear()
    initial_position.extend(list(random.choice(all_block)))
    initial_position.clear()
    initial_position.extend([20, 5])
    y, x = initial_position
    for row, column in select_block:
        row += y
        column += x
        if backgroud[row][column] == 1:
            gameover.append(1)


def draw_block():
    y, x = initial_position
    for row, column in select_block:
        row += y
        column += x
        pygame.draw.rect(screen, (255, 165, 0), (column * 40, 800 - row * 40, 38, 38))
    for row in range(1, 21):
        for column in range(0, 10):
            if backgroud[row][column] == 1:#这个的意思其实很简单消除判断
                pygame.draw.rect(screen, (0, 0, 255), (column * 40, 800 - row * 40, 38, 38))


def rotate():
    y, x = initial_position
    rotating_position = [(-colum, row) for row, colum in select_block]
    for row, colum in rotating_position:
        row += y
        colum += x
        if colum < 0 or colum > 9 or backgroud[row][colum]:
            break
    else:
        select_block.clear()
        select_block.extend(rotating_position)


def move(d):
    y, x = initial_position
    x += d
    for row, colum in select_block:
        row += y
        colum += x
        if colum < 0 or colum > 9 or backgroud[row][colum]:
            break
    else:
        initial_position.clear()
        initial_position.extend([y, x])


while True:#游戏运行时的循环
    screen.fill((255, 255, 255))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:#按键控制
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_DOWN:
                press = True
            if event.key == pygame.K_UP:
                rotate()
            if event.key == pygame.K_RIGHT:
                move(1)
            if event.key == pygame.K_LEFT:
                move(-1)
        if event.type == pygame.KEYUP:
            if event.type == pygame.K_DOWN:
                press = False

    if times % 50 == 0:
        block_down()
    times += 1
    if press:
        times += 10#计时
    if gameover:
        sys.exit()
    draw_block()
    pygame.time.Clock().tick(200)
    pygame.display.flip()#启动

自从我按照自己的想法写出了我的第一个程序时,我才明白他们的用心,可能如果不是他们故意留的错误我可能不能理解一个俄罗斯方块是怎么实现的,也成就不了现在的我,可能只有程序员才可以懂得程序员会干什么,需要什么,然后让他们真正得到什么。

本文作者:2c237c6

本文链接:https://www.cnblogs.com/27dCnc/p/18568694

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   2c237c6  阅读(14)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起