python俄罗斯方块.py

俄罗斯方块.py

import pygame
import random# 初始化游戏
pygame.init()# 设置游戏窗口的大小
screen_width = 800
screen_height = 600
play_width = 300
play_height = 600
block_size = 30top_left_x = (screen_width - play_width) // 2
top_left_y = screen_height - play_height# 定义方块形状和颜色
S = [['.....','.....','..00.','.00..','.....'],['.....','..0..','..00.','...0.','.....']]Z = [['.....','.....','.00..','..00.','.....'],['.....','..0..','.00..','.0...','.....']]I = [['.....','..0..','..0..','..0..','..0..'],['.....','0000.','.....','.....','.....']]O = [['.....','.....','.00..','.00..','.....']]J = [['.....','.0...','.000.','.....','.....'],['.....','..00.','..0..','..0..','.....'],['.....','.....','.000.','...0.','.....'],['.....','..0..','..0..','.00..','.....']]L = [['.....','...0.','.000.','.....','.....'],['.....','..0..','..0..','..00.','.....'],['.....','.....','.000.','.0...','.....'],['.....','.00..','..0..','..0..','.....']]T = [['.....','..0..','.000.','.....','.....'],['.....','..0..','..00.','..0..','.....'],['.....','.....','.000.','..0..','.....'],['.....','..0..','.00..','..0..','.....']]shapes = [S, Z, I, O, J, L, T]
shape_colors = [(0, 255, 0), (255, 0, 0), (0, 255, 255), (255, 255, 0), (255, 165, 0), (0, 0, 255), (128, 0, 128)]# 定义方块类
class Piece(object):rows = 20columns = 10def __init__(self, column, row, shape):self.x = columnself.y = rowself.shape = shapeself.color = shape_colors[shapes.index(shape)]self.rotation = 0# 创建游戏区域
def create_grid(locked_positions={}):grid = [[(0, 0, 0) for _ in range(Piece.columns)] for _ in range(Piece.rows)]for row in range(len(grid)):for col in range(len(grid[row])):if (col, row) in locked_positions:color = locked_positions[(col, row)]grid[row][col] = colorreturn grid# 将方块的形状转换为坐标
def convert_shape_format(piece):positions = []shape_format = piece.shape[piece.rotation % len(piece.shape)]for i, line in enumerate(shape_format):row = list(line)for j, column in enumerate(row):if column == '0':positions.append((piece.x + j, piece.y + i))for i, pos in enumerate(positions):positions[i] = (pos[0] - 2, pos[1] - 4)return positions# 检查是否可以在给定位置放置方块
def valid_space(piece, grid):accepted_positions = [[(j, i) for j in range(Piece.columns) if grid[i][j] == (0, 0, 0)] for i in range(Piece.rows)]accepted_positions = [j for sub in accepted_positions for j in sub]formatted = convert_shape_format(piece)for pos in formatted:if pos not in accepted_positions:if pos[1] > -1:return Falsereturn True# 检查游戏是否结束
def check_lost(positions):for pos in positions:x, y = posif y < 1:return Truereturn False# 从给定位置消除行
def clear_rows(grid, locked):full_rows = [i for i, row in enumerate(grid) if (0, 0, 0) not in row]for row in full_rows:del grid[row]grid.insert(0, [(0, 0, 0) for _ in range(Piece.columns)])for row in full_rows:for key in sorted(list(locked), key=lambda x: x[1])[::-1]:x, y = keyif y < row:new_key = (x, y + 1)locked[new_key] = locked.pop(key)return len(full_rows)# 绘制游戏区域
def draw_grid(surface, grid):for row in range(len(grid)):for col in range(len(grid[row])):pygame.draw.rect(surface, grid[row][col], (top_left_x + col * block_size,top_left_y + row * block_size,block_size, block_size))pygame.draw.rect(surface, (0, 0, 0), (top_left_x + col * block_size,top_left_y + row * block_size,block_size, block_size), 1)# 绘制方块
def draw_piece(surface, piece):shape_format = piece.shape[piece.rotation % len(piece.shape)]for i, line in enumerate(shape_format):row = list(line)for j, column in enumerate(row):if column == '0':pygame.draw.rect(surface, piece.color, (top_left_x + (piece.x + j) * block_size,top_left_y + (piece.y + i) * block_size,block_size, block_size))pygame.draw.rect(surface, (0, 0, 0), (top_left_x + (piece.x + j) * block_size,top_left_y + (piece.y + i) * block_size,block_size, block_size), 1)# 绘制游戏界面
def draw_window(surface, grid, score=0):surface.fill((0, 0, 0))pygame.font.init()font = pygame.font.SysFont('comicsans', 60)label = font.render('Tetris', 1, (255, 255, 255))surface.blit(label, (top_left_x + play_width / 2 - (label.get_width() / 2), 30))font = pygame.font.SysFont('comicsans', 40)label = font.render('Score: ' + str(score), 1, (255, 255, 255))surface.blit(label, (top_left_x + play_width + 50, 100))for row in range(len(grid)):for col in range(len(grid[row])):pygame.draw.rect(surface, grid[row][col], (top_left_x + col * block_size,top_left_y + row * block_size,block_size, block_size))pygame.draw.rect(surface, (0, 0, 0), (top_left_x + col * block_size,top_left_y + row * block_size,block_size, block_size), 1)pygame.draw.rect(surface, (255, 0, 0), (top_left_x, top_left_y, play_width, play_height), 5)# 主函数
def main():locked_positions = {}grid = create_grid(locked_positions)change_piece = Falserun = Truecurrent_piece = Piece(5, 0, random.choice(shapes))next_piece = Piece(5, 0, random.choice(shapes))clock = pygame.time.Clock()fall_time = 0fall_speed = 0.27level_time = 0score = 0while run:grid = create_grid(locked_positions)fall_time += clock.get_rawtime()level_time += clock.get_rawtime()clock.tick()if level_time / 1000 > 5:level_time = 0if fall_speed > 0.12:fall_speed -= 0.005if fall_time / 1000 > fall_speed:fall_time = 0current_piece.y += 1if not (valid_space(current_piece, grid)) and current_piece.y > 0:current_piece.y -= 1change_piece = Truefor event in pygame.event.get():if event.type == pygame.QUIT:run = Falsepygame.display.quit()quit()if event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:current_piece.x -= 1if not valid_space(current_piece, grid):current_piece.x += 1if event.key == pygame.K_RIGHT:current_piece.x += 1if not valid_space(current_piece, grid):current_piece.x -= 1if event.key == pygame.K_DOWN:current_piece.y += 1if not valid_space(current_piece, grid):current_piece.y -= 1if event.key == pygame.K_UP:current_piece.rotation += 1if not valid_space(current_piece, grid):current_piece.rotation -= 1shape_pos = convert_shape_format(current_piece)for i in range(len(shape_pos)):x, y = shape_pos[i]if y > -1:grid[y][x] = current_piece.colorif change_piece:for pos in shape_pos:p = (pos[0], pos[1])locked_positions[p] = current_piece.colorcurrent_piece = next_piecenext_piece = Piece(5, 0, random.choice(shapes))change_piece = Falsescore += clear_rows(grid, locked_positions) * 10draw_window(win, grid, score)draw_piece(win, current_piece)pygame.display.update()if check_lost(locked_positions):run = Falsedraw_window(win, grid, score)pygame.time.delay(2000)win = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('Tetris')main()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

