俄罗斯方块
俄罗斯方块简单实现
使用 pygame 模块实现俄罗斯方块的简单实现,这里没有使用pygame 自带的碰撞检测,而是自定义的方法实现边界碰撞和方块间碰撞检测。
代码实现
import random
import pygame
import time
# 初始化游戏
pygame.init()# 设置游戏窗口大小
WINDOW_WIDTH = 400
WINDOW_HEIGHT = 600
WINDOW_SIZE = (WINDOW_WIDTH, WINDOW_HEIGHT)# 设置游戏窗口标题
pygame.display.set_caption("俄罗斯方块")# 设置游戏窗口
screen = pygame.display.set_mode(WINDOW_SIZE)# 定义方块大小和颜色
BLOCK_SIZE = 20
BLOCK_COLOR = (255, 255, 255)# 定义方块类
class Block:def __init__(self, x, y):self.x = xself.y = ydef draw(self, color):pygame.draw.rect(screen, color, (self.x, self.y, BLOCK_SIZE, BLOCK_SIZE))# 定义方块组类
class BlockGroup:block_groups = list()shape_set = {"1": [(0, 1), (0, 2), (0, 3)],"一": [(1, 0), (2, 0), (3, 0)],"T": [(1, 0), (1, 1), (2, 0)],"Z": [(1, 0), (1, 1), (2, 1)],"田": [(1, 0), (0, 1), (1, 1)],"L": [(0, 1), (0, 2), (1, 2)],}bottom_boundary_points = set()def __init__(self):self.blocks = list()self.color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))def init(self):group = self.generate_group()self.block_groups.append(group)@staticmethoddef generate_group():group = BlockGroup()x0 = random.randint(0, WINDOW_WIDTH-2 * BLOCK_SIZE)//BLOCK_SIZE * BLOCK_SIZEy0 = -3 * BLOCK_SIZEgroup.blocks.append(Block(x0, y0))shape = random.choice(list(group.shape_set.keys()))for _x, _y in group.shape_set[shape]:# block = Block(random.randint(0, WINDOW_WIDTH - BLOCK_SIZE), i * BLOCK_SIZE)x = x0 + _x * BLOCK_SIZEy = y0 + _y * BLOCK_SIZEgroup.blocks.append(Block(x, y))group.shape = shapereturn groupdef draw(self):for group in self.block_groups:for block in group.blocks:block.draw(group.color)def move_down(self):if self.collision_detection("bottom"):group = self.generate_group()BlockGroup.block_groups.append(group)returnfor block in self.block_groups[-1].blocks:block.y += BLOCK_SIZEdef move_left(self):if self.collision_detection("left"):returnfor block in self.block_groups[-1].blocks:block.x -= BLOCK_SIZEdef move_right(self):if self.collision_detection("right"):returnfor block in self.block_groups[-1].blocks:block.x += BLOCK_SIZEdef collision_detection(self, move_direction):# 移动方向上的偏移量offset = {"left": {"x0": -1*BLOCK_SIZE, "y0": 0},"right": {"x0": 1*BLOCK_SIZE, "y0": 0},"bottom": {"x0": 0, "y0": 1*BLOCK_SIZE}}block_collision = Falseboundary_collision = False# 获取当前活动组每个方块的坐标像素值for block in self.block_groups[-1].blocks:after_offset_pos = (block.x + offset[move_direction]["x0"], block.y + offset[move_direction]["y0"])print(after_offset_pos, self.bottom_boundary_points)if after_offset_pos in self.bottom_boundary_points:print(f"预测到方块碰撞点", after_offset_pos)block_collision = Trueif after_offset_pos[0] < 0 or after_offset_pos[0] >= WINDOW_WIDTH or after_offset_pos[1] >= WINDOW_HEIGHT:print(f"预测到第边界碰撞点", after_offset_pos)boundary_collision = True# 方块下移时,发生方块碰撞if (block_collision or after_offset_pos[1] >= WINDOW_HEIGHT) and move_direction == "bottom":shape = self.block_groups[-1].shapeprint(self.blocks)start_block = self.block_groups[-1].blocks[0]self.bottom_boundary_points.update({(start_block.x, start_block.y)})for _x, _y in self.block_groups[-1].shape_set[shape]:self.bottom_boundary_points.update({(start_block.x + _x * BLOCK_SIZE, start_block.y + _y * BLOCK_SIZE)})print(len(self.bottom_boundary_points), self.bottom_boundary_points)# time.sleep(3)# print(f"{self}检测到碰撞, 坐标{(block.x, block.y)}")return block_collision or boundary_collision# 定义游戏主循环
def main():clock = pygame.time.Clock()# 创建方块组block_groups = BlockGroup()block_groups.init()# 游戏循环while True:clock.tick(3)# 处理事件for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()if event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:block_groups.move_left()elif event.key == pygame.K_RIGHT:block_groups.move_right()# 绘制背景screen.fill((0, 0, 0))# 移动方块组block_groups.move_down()# 绘制方块组block_groups.draw()# 更新屏幕pygame.display.update()# 启动游戏
if __name__ == '__main__':main()
效果展示

