俄罗斯方块小游戏开发

代码图:

import pygame, random

pygame.init()

# 游戏界面参数
width = 300
height = 600
surface = pygame.display.set_mode((width, height))

# 颜色定义
black = (0, 0, 0)
white = (255, 255, 255)
red = (200, 0, 0)
green = (0, 200, 0)
blue = (0, 0, 200)

# 俄罗斯方块参数
block_size = 20
grid_width = width // block_size
grid_height = height // block_size
grid = [[0] * grid_width for _ in range(grid_height)]

# 方块形状定义
shapes = [
    [[1, 1, 1], [0, 1, 0]],
    [[0, 2, 2], [2, 2, 0]],
    [[3, 3, 0], [0, 3, 3]],
    [[4, 0, 0], [4, 4, 4]],
    [[0, 0, 5], [5, 5, 5]],
    [[6, 6], [6, 6]],
    [[7, 7, 7, 7]]
]


# 方块随机生成函数
def new_block():
    shape = random.choice(shapes)
    block = {'shape': shape, 'x': grid_width // 2 - len(shape[0]) // 2, 'y': 0,
             'color': random.choice([red, green, blue])}
    return block


# 方块绘制函数
def draw_block(x, y, color):
    pygame.draw.rect(surface, color, (x * block_size, y * block_size, block_size, block_size))
    pygame.draw.rect(surface, black, (x * block_size, y * block_size, block_size, block_size), 1)


# 方块下落函数
def drop(block):
    block['y'] += 1
    if collision(block):
        block['y'] -= 1
        place(block)
        block = new_block()
    return block


# 方块移动函数
def move(block, dx):
    block['x'] += dx
    if collision(block):
        block['x'] -= dx
    return block


# 方块旋转函数
def rotate(block):
    shape = block['shape']
    block['shape'] = [[shape[y][x] for y in range(len(shape))] for x in range(len(shape[0]) - 1, -1, -1)]
    if collision(block):
        block['shape'] = shape
    return block


# 方块碰撞检测函数
def collision(block):
    shape = block['shape']
    for y, row in enumerate(shape):
        for x, cell in enumerate(row):
            if cell and (block['y'] + y >= grid_height or block['x'] + x < 0 or block['x'] + x >= grid_width or
                         grid[block['y'] + y][block['x'] + x]):
                return True
    return False


# 方块存放函数
def place(block):
    shape = block['shape']
    for y, row in enumerate(shape):
        for x, cell in enumerate(row):
            if cell:
                grid[block['y'] + y][block['x'] + x] = block['color']


# 行满检测函数
def full_rows():
    rows = []
    for y, row in enumerate(grid):
        if 0 not in row:
            rows.append(y)
    return rows


# 行删除函数
def remove_rows(rows):
    rows.sort(reverse=True)
    for row in rows:
        del grid[row]
        grid.insert(0, [0] * grid_width)


# 游戏循环
block = new_block()
clock = pygame.time.Clock()
while True:
    surface.fill(white)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                block = move(block, -1)
            elif event.key == pygame.K_RIGHT:
                block = move(block, 1)
            elif event.key == pygame.K_UP:
                block = rotate(block)
            elif event.key == pygame.K_DOWN:
                block = drop(block)

    block = drop(block)

    for y, row in enumerate(grid):
        for x, cell in enumerate(row):
            if cell:
                draw_block(x, y, cell)

    for y, row in enumerate(block['shape']):
        for x, cell in enumerate(row):
            if cell:
                draw_block(block['x'] + x, block['y'] + y, block['color'])

    rows = full_rows()
    if rows:
        remove_rows(rows)

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

结果图:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT 中 多线程(备查)

基础 一个线程处理窗口事件&#xff0c;其他线程进行逻辑运算 在QT中使用多线程&#xff0c;需要额外注意的&#xff1a; 1&#xff09;默认的线程在Qt中称之为窗口线程&#xff0c;也叫主线程&#xff0c;负责窗口事件处理或者窗口控件数据的更新 2&#xff09;子线程负责后台…

ORA-12560:TNS:协议适配器错误 ORA-12518:TNS:监听程序无法分发客户机连接

ORA-12560:TNS:协议适配器错误的解决方法 造成ORA-12560:TNS:协议适配器错误的问题的原因有三个&#xff1a; 1.监听服务没有起起来。windows平台如下操作&#xff1a;开始一程序一管理工具一服务&#xff0c;打开服务面板&#xff0c;启动oraclehome92TNS listener服务。 2.…

搭建React项目,基于Vite+React+TS+ESLint+Prettier+Husky+Commitlint

基于ViteReactTSESLintPrettierHuskyCommitlint搭建React项目 node: 20.10.0 一、创建项目 安装包管理器pnpm npm i pnpm -g基于Vite创建项目 pnpm create vitelatest web-gis-react --template react-ts进入项目目录安装依赖 $ cd web-gis-react $ pnpm i启动项目 $ pnpm…

CentOS7 部署PostgreSQL

参考文档&#xff1a;https://www.postgresql.org/download/linux/redhat/ 1. 配置yum源 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm2. 安装PostgreSQL13 yum install -y postgresql13-server3…

【MATLAB源码-第95期】基于matlab的协作通信中(AF模式)中继选择算法对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 最大最小中继选择 (Max-Min Relay Selection)&#xff1a;这种算法选择能够提供最大最小信号强度的中继。它首先计算所有可用中继的信号强度&#xff0c;然后选择那些在最差信道条件下仍能保持最高信号强度的中继。其目的…

【Git】ssh: connect to host github.com port 22: Connection refused

