pygame俄罗斯方块游戏

这篇具有很好参考价值的文章主要介绍了pygame俄罗斯方块游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

俄罗斯方块游戏开发

俄罗斯方块是一款世界级经典游戏,每门语言开发学习初步都会考虑制作俄罗斯方块游戏今天带着大家把俄罗斯方块用python语言开发一次

开发准备

1.安装python
2.引入游戏库pygame
3.引入随机数

import pygame
import random

俄罗斯游戏步骤

俄罗斯方块初始形状

这里使用一个二维数组 用来标记俄罗斯相对应的方块形状 代码如下:

# 定义方块的基本形状
blocks = [
    # I
    [
        [1, 1, 1, 1],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
    ],

    # O
    [
        [1, 1, 0, 0],
        [1, 1, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
    ],

    # T
    [
        [1, 1, 1, 0],
        [0, 1, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
    ],

    # S
    [
        [0, 1, 1, 0],
        [1, 1, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
    ],

    # Z
    [
        [1, 1, 0, 0],
        [0, 1, 1, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
    ],

    # J
    [
        [1, 1, 1, 0],
        [0, 0, 1, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
    ],

    # L
    [
        [1, 1, 1, 0],
        [1, 0, 0, 0],
        [0, 0, 0, 0],
        [0, 0, 0, 0],
    ],
]

游戏移动方向是否可能判断

这里为了不让他出现穿墙,跨过方块下落 都做对应的碰撞判断 具体代码如下:

# 判断方块是否可以向左移动
def can_move_left(x, y, block):
    for i in range(len(block)):
        for j in range(len(block[i])):
            if block[i][j] == 1:
                if x + j - 1 < 0 or play_area[y + i][x + j - 1] != EMPTY:
                    return False
    return True


# 判断方块是否可以向右移动
def can_move_right(x, y, block):
    for i in range(len(block)):
        for j in range(len(block[i])):
            if block[i][j] == 1:
                if x + j + 1 >= COLS or play_area[y + i][x + j + 1] != EMPTY:
                    return False
    return True


# 判断方块是否可以向下移动
def can_move_down(x, y, block):
    for i in range(len(block)):
        for j in range(len(block[i])):
            if block[i][j] == 1:
                if y + i + 1 >= ROWS or play_area[y + i + 1][x + j] != EMPTY:
                    global count
                    count += 1
                    print(y,",",x,";不能下降了",count)
                    return False
    return True


# 判断方块是否可以变形
def can_rotate(x, y, block):
    return rotate_block(x, y, block) != block

俄罗斯方块旋转变形代码实现

# 变形方块
def rotate_block(x, y, block):
    new_block = []

    for i in range(len(block)):
        row = []
        for j in range(len(block[i])):
            row.append(block[len(block) - j - 1][i])
        new_block.append(row)

    if x + len(new_block[0]) > COLS or y + len(new_block) > ROWS:
        return block

    for i in range(len(new_block)):
        for j in range(len(new_block[i])):
            if new_block[i][j] == 1 and play_area[y + i][x + j] != EMPTY:
                return block

    return new_block

俄罗斯方块整行满格删除对应行

# 删除行
def delete_rows():
    full_rows = []  # 总共要删除的行号列表
    for i in range(len(play_area)):  # 检测整行没有空格了
        if EMPTY not in play_area[i]:
            full_rows.append(i)   # 加入删除这行
    # 偏移量bu 在一次性删除多行的时候 因为边删边补 会引起删除索引改变
    bu = 0
    for row in sorted(full_rows, reverse=True):  # 必须逆序 删除没有空格的行
        del play_area[row+bu]
        play_area.insert(0, [EMPTY] * COLS)
        bu += 1
    return len(full_rows)  # 返回删除的总行数

删除行后 根据一次删除的行计算得分规则

一次一行得10分 一次2行得30分 一次3行得50分 一次四行得100分,代码如下:

# 消除几行加分规则
def add_score(drow):
    global score
    if drow == 1:
        score += 10  # 一次消除一行 得分加10
    elif drow == 2:  # 一次消除2行 得分加30
        score += 30
    elif drow == 3:
        score += 50
    elif drow == 4:
        score += 100

检测游戏失败后 是否重新继续

# 游戏结束,重置游戏
def reset_game():
    global score
    # 绘制提示语言
    font = pygame.font.Font("simsun.ttc", 24)
    # font = pygame.font.SysFont(None, 24)
    text = font.render("游戏结束您的得分是{},重新开始请按空格键".format(score), True, WHITE)
    screen.blit(text, (10, height//2-12))
    pygame.display.update()
    flag = True
    while flag:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
                flag = False
                break

    global play_area, cur_block, cur_color
    play_area = [[EMPTY] * COLS for i in range(ROWS)]
    # play_area = [[EMPTY] * width for i in range(height)]
    # 随机生成俄罗斯方块
    cur_block = blocks[random.randint(0, len(blocks) - 1)]
    cur_color = random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
    # 重置分数
    score = 0

游戏窗体创建与游戏初始数据设置

# 颜色定义
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

# 初始化游戏
pygame.init()

# 设置游戏界面大小
size = width, height = 640, 480
# 游戏设置
EMPTY = -1
FPS = 60   ## 祯数
SIZE = 20
ROWS = height//SIZE
COLS = width//SIZE
count = 0
# 创建游戏界面
screen = pygame.display.set_mode(size)

# 设置游戏标题
pygame.display.set_caption("俄罗斯方块")

# 随机生成俄罗斯方块
cur_block = blocks[random.randint(0, len(blocks) - 1)]
cur_color = random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
play_area = [[EMPTY] * COLS for i in range(ROWS)]
x, y = width // 2//SIZE, 0  # 方块的初始位置
clock = pygame.time.Clock()
score = 0  # 分数 
speed = 1000 #下降速度 目前没用到 后续会根据这个值来调整关卡速度(方块下落速度)
# 设置定时器来控制下降速度  如果用帧数控制游戏速度的话 会影响按键 帧数低的时候 按键也失灵 这里用定时器来控制速度
pygame.time.set_timer(pygame.USEREVENT ,speed)

主体控制代码:

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        elif event.type == pygame.USEREVENT:
            y += 1  # 一秒下降一格
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT and can_move_left(x, y, cur_block):
                x -= 1

            elif event.key == pygame.K_RIGHT and can_move_right(x, y, cur_block):
                x += 1
            elif event.key == pygame.K_UP and can_rotate(x, y, cur_block):
                cur_block = rotate_block(x, y, cur_block)
            elif event.key == pygame.K_DOWN and can_move_down(x, y+3, cur_block):
                y += 3

    # print(x,",",y)
    # 消除行并计分
    add_score(delete_rows())

    # 随机生成新方块
    if not can_move_down(x, y, cur_block):
        # 将方块添加到游戏区域
        for i in range(len(cur_block)):
            for j in range(len(cur_block[i])):
                if cur_block[i][j] == 1:
                    print("y=",y,";x=",x,";i=",i,";j=",j)
                    play_area[y + i][x + j] = cur_color

        # 随机生成俄罗斯方块
        cur_block = blocks[random.randint(0, len(blocks) - 1)]
        cur_color = random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)

        x, y = width // 2//SIZE, 0  # 方块的初始位置

        # 判断游戏是否结束
        for i in play_area[0]:
            if i != EMPTY:
                reset_game()

    # 绘制游戏区域
    screen.fill(BLACK)
    # print(play_area)
    for i in range(ROWS):
        for j in range(COLS):
            if play_area[i][j] != EMPTY:
                pygame.draw.rect(screen, play_area[i][j], pygame.Rect(j * 20, i * 20, 20, 20), 0)

    # 绘制当前方块
    for i in range(len(cur_block)):
        for j in range(len(cur_block[i])):
            if cur_block[i][j] == 1:
                pygame.draw.rect(screen, cur_color, pygame.Rect((x + j) * 20, (y + i) * 20, 20, 20), 0)

    # 绘制分数
    font = pygame.font.SysFont(None, 24)
    text = font.render("Score: {}".format(score), True, WHITE)
    screen.blit(text, (10, 10))

    pygame.display.update()
    clock.tick(FPS)

开发总结

整个项目下载链接: pygame-俄罗斯方块游戏项目
1.游戏细节比较多,容易出错,需要清晰的逻辑思维,
2.速度控制上原先一直用FPS(帧数)来调节速度发现 按键灵敏度也跟帧数息息相关,所以这里用定时器来控制。不知道如果有多个定时器同时使用的话 会不会有新的问题,后续继续研究
3.消除行判断 原先没考虑到整个屏幕用二维列表来定义是否占格,浪费了很长时间无法很好的实现消除整行,这里用二维可以完美解决这个问题。
4.要显示中文字体需要加载字体,后面我会放整个项目下载链接,里面包括字体,后续持续更新 可能会加上音效等。
5.整个游戏花费了我5,6个小时的精力,还有很多心得 得大家一起去写写用用改改才能发现。有什么问题可以互相交流

游戏截图

pygame俄罗斯方块游戏,Python学习,pygame,游戏,python文章来源地址https://www.toymoban.com/news/detail-716022.html

到了这里,关于pygame俄罗斯方块游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python课程设计 基于python的俄罗斯方块小游戏

    目录 基于python的俄罗斯方块小游戏 1.概述 1.1 摘要 1.2 开发背景 1.3 开发环境 1.4 实现功能 2.代码描述 2.1 模块导入 2.2 初始化变量 2.3 播放音乐 2.4 创建方块类 2.5 绘制游戏地图 2.6 游戏初始化 2.7 绘制有边框矩形 2.8 绘制我的文字 2.9 游戏主体 2.10 主程序运行 3.运行效果 4.注

    2024年02月22日
    浏览(42)
  • 用Python打造复古风格的游戏:回归8位时代【俄罗斯方块】

    大家好,我是辣条! 今天带大家来写一个说难不难,说简单也不算接单的复古小游戏:俄罗斯方块游戏! 俄罗斯方块是一款经典的益智游戏,通过移动、旋转和放置不同形状的方块,你需要尽可能地填满一行或多行来消除方块。现在,让我们一起用Python来编写一个完整的俄

    2024年02月12日
    浏览(26)
  • python毕设分享 俄罗斯方块小游戏设计与实现 (源码)

    🔥 Hi,各位同学好呀,这里是L学长! 🥇今天向大家分享一个今年(2022)最新完成的毕业设计项目作品 python小游戏毕设 俄罗斯方块小游戏设计与实现 (源码) 🥇 学长根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:3分 创新点:4分 项目获取:

    2024年02月03日
    浏览(40)
  • 用Pygame写俄罗斯方块

    此文章参考的是吃饭超人的文章 首先我们先打开cmd输入如下令命 然后打开python或者pycharm 输入如下代码

    2024年02月12日
    浏览(23)
  • python制作俄罗斯方块

    作者简介 :一名后端开发人员,每天分享后端开发以及人工智能相关技术,行业前沿信息,面试宝典。 座右铭 :未来是不可确定的,慢慢来是最快的。 个人主页 :极客李华-CSDN博客 合作方式 :私聊+ 这个专栏内容 :BAT等大厂常见后端java开发面试题详细讲解,更新数目10

    2024年02月12日
    浏览(34)
  • 免费分享一套Python俄罗斯方块源码 PyQt5俄罗斯方块源码,太好玩了~

    大家好,我是java1234_小锋老师,看到一个不错的Python俄罗斯方块源码 PyQt5俄罗斯方块源码,分享下哈。 【免费】Python俄罗斯方块源码 PyQt5俄罗斯方块源码 Python小游戏源码_哔哩哔哩_bilibili 【免费】Python俄罗斯方块源码 PyQt5俄罗斯方块源码 Python小游戏源码项目来自互联网,免

    2024年01月25日
    浏览(31)
  • 用python制作俄罗斯方块

    代码如下,可以直接运行:

    2024年02月11日
    浏览(33)
  • Python课程设计之俄罗斯方块

    点击查看 点击下载 Python课程设计之俄罗斯方块 软件需求 :Python环境 压缩包内含 :源代码、打包好的可执行文件、文档报告 (1)、搭建基础窗体 使用tkinter实现基础窗体。 运行代码生成窗口如下 接下来需要在窗体里面,添加一个画布容器用来“装”俄罗斯方块,就是让这

    2024年02月09日
    浏览(34)
  • python基础项目实战-俄罗斯方块

    一、俄罗斯方块游戏设计分析: 俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑、手机、掌上游戏机产品,是一款游戏规则简单,但又不缺乏乐趣的简单经典小游戏,上手容易,适用范围广泛,人所共知。俄罗斯方块游戏基本规则是油4个小方块组成的7种不

    2024年02月12日
    浏览(28)
  • 用python写一个俄罗斯方块程序

    2024年04月23日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包