监控视频汇聚融合云平台一站式解决视频资源管理痛点

随着5G技术的广泛应用&#xff0c;各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据&#xff0c;并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而&#xff0c;随着数字化建设和生产经营管理活动的长期开展&#xff0…

EE308FZ_Sixth Assignment_Beta Sprint_Sprint Essay1

AssignmentBeta SprintCourseEE308FZ[A] — Software EngineeringClass Link2401_MU_SE_FZURequirementsSixth Assignment——Beta SprintTeam NameFZUGOObjectiveSprint Essay 1_Day1-Day2 (12.11-12.12)Other Reference1. WeChat Mini Program Design Guide 2. Javascript St…

【报表查询】.NET开源ORM框架 SqlSugar 系列

文章目录 前言实践一、按月统计没有为0实践二、 统计某月每天的数量实践三、对象和表随意JOIN实践四、 List<int>和表随意JOIN实践五、大数据处理实践六、每10分钟统计Count实践七、 每个ID都要对应时间总结 前言 在我们实际开发场景中&#xff0c;报表是最常见的功能&a…

GIT区域介绍及码云+GIt配置仓库

GIT区域介绍 创建文件夹git init 1、git有3个区域 工作区&#xff08;working directory&#xff09;&#xff1a;项目的根目录&#xff0c;不包 括.git在内的其他文件暂存区&#xff08;stage area&#xff09;&#xff1a;是一个看不见的区域&#xff0c;git add 命令就是将文…

YOLO8 改进 009:引入 ASFF 对 YOLOv8 检测头进行优化(适用于小目标检测任务)

论文题目&#xff1a;Learning Spatial Fusion for Single-Shot Object Detection 论文地址&#xff1a;Paper - ASFF 官方源码&#xff1a;GitHub - GOATmessi8/ASFF 简 介 多尺度特征融合是解决多尺度目标检测问题的关键技术&#xff0c;其中 FPN&#xff08;特征金字塔网络…

利用Matlab绘制心性函数

第一种心性函数 我们利用下面这个参数方程在的区间上绘制一个心性函数 首先&#xff0c;我们在matlab中设置一个参量t在区间内&#xff0c;然后将参数t带入上面两个式子计算就可以得到心性函数对应的x-y坐标 代码示例 我们可以通过调整代码的颜色、线宽等属性改变心性函数的…

穷举vs暴搜vs深搜vs回溯vs剪枝专题一>全排列II

