你首先需要知道‘递|

2c237c6

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

我的创作128纪念日

机缘

起初我写博客是为了记录自己的学习过程,现在也是如此

  1. 实战项目中的经验分享
  2. 日常学习过程中的记录
  3. 通过文章进行技术交流
  4. 通过文章加深学习和复习

收获

在创作过程中

  1. 获得了400多位粉丝的关注感谢大家的支持
  2. 阅读数量也达到了3w+
  3. 在博客上认识仲秋大佬,感谢大佬对我的指导,我也会向大佬学习的

日常

  1. 创作已经是你生活的一部分了

在这里插入图片描述


成就

对俄罗斯方块这个游戏认识十分深刻:
python代码实现过
C/C++也实现过
下面是 :
俄罗斯方块详细教学流程

以及代码完整版
在这里插入图片描述

import pygame, sys
import random

# 物块的形状是二维数组
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], ],  # 7字型
    [[0, 0], [0, 1], [0, -1], [0, -2], ],  # 倒7字型
    [[0, 0], [0, 1], [1, 1], [1, 2], ],  # Z字型
    [[0, 0], [0, -1], [1, -1], [1, -2], ],  # 倒z字型
    [[0, 0], [0, 1], [0, -1], [1, 0]],  # T字型
]

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))  # 设置窗口大小
select_block = list(random.choice(all_block))


def block_down():
    global select_block  # 将global改为全局变量
    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  # 这个是是将背景网格中指定位置的值修改为1
    complete_row = []  # 用来存储静态的block就是完成一行后,将静态block存储在数组中
    # 然后通过删除数组元素达到消除方块的效果

    # 下面代码用于处理和检测背景网格中是不是有完整的行
    for row in range(1, 21):  # 通过循环遍历背景网格中的每一行
        if 0 not in backgroud[row]:  # 条件判断是否存在值为0的元素,如果不存在,则表示该行是完整的。
            complete_row.append(row)  # 如果一行是完整的将其行号row添加到complete_row中
    for row in complete_row:  # 再次循环对每一行进行遍历
        backgroud.pop(row)  # 将完整的行移除
        backgroud.append(list(0 for _ in range(0, 10)))  # 注意 移除行后在网格底部添加一个新行就是为让网格大小保持不变
    score[0] += len(complete_row)  # 计算消除行数并记录
    pygame.display.set_caption('你现在的分数是 ' + str(score[0]) + '分')  # 显示消除行数显示标题中
    # text = font.render("Score: " + str(score[0]), True, (0, 0, 0))
    initial_position.clear()  # 清空 initial_position列表中的元素
    select_block = list(random.choice(all_block))  # 随机选择一个方块
    initial_position.extend(select_block)  # 将选中的方块赋值给initial_position,initial_position里面存储着随机选择的方块
    initial_position.clear()  # 当动态的block变成静态block清楚initial_position中存储的上个方块的信息然后为重新加载方块做准备
    initial_position.extend([20, 5])  # 将[20,5]添加到initial_position中[20,5]代表下落的初始坐标
    y, x = initial_position
    for row, column in select_block:  # 用于确定方块的偏移量
        row += y
        column += x
        if backgroud[row][column] == 1:  # 判断静态block对应位置是否为1如果是说明当前方块于背景中已有方块重叠
            gameover.append(1)
            # 这段代码的逻辑是遍历选中的方块中的每个位置,将其与背景中对应位置的值进行比较,如果发生碰撞,则将游戏结束的标志(值为 1)


# TODO: 
# 详细解释
# 首先,通过 `for row, column in select_block:` 遍历 `select_block` 列表中的每个元素,其中每个元素都是一个包含方块位置信息的列表,例如 `[row, column]`。
#
# 然后,将 `row` 和 `column` 分别加上变量 `y` 和 `x` 的值。这里的 `y` 和 `x` 可能表示方块在背景中的偏移量,用于确定方块的实际位置。
#
# 接下来,通过 `if backgroud[row][column] == 1:` 条件语句判断背景中对应位置的值是否为 1。如果是,说明当前方块与背景中已有的方块重叠,即发生碰撞。
#
# 如果发生碰撞,将值为 1 的元素添加到 `gameover` 列表中,以表示游戏结束。
#
# 综上所述,这段代码的逻辑是遍历选中的方块中的每个位置,将其与背景中对应位置的值进行比较,如果发生碰撞,则将游戏结束的标志(值为 1)添加到 `gameover` 列表中。



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
    # select_block = list(random.choice(all_block))
    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
    # select_block = list(random.choice(all_block))
    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 = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                rotate()  # 代码无法向下加速的原因是在处理pygame.KEYUP事件时,判断按键是否为向下键时使用了错误的语句。
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:  # 具体来说,在代码中,当检测到键盘按键释放事件(pygame.KEYUP)时,
                    # 判断按键是否为向下键时应该使用event.key
                    # 而不是event.type。
                    move(1)  # 因此,将event.type改为event.key即可解决这个问题
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    move(-1)
        if event.type == pygame.KEYUP:
            if event.key == pygame.K_DOWN:
                press = False

    if times % 60 == 0:
        block_down()
    times += 1
    if press:
        times += 10
    if gameover:
        sys.exit()
    draw_block()
    pygame.time.Clock().tick(400)
    # 创建字体对象
    font = pygame.font.Font(None, 36)
    # 创建显示文本
    text = font.render("Score: " + str(score[0]), True, (0, 0, 0))
    # 创建显示区域然后显示
    screen.blit(text, (10, 10))
    # 刷新
    pygame.display.update()

    pygame.display.flip()

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


希望大家能有所收获


憧憬

成为一名大佬,然后养成一个好习惯,学完C++基础语法后便进军Java
因为现在C++语法并不完善,Java在商务领域很完善 还有副业 手机软件开发
而且面向对象的语法会让我更舒服点

在这里插入图片描述

本文作者:2c237c6

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

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

posted @   2c237c6  阅读(3)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起