错误展示&#xff1a; 错误原因&#xff1a;22端口被拒绝访问 解决办法 在~/.ssh/config文件&#xff08;有就直接编辑&#xff0c;没有就创建&#xff09;里添加以下内容&#xff0c;这样ssh连接GitHub的时候就会使用443端口。 Host github.comHostname ssh.github.comPort…

【Linux】Linux基础

文章目录 学习目标操作系统不同应用领域的主流操作系统虚拟机 Linux系统的发展史Linux内核版和发行版 Linux系统下的文件和目录结构单用户操作系统vs多用户操作系统Windows和Linux文件系统区别 Linux终端命令格式终端命令格式查阅命令帮助信息 常用命令显示文件和目录切换工作目…

【Delphi】一个函数实现ios,android震动功能 Vibrate(包括3D Touch 中 Peek 震动等)

一、前言 我们在开发移动端APP的时候&#xff0c;有时可能需要APP能够提供震动功能&#xff0c;以便提醒操作者&#xff0c;特别是ios提供的3D Touch触感功能&#xff0c;操作者操作时会有触感震动&#xff0c;给操作者的感觉很友好。那么&#xff0c;在Delphi的移动端FMX开发中…

亚信安慧AntDB受邀分享核心业务系统全域数据库替换实践

近日&#xff0c;亚信安慧AntDB数据库凭借丰富的核心业务系统升级替换能力和经验&#xff0c;受邀参与IT168组织的第三期“国产软硬件升级替换之路”的直播沙龙。 亚信安慧AntDB数据库相关负责人发表《基于AntDB的CRM全域数据库替换实践》的精彩演讲&#xff0c;通过通信行业率…

cocos creator [Window] Cannot read property ‘dump‘ of null

写脚本的时候&#xff0c;出现了如下的问题&#xff0c; [Window] Cannot read property dump of null 原因&#xff1a;在下图中&#xff0c;方式一是正常的&#xff0c;而方式二则会爆出此错误&#xff0c;所以需要初始化&#xff0c;给它赋值

如何提高Pycharm的使用体验?

汉化 文件---设置---插件---chinese---安装---重启ide 代码补全 tabnine 文件---设置---插件---tabnine---安装---重启ide 重启ide后生效&#xff0c;补全效果如下 自定义背景 文件---设置---外观---背景图像---选择图片---调整透明度保存即可 设置头部声明 英文版…

Python 网络爬虫(四):初识网络爬虫

《Python入门核心技术》专栏总目录・点这里 文章目录 什么是爬虫爬虫的工作原理应用场景反爬虫合法和道德问题Robots 协议练习爬虫的一些网站总结 大家好&#xff0c;我是水滴~~ 在当今数字化时代&#xff0c;互联网上充斥着大量的数据和信息&#xff0c;而我们常常需要从这个…

python笔记:dtaidistance

1 介绍 用于DTW的库纯Python实现和更快的C语言实现 2 DTW举例 2.1 绘制warping 路径 from dtaidistance import dtw from dtaidistance import dtw_visualisation as dtwvis import numpy as np import matplotlib.pyplot as plts1 np.array([0., 0, 1, 2, 1, 0, 1, 0, 0…

android如何优雅的编写OpenGl的shader代码

通常在android里编写openGl代码的方式是创建一个类&#xff0c;类里面用硬编码的形式引入两个shader&#xff0c;如下图&#xff1a; 这里把glsl语言通过string字符串的形式定义在类里&#xff0c;虽然便于管理&#xff0c;但是不利于阅读和编写 那么有没有比较优雅的解决方案…

详解Python 迭代器介绍及作用

文章目录 迭代器&#xff1a;初探什么是迭代器&#xff1f;通过迭代器进行迭代迭代器 for 循环的工作构建自定义迭代器Python 无限迭代器Python 迭代器的好处总结关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包…

Uncle Maker: (Time)Stamping Out The Competition in Ethereum

目录 笔记后续的研究方向摘要引言贡献攻击的简要概述 Uncle Maker: (Time)Stamping Out The Competition in Ethereum CCS 2023 笔记 本文对以太坊 1 的共识机制进行了攻击&#xff0c;该机制允许矿工获得比诚实同行更高的挖矿奖励。这种名为“Uncle Maker”的攻击操纵区块时间…

基于Java SSM框架实现实现人事工资管理系统项目【项目源码+论文说明】

基于java的SSM框架实现人事工资管理系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个人事管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述人事…

Vue学习计划-Vue2--Vue组件(一)认识组件

1.0 引入组件 传统方式编写应用 使用组件方式编写应用 1.1 模块 理解&#xff1a;向外提供特定的js程序&#xff0c;一般就是一个js文件为什么&#xff1a;js文件很多很复杂作用&#xff1a;复用js,简化js的编写&#xff0c;提高js运行效率 1.2 组件认识 理解&#xff1a; …

提高工作效率的JavaScript单行代码

摘要&#xff1a; 平时在根据ui设计图处理数据的时候&#xff0c;需要用到js的一些方法&#xff01;所以这里总结一些提高工作效率的JavaScript单行代码&#xff01; 目录概览 摘要&#xff1a;1.#生成随机字符串2.# 转义HTML特殊字符3.# 单词首字母大写4.# 将字符串转换为小驼…

第74讲:MySQL数据库InnoDB存储引擎事务:Redo Log与Undo Logo的核心概念

文章目录 1.InnoDB引擎中的逻辑存储结构2.事务的基本概念3.Redo log的核心概念3.1.什么是Redo log3.2.如果没有redo log面临的问题3.3.使用redo log之后是怎样的流程 4.Undo log的核心概念 1.InnoDB引擎中的逻辑存储结构 InnoDB存储引擎的逻辑结构分为以下几层&#xff1a; Ta…
最新文章