Python编写的俄罗斯方块小游戏

news2024/9/27 5:56:08

文章目录

  • 游戏页面
  • 实现代码

游戏页面

左右键移动方块位置,上键切换方块形态。
在这里插入图片描述

实现代码

import pygame
import random

# 初始化 Pygame
pygame.init()

# 定义颜色
colors = [
    (0, 0, 0),  # 黑色
    (255, 0, 0),  # 红色
    (0, 255, 0),  # 绿色
    (0, 0, 255),  # 蓝色
    (255, 255, 0),  # 黄色
    (255, 0, 255),  # 紫色
    (0, 255, 255)  # 青色
]

# 俄罗斯方块形状
shapes = [
    [[1, 1, 1, 1]],
    [[1, 1],
     [1, 1]],
    [[0, 1, 1],
     [1, 1, 0]],
    [[1, 1, 0],
     [0, 1, 1]],
    [[1, 1, 1],
     [0, 1, 0]],
    [[1, 1, 1],
     [1, 0, 0]],
    [[1, 1, 1],
     [0, 0, 1]]
]

# 设置游戏屏幕
screen_width = 300
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('俄罗斯方块')

# 游戏网格
grid = [[0 for _ in range(10)] for _ in range(20)]

# 初始化时钟
clock = pygame.time.Clock()

# 定义方块类
class Shape:
    def __init__(self):
        self.shape = random.choice(shapes)
        self.color = random.randint(1, len(colors) - 1)
        self.x = 3
        self.y = 0

    def rotate(self):
        self.shape = [list(row) for row in zip(*self.shape[::-1])]

    def draw(self):
        for i, row in enumerate(self.shape):
            for j, val in enumerate(row):
                if val:
                    pygame.draw.rect(screen, colors[self.color], (self.x * 30 + j * 30, self.y * 30 + i * 30, 30, 30))

def check_collision(shape):
    for i, row in enumerate(shape.shape):
        for j, val in enumerate(row):
            if val:
                if shape.x + j < 0 or shape.x + j >= 10 or shape.y + i >= 20 or grid[shape.y + i][shape.x + j]:
                    return True
    return False

def merge_shape(shape):
    for i, row in enumerate(shape.shape):
        for j, val in enumerate(row):
            if val:
                grid[shape.y + i][shape.x + j] = shape.color

def remove_full_lines():
    global grid
    grid = [row for row in grid if not all(row)]
    while len(grid) < 20:
        grid.insert(0, [0 for _ in range(10)])

def draw_grid():
    for y in range(20):
        for x in range(10):
            pygame.draw.rect(screen, colors[grid[y][x]], (x * 30, y * 30, 30, 30))

def main():
    running = True
    current_shape = Shape()
    fall_time = 0

    while running:
        screen.fill((0, 0, 0))
        draw_grid()
        current_shape.draw()

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    current_shape.x -= 1
                    if check_collision(current_shape):
                        current_shape.x += 1
                if event.key == pygame.K_RIGHT:
                    current_shape.x += 1
                    if check_collision(current_shape):
                        current_shape.x -= 1
                if event.key == pygame.K_DOWN:
                    current_shape.y += 1
                    if check_collision(current_shape):
                        current_shape.y -= 1
                if event.key == pygame.K_UP:
                    current_shape.rotate()
                    if check_collision(current_shape):
                        current_shape.rotate()
                        current_shape.rotate()
                        current_shape.rotate()

        fall_time += clock.get_rawtime()
        clock.tick()
        if fall_time / 1000 >= 0.5:
            fall_time = 0
            current_shape.y += 1
            if check_collision(current_shape):
                current_shape.y -= 1
                merge_shape(current_shape)
                remove_full_lines()
                current_shape = Shape()
                if check_collision(current_shape):
                    running = False

        pygame.display.update()

    pygame.quit()

if __name__ == "__main__":
    main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1914564.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

『大模型笔记』GraphRAG:用于复杂数据发现的新工具现已在GitHub上发布

GraphRAG:用于复杂数据发现的新工具现已在GitHub上发布 文章目录 一. GraphRAG:用于复杂数据发现的新工具现已在GitHub上发布1. 评估和结果2. 研究见解和未来方向二. 参考文献一. GraphRAG:用于复杂数据发现的新工具现已在GitHub上发布 下载 GraphRAG今年早些时候,我们介绍…

原理和组成

能力要素&#xff1a;&#xff08;1&#xff09;人员要素&#xff1a;“正确选人”。&#xff08;2&#xff09;过程要素&#xff1a;“正确做事”。&#xff08;3&#xff09;技术要素&#xff1a;“高效做事”。&#xff08;4&#xff09;资源要素&#xff1a;“保障做事”。…

IT审计必看!对比旧版,CISA考试改版升级亮点和重点内容是什么?

官方通知&#xff0c;今年8月1日&#xff0c;CISA新版考纲正式上线&#xff0c;旧版在7月23日后就无法约考了。 艾威培训邀请了国内知名的IT审计CISA授课老师吴老师来为大家详细讲解CISA新版考纲的变化 目前第28th版教材只有英文版&#xff0c;中文版尚未发布。我们艾威经验丰…

SAP PS学习笔记03 - 批量更改Project(CNMASS),批量创建Project(CNMASSCREATE)

上一章讲了网络&#xff08;Network&#xff09;&#xff0c;活动&#xff08;Activity&#xff09;&#xff0c;PS长文本&#xff0c; PS文书&#xff08;凭证&#xff09;&#xff0c;里程碑&#xff08;Milestone&#xff09;的创建等相关知识。 SAP PS学习笔记02 - 网络&a…

如何用Vue3和Plotly.js创建交互式表格?

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Plotly.js 动态生成 HTML 表格 应用场景介绍 在数据分析和可视化领域&#xff0c;经常需要以表格的形式展示数据。Plotly.js 是一款功能强大的 JavaScript 库&#xff0c;不仅可以创建交互式图表&#xff0c;…

产品使用手册深度剖析:五步快速敲定产品手册策划思路

引言 在这个信息爆炸的时代&#xff0c;产品使用手册不仅是产品的“说明书”&#xff0c;更是品牌与用户之间建立情感连接的桥梁。一份优秀的手册&#xff0c;能够迅速吸引用户的注意力&#xff0c;引导他们轻松上手&#xff0c;并深入体验产品的魅力。那么&#xff0c;如何撰…

gdb调试与Coredump

目录 一、gdb概述 1、gdb的调试以及常用参数解析 二、Coredump调试以及常用参数解析 1、coredump是什么&#xff1f; 2、前期设置 3、调试 三、其它方式&#xff08;打印堆栈&#xff09; 一、gdb概述 gdb是GNU 发布的一个强大的程序调试工具&#xff0c;也是Linux 程序…

按模版批量生成定制合同

提出问题 一个仪器设备采购公司&#xff0c;商品合同采购需要按模版生成的固定的文件&#xff0c;模板是固定的&#xff0c;只是每次需要替换信息&#xff0c;然后打印出来寄给客户。 传统方法 如果手工来做这个事情&#xff0c;准备好数据之后&#xff0c;需要从Excel表格中…

【论文阅读笔记】Meta 3D AssetGen

【论文阅读笔记】Meta 3D AssetGen: Text-to-Mesh Generation with High-Quality Geometry, Texture, and PBR Materials Info摘要引言创新点 相关工作T23D基于图片的3d 重建使用 PBR 材料的 3D 建模。 方法文本到图像:从文本中生成阴影和反照率图像Image-to-3D:基于pbr的大型重…

院内导航:如何用科技破解就医找路难题

自2019年开始“院内导航”被纳入医院智慧服务评估体系以来&#xff0c;到2023年改善就医服务升级的部署&#xff0c;每一步都见证了我国医疗卫生体系向智能化、人性化迈进的坚实步伐。 面对庞大复杂的医院环境与日益增长的就诊需求&#xff0c;如何让患者在茫茫人海中迅速找到就…

关于 RK3588刷镜像升级镜像”没有发现设备“ 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140287339 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

gitee上传和下载idea项目的流程

环境&#xff1a;idea2022 一、上传项目 1、在gitee中新建一个仓库。 2、打开所要上传的项目的文件夹&#xff0c;点击Git Bash&#xff0c;生成.git文件夹。 3、在idea中打开所要上传的项目&#xff0c;在控制台的Terminal菜单中&#xff0c;输入git add . (注意&#xf…

【卡尔曼滤波器】DR_CAN :1_递归算法_做估计 学习笔记

DR_CAN : 1_递归算法_Recursive Processing 学习笔记 DR_CAN 大神 地址 1_递归算法_Recursive Processing 取平均 做估计 前k-1次的平均值 当前估计值 与上次估计值和当前测量值的关系

简过网:哪些证书适合上班族考?这些证书挂着就能挣钱!

考证不一定暴富&#xff0c;但找工作时一定吃香 今天给大家整理几个比较吃香的证书&#xff01; 不仅含金量高还可以领补贴 建议大家有时间都考一考 普通人就冲一冲&#xff1a;教资、二建、一建、一造、监理&#xff01;&#xff01; ​ ★ 教师资格证书 报名时间&#x…

如何才能半个月学习完自动化测试,成功跳槽涨薪?

一直想写类似的文章&#xff0c;但是一直没有时间&#xff0c;正好乘此周末&#xff0c;终于可以写写我的见解了<关于如何学习自动化测试>&#xff0c;其实自动化测试的知识很宽泛&#xff0c;具体细分又可以分为&#xff1a;Web自动化测试&#xff08;PythonSelenium&am…

Python的语言特性

1&#xff0c;python是动态语言 在编译期间就确定变量类型的语言是静态语言 在运行期间才知道变量类型的是动态语言 2&#xff0c;python是强类型语言 不同类型的变量是否允许隐式转换

Python基础小知识问答系列-遍历嵌套列表

1. 问题&#xff1a; 如何只使用一次for循环&#xff0c;遍历2层嵌套的列表&#xff1f; 2. 解决方法&#xff1a; 使用yield from语句的递归生成器&#xff0c;解决多层嵌套列表的遍历问题。 示例&#xff1a; from collections.abc import Iterablelist_b ["hong kong…

buuctf LSB

图片下来是一张 这个图片 放010 没有隐藏的文件 stegSolve打开 在三个0的时候,都发现图片上有东西 保存为png格式 得到了一个二维码 扫一下就是flag

防火墙安全策略与用户认证综合实验

一、实验拓扑 二、实验需求 1.DMZ区内的服务器&#xff0c;办公区仅能在办公时间内<9:00-18:00>可以访问&#xff0c;生产区的设备全天可以访问 2.办公区不允许访问互联网&#xff0c;办公区和游客区允许访问互联网 3.办公区设备10.0.2.10不充许访问DMZ区的FTP服务器和HT…

防火墙组网实验配置

一、实验拓扑图&#xff1a; 二、实验要求&#xff1a; 1,DMZ区内的服务器,办公区仅能在办公时间内(9:00-18:00)可以访问,生产区的设备全天可以访问. 2,生产区不允许访问互联网,办公区和游客区允许访问互联网 3,办公区设备10.0.2.10不允许访问DMz区的FTP服务器和HTTP服务器,仅能…