题目&#xff1a; 解析&#xff1a; 这题设计递归函数&#xff0c;主要把看如何剪枝 代码&#xff1a; class Solution {private List<List<Integer>> ret;private List<Integer> path;private boolean[] check;public List<List<Integer>> p…

react中实现导出excel文件

react中实现导出excel文件 一、安装依赖二、实现导出功能三、自定义列标题四、设置列宽度五、样式优化1、安装扩展库2、设置样式3、扩展样式功能 在 React 项目中实现点击按钮后导出数据为 Excel 文件&#xff0c;可以使用 xlsx 和 file-saver 这两个库。 一、安装依赖 在项目…

Vue前端开发-数据缓存

完成全局性的axios实例对象配置后&#xff0c;则可以在任意一个组件中直接调用这个对象&#xff0c;发送异步请求&#xff0c;获取服务端返回的数据&#xff0c;同时&#xff0c;针对那些不经常变化的数据&#xff0c;可以在请求过程中&#xff0c;进行数据缓存&#xff0c;并根…

Qt for Python (PySide6)设置程序图标和任务栏图标

环境 使用Qt for Python开发Windows应用程序。 Python版本&#xff1a;3.12 Qt版本&#xff1a;PySide6 前言 先上一个简单的测试程序 from PySide6.QtWidgets import QMainWindow,QLabel,QApplication from PySide6 import QtGui import sysclass MainWindow(QMainWindow)…

MySQL基础笔记(三)

在此特别感谢尚硅谷-康师傅的MySQL精品教程 获取更好的阅读体验请前往我的博客主站! 如果本文对你的学习有帮助&#xff0c;请多多点赞、评论、收藏&#xff0c;你们的反馈是我更新最大的动力&#xff01; 创建和管理表 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数…

FlashAttention理解

参考&#xff1a;https://github.com/Dao-AILab/flash-attention 文章目录 一、FlashAttention理解1. FlashAttention的特点&#xff1a;2. 工作原理3. 安装4. 代码示例5. flash_attn_func 参数说明6. 适用场景7. 总结 二、FlashAttention 1.X 2.X 3.X版本的区别与联系1. **Fla…

网络安全渗透有什么常见的漏洞吗?

弱口令与密码安全问题 THINKMO 01 暴力破解登录&#xff08;Weak Password Attack&#xff09; 在某次渗透测试中&#xff0c;测试人员发现一个网站的后台管理系统使用了非常简单的密码 admin123&#xff0c;而且用户名也是常见的 admin。那么攻击者就可以通过暴力破解工具&…

OpenCV基本图像处理操作(三)——图像轮廓

轮廓 cv2.findContours(img,mode,method) mode:轮廓检索模式 RETR_EXTERNAL &#xff1a;只检索最外面的轮廓&#xff1b;RETR_LIST&#xff1a;检索所有的轮廓&#xff0c;并将其保存到一条链表当中&#xff1b;RETR_CCOMP&#xff1a;检索所有的轮廓&#xff0c;并将他们组…

建投数据与腾讯云数据库TDSQL完成产品兼容性互认证

近日&#xff0c;经与腾讯云联合测试&#xff0c;建投数据自主研发的人力资源信息管理系统V3.0、招聘管理系统V3.0、绩效管理系统V2.0、培训管理系统V3.0通过腾讯云数据库TDSQL的技术认证&#xff0c;符合腾讯企业标准的要求&#xff0c;产品兼容性良好&#xff0c;性能卓越。 …

armsom产品Debian系统开发

第一章 构建 Debian Linux 系统 我们需要按【armsom产品编译&烧录Linux固件】全自动编译一次&#xff0c;默认是编译 Buildroot 系统&#xff0c;也会编 译 uboot 和内核&#xff0c;buildroot 某些软件包依赖内核&#xff0c;所以我们必须编译内核再编译 Buildroot。同 理…

[Linux] 进程信号概念 | 信号产生

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 为什么我的课设这么难…

小程序测试的测试内容有哪些?

在数字化快速发展的今天&#xff0c;小程序成为了很多企业进行产品推广和服务互动的重要平台。小程序的广泛应用使得对其质量的要求越来越高&#xff0c;小程序测试应运而生。这一过程不仅涉及功能的准确性&#xff0c;更涵盖了用户体验、性能、安全等多个维度。 小程序测试的…

使用 NVIDIA DALI 计算视频的光流

引言 光流&#xff08;Optical Flow&#xff09;是计算机视觉中的一种技术&#xff0c;主要用于估计视频中连续帧之间的运动信息。它通过分析像素在时间维度上的移动来预测运动场&#xff0c;广泛应用于目标跟踪、动作识别、视频稳定等领域。 光流的计算传统上依赖 CPU 或 GP…

微积分复习笔记 Calculus Volume 2 - 4.4 The Logistic Equation

4.4 The Logistic Equation - Calculus Volume 2 | OpenStax