相关文章:
俄罗斯方块
俄罗斯方块简单实现 使用 pygame 模块实现俄罗斯方块的简单实现,这里没有使用pygame 自带的碰撞检测,而是自定义的方法实现边界碰撞和方块间碰撞检测。 代码实现 import random import pygame import time # 初始化游戏 pygame.init()# 设置游戏窗口大…...
web服务
静态网页与动态网页的区别 在网站设计中,静态网页是网站建设的基础,纯粹 HTML 格式的网页通常被称为“静态网页”,静态网页是标准的 HTML 文件,它的文件扩展名是 .htm、.html,可以包含文本、图像、声音、FLASH 动画、…...
【Rust 基础篇】Rust类型别名:为类型赋予新的名字
导言 Rust是一种以安全性和高效性著称的系统级编程语言,其设计哲学是在不损失性能的前提下,保障代码的内存安全和线程安全。在Rust中,类型别名是一种常见的编程特性,它允许为现有类型赋予新的名字,从而提高代码的可读…...
【机器学习】 贝叶斯理论的变分推理
许志永 一、说明 贝叶斯原理,站在概率角度上似乎容易解释,但站在函数立场上就不那么容易了;然而,在高端数学模型中,必须要在函数和集合立场上有一套完整的概念,其迭代和运算才能有坚定的理论基础。 二、贝叶…...
Flink之RedisSink
在Flink开发中经常会有将数据写入到redis的需求,但是Flink官方并没有对应的扩展包,这个时候需要我们自己编译对应的jar资源,这个时候就用到了bahir,barhir是apahce的开源项目,是专门给spark和flink提供扩展包使用的,bahir官网,这篇文章就介绍下如何自己编译RedisSink扩展包. 下…...
STM32CubeMx学习与K210串口通信+识别橘色色块——点亮小灯
K210模块的串口发送代码 引入模块 import sensor, image,time,lcd,utime import KPU as kpu import gc, sys from fpioa_manager import fm from machine import UART 锁定引脚 和 申明串口 fm.register(9, fm.fpioa.UART1_TX, forceTrue) fm.register(10, fm.fpioa.UART1_R…...
睿讯微带你深度了解汽车交流充电桩
这几年随着新能源汽车的普及,充电桩也越来越多的出现在我们的视野中。新能源纯电汽车就好比一种大号的电子产品,而充电桩则是它不可缺少的子系统,是新能源车主们的必要选择。 汽车充电桩分为直流和交流两种,2022年底全国公共充电桩…...
word怎么压缩到10m以下?文件压缩很简单
Word文档是我们工作和学习中一直需要用到的,但有时候Word文档体积过大,给存储和传输带来了不便,这时候我们可以做的就压缩Word。 通常情况下,影响Word文档过大的主要因素主要是图片过多、音视频插入、格式的设置、文字内容的增多以…...
I.MX6ULL_Linux_驱动篇(43)linux通用LED驱动
前面我们都是自己编写 LED 灯驱动,其实像 LED 灯这样非常基础的设备驱动, Linux 内核已经集成了。 Linux 内核的 LED 灯驱动采用 platform 框架,因此我们只需要按照要求在设备树文件中添加相应的 LED 节点即可,本章我们就来学习如…...
OPTEE之sonarlint静态代码分析实战二——optee_client
ATF(TF-A)/OPTEE之静态代码分析汇总 目录 一、optee_client源码下载及分析 二、扫描类型归类...
c++调用ffmpeg api将视频文件内容进行udp推流
代码及工程见https://download.csdn.net/download/daqinzl/88156926 开发工具:visual studio 2019 播放,采用ffmpeg工具集里的ffplay.exe, 执行命令 ffplay udp://238.1.1.10:6016 主要代码如下: #include "pch.h" #include <iostream&g…...
助力工业物联网,工业大数据之服务域:油站主题分析【二十六】
文章目录 07:服务域:油站主题分析08:服务域:油站主题实现 07:服务域:油站主题分析 目标:掌握油站主题的需求分析 路径 step1:需求step2:分析 实施 需求:统计…...
MySql之索引
MySql之索引 1.索引概述 MySql官方对索引的定义为:索引是帮助MySql高效获取数据的数据结构。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,这样就可以在这些数据结构上实现高级查找…...
adb调试
连不上 adb 如果还遇到5037端口被占用的问题,就找出进程号用taskkill命令杀死该进程即可 1、查找5037端口对应的进程:netstat -ano|findstr 5037 2、杀死该进程:taskkill /F /PID pid 连接unity profiler 打开发包,并安装在手机…...
ElasticSearch_学习笔记
一、初始elasticsearch 什么是elasticsearch? 一个开源的分布式搜索引擎,可以用来时限搜素、日志统计、分析、系统监控等功能。什么是elasitc stack(ELK)? 是以elasticsearch为核心的技术栈,包括 beats、L…...
Portraiture 4.0.3 for windows/Mac简体中文版(ps人像磨皮滤镜插件)
Imagenomic Portraiture系列插件作为PS磨皮美白必备插件,可以说是最强,今天它更新到了4.0.3版本。但是全网都没有汉化包,经过几个日夜汉化,终于汉化完成可能是全网首个Portraiture 4的汉化包,请大家体验,有…...
Java精品项目源码第152期火车票预订系统(编号M062)
Java精品项目源码第152期火车票预订系统(编号M062) 大家好,小辰今天给大家介绍一个基于Spring Springboot MyBatis实现的火车票预订系统,演示视频文章末尾公众号对号查询观看即可 文章目录 Java精品项目源码第152期火车票预订系…...
嵌入式软件C/C++(技术面试题)
一,网络 1,TCP窗口机制 TCP(传输控制协议)是一种可靠的、面向连接的传输层协议。其中的窗口机制是TCP协议中的一项重要功能,用于控制数据在发送和接收之间的流程。 TCP窗口机制是利用滑动窗口的方式来进行拥塞控制和…...
Idea中侧面栏不见了,如何设置?
一、打开idea点击File然后点击Setting 二、点击Appearance,然后划到最下面,勾选Show tool windows bars和Side-by-side layout on the left 三、侧面栏目正常显示...
构建高效读写分离MySQL主从复制架构,应对高可用挑战!
前言 在现代数据库架构中,MySQL主从复制技术扮演着重要角色。它不仅可以提升数据库性能和可扩展性,还赋予系统卓越的高可用性和灾难恢复能力。本文将深入剖析MySQL主从复制的内部机制,同时通过一个实际案例,展示其在实际场景中的…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!
目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...
