每日一个小题

import pygame

import random

 

# 初始化 Pygame

pygame.init()

 

# 屏幕大小

screen_width = 300

screen_height = 600

block_size = 30

 

# 颜色定义

colors = [

    (0, 0, 0),

    (255, 0, 0),

    (0, 150, 0),

    (0, 0, 255),

    (255, 120, 0),

    (255, 255, 0),

    (180, 0, 255),

    (0, 220, 220)

]

 

# 形状定义

shapes = [

    [[1, 1, 1],

     [0, 1, 0]],

    

    [[0, 2, 2],

     [2, 2, 0]],

    

    [[3, 3, 0],

     [0, 3, 3]],

    

    [[4, 4],

     [4, 4]],

    

    [[0, 5, 0],

     [5, 5, 5]],

    

    [[6, 6, 6, 6]],

    

    [[7, 7],

     [7, 7]]

]

 

class Tetris:

    def __init__(self):

        self.width = screen_width // block_size

        self.height = screen_height // block_size

        self.board = [[0 for x in range(self.width)] for y in range(self.height)]

        self.score = 0

        self.gameover = False

        self.current_piece = self.new_piece()

        self.next_piece = self.new_piece()

        self.clock = pygame.time.Clock()

        self.fall_time = 0

        self.level = 1

        self.lines = 0

 

    def new_piece(self):

        shape = random.choice(shapes)

        color = colors[shapes.index(shape) + 1]

        return {'shape': shape, 'color': color, 'x': self.width // 2 - len(shape[0]) // 2, 'y': 0}

 

    def rotate_piece(self):

        piece = self.current_piece['shape']

        new_piece = list(zip(*piece[::-1]))

        self.current_piece['shape'] = new_piece

 

    def valid_space(self, piece, offset):

        off_x, off_y = offset

        for y, row in enumerate(piece):

            for x, cell in enumerate(row):

                if cell and (x + off_x < 0 or x + off_x >= self.width or y + off_y >= self.height or self.board[y + off_y][x + off_x]):

                    return False

        return True

 

    def freeze(self):

        piece = self.current_piece['shape']

        for y, row in enumerate(piece):

            for x, cell in enumerate(row):

                if cell:

                    self.board[y + self.current_piece['y']][x + self.current_piece['x']] = self.current_piece['color']

        self.clear_lines()

        self.current_piece = self.next_piece

        self.next_piece = self.new_piece()

        if not self.valid_space(self.current_piece['shape'], (self.current_piece['x'], self.current_piece['y'])):

            self.gameover = True

 

    def clear_lines(self):

        lines = 0

        for i, row in enumerate(self.board):

            if all(row):

                del self.board[i]

                self.board.insert(0, [0 for _ in range(self.width)])

                lines += 1

        self.score += lines ** 2 * 100

        self.lines += lines

        if self.lines >= 10:

            self.level += 1

            self.lines -= 10

            pygame.time.set_timer(pygame.USEREVENT+1, max(100, 1000 - (self.level-1)*100))

 

    def drop(self):

        self.current_piece['y'] += 1

        if not self.valid_space(self.current_piece['shape'], (self.current_piece['x'], self.current_piece['y'])):

            self.current_piece['y'] -= 1

            self.freeze()

 

    def move(self, dx):

        self.current_piece['x'] += dx

        if not self.valid_space(self.current_piece['shape'], (self.current_piece['x'], self.current_piece['y'])):

            self.current_piece['x'] -= dx

 

    def draw_grid(self, surface):

        for y in range(self.height):

            for x in range(self.width):

                pygame.draw.rect(surface, colors[self.board[y][x]], (x*block_size, y*block_size, block_size, block_size), 0)

                pygame.draw.rect(surface, (255, 255, 255), (x*block_size, y*block_size, block_size, block_size), 1)

 

    def draw_piece(self, surface):

        shape = self.current_piece['shape']

        for y, row in enumerate(shape):

            for x, cell in enumerate(row):

                if cell:

                    pygame.draw.rect(surface, self.current_piece['color'], ((self.current_piece['x'] + x) * block_size, (self.current_piece['y'] + y) * block_size, block_size, block_size), 0)

                    pygame.draw.rect(surface, (255, 255, 255), ((self.current_piece['x'] + x) * block_size, (self.current_piece['y'] + y) * block_size, block_size, block_size), 1)

 

    def run(self):

        screen = pygame.display.set_mode((screen_width, screen_height))

        pygame.display.set_caption('Tetris')

        pygame.time.set_timer(pygame.USEREVENT+1, 1000)

        while not self.gameover:

            for event in pygame.event.get():

                if event.type == pygame.QUIT:

                    pygame.quit()

                    return

                elif event.type == pygame.KEYDOWN:

                    if event.key == pygame.K_LEFT:

                        self.move(-1)

                    elif event.key == pygame.K_RIGHT:

                        self.move(1)

                    elif event.key == pygame.K_DOWN:

                        self.drop()

                    elif event.key == pygame.K_UP:

                        self.rotate_piece()

                elif event.type == pygame.USEREVENT+1:

                    self.drop()

            self.fall_time += self.clock.get_rawtime()

            self.clock.tick()

            if self.fall_time / 1000 > 1:

                self.drop()

                self.fall_time = 0

            screen.fill((0, 0, 0))

            self.draw_grid(screen)

            self.draw_piece(screen)

            pygame.display.flip()

        print("Game Over! Score:", self.score)

        pygame.quit()

 

if __name__ == '__main__':

    game = Tetris()

    game.run()

实现了一个基本的俄罗斯方块游戏,包括方块的移动、旋转、下落以及行的消除等功能,你可以直接运行这个脚本来玩游戏

 

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

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

相关文章

Jason配置环境变量

jason官网 https://jason-lang.github.io/ https://github.com/jason-lang/jason/releases 步骤 安装 Java 21 或更高版本 安装 Visual Studio Code 根据操作系统&#xff0c;请按照以下具体步骤操作 视窗 下载 Jason 的最新版本&#xff0c;选择“jason-bin-3.3.0.zip”…

机器学习--概览

一、机器学习基础概念 1. 定义 机器学习&#xff08;Machine Learning, ML&#xff09;&#xff1a;通过算法让计算机从数据中自动学习规律&#xff0c;并利用学习到的模型进行预测或决策&#xff0c;而无需显式编程。 2. 与编程的区别 传统编程机器学习输入&#xff1a;规…

如何使用SliverGrid组件

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了SliverList组件相关的内容&#xff0c;本章回中将介绍SliverGrid组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在本章回中介绍的SliverGrid组件是一种网格类组件&#xff0c;主要用来…

大模型培训讲师老师叶梓分享:DeepSeek多模态大模型janus初探

以下视频内容为叶梓分享DeepSeek多模态大模型janus的部署&#xff0c;并验证其实际效果&#xff0c;包括图生文和文生图两部分。 叶梓老师人工智能培训分享DeepSeek多模态大模型janus初探 DeepSeek 的多模态大模型 Janus 是一款强大的 AI 模型&#xff0c;专注于图像和文本的多…

一文掌握ADB的安装及使用

文章目录 一、什么是ADB&#xff1f;二、 安装ADB2.1 下载ADB2.2 配置环境变量 三、连接Android设备四、 常用ADB命令五、ADB高级功能5.1 屏幕截图和录制5.2 模拟按键输入5.3 文件管理5.4 系统设置管理5.5 系统操作指令5.6 日志操作指令5.7 APK操作指令5.8 设备重启和恢复 六、…

【机器学习与数据挖掘实战】案例11:基于灰色预测和SVR的企业所得税预测分析

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数据集中发现模式、关联…

bat脚本实现自动化漏洞挖掘

bat脚本 BAT脚本是一种批处理文件&#xff0c;可以在Windows操作系统中自动执行一系列命令。它们可以简化许多日常任务&#xff0c;如文件操作、系统配置等。 bat脚本执行命令 echo off#下面写要执行的命令 httpx 自动存活探测 echo off httpx.exe -l url.txt -o 0.txt nu…

Kafka下载

一、Kafka下载 下载地址&#xff1a;https://kafka.apache.org/downloads 二、Kafka安装 因为选择下载的是 .zip 文件&#xff0c;直接跳过安装&#xff0c;一步到位。 选择在任一磁盘创建空文件夹&#xff08;不要使用中文路径&#xff09;&#xff0c;解压之后把文件夹内容…

学习日记-250202

现在开始要继续写我的日记了......&#xff08;也可以当作笔记吧&#xff09; 一.论文 Prompt Transfer for Dual-Aspect Cross Domain Cognitive Diagnosis 主要内容&#xff1a; 主要是加入prompt提示&#xff0c; 为重叠实体设计个性化的提示&#xff0c;为非重叠实体设计共…

【人工智能学习笔记 一】 AI分层架构、基本概念分类与产品技术架构

新的一年2025要对AI以及LLM有个强化的学习&#xff0c;所以第一篇先对整体有个大概的认知&#xff0c;一直分不清LLM和AI的关系&#xff0c;在整个体系里的位置&#xff0c;以及AIGC是什么东西&#xff0c;AI AGENT类似豆包等和大语言模型的具体关系是什么&#xff0c;整个AI的…

git多人协作

目录 一、项目克隆 二、 1、进入克隆仓库设置 2、协作处理 3、冲突处理 4、多人协作分支的推送拉取删除 1、分支推送&#xff08;2种&#xff09; 2、远程分支拉取&#xff08;2种&#xff09; 3、远程分支删除 一、项目克隆 git clone 画船听雨眠/test1 (自定义的名…

线性数据结构:单向链表

放弃眼高手低&#xff0c;你真正投入学习&#xff0c;会因为找到一个新方法产生成就感&#xff0c;学习不仅是片面的记单词、学高数......只要是提升自己的过程&#xff0c;探索到了未知&#xff0c;就是学习。 目录 一.链表的理解 二.链表的分类&#xff08;重点理解&#xf…

linux下ollama更换模型路径

Linux下更换Ollama模型下载路径指南   在使用Ollama进行AI模型管理时&#xff0c;有时需要根据实际需求更改模型文件的存储路径。本文将详细介绍如何在Linux系统中更改Ollama模型的下载路径。 一、关闭Ollama服务   在更改模型路径之前&#xff0c;需要先停止Ollama服务。…

影视文件大数据高速分发方案

在当今的数字时代&#xff0c;影视行业的内容创作和传播方式经历了翻天覆地的变化。随着4K、8K高清视频的普及&#xff0c;以及虚拟现实(VR)和增强现实(AR)技术的发展&#xff0c;影视文件的数据量正以前所未有的速度增长。这就要求行业内的参与者必须拥有高效的大数据传输解决…

【AI】探索自然语言处理(NLP):从基础到前沿技术及代码实践

Hi &#xff01; 云边有个稻草人-CSDN博客 必须有为成功付出代价的决心&#xff0c;然后想办法付出这个代价。 目录 引言 1. 什么是自然语言处理&#xff08;NLP&#xff09;&#xff1f; 2. NLP的基础技术 2.1 词袋模型&#xff08;Bag-of-Words&#xff0c;BoW&#xff…

HTMLCSS :下雪了

这段代码创建了一个动态的雪花飘落加载动画&#xff0c;通过 CSS 技术实现了雪花的下落和消失效果&#xff0c;为页面添加了视觉吸引力和动态感。 大家复制代码时&#xff0c;可能会因格式转换出现错乱&#xff0c;导致样式失效。建议先少量复制代码进行测试&#xff0c;若未能…

Android 音视频编解码 -- MediaCodec

引言 如果我们只是简单玩一下音频、视频播放&#xff0c;那么使用 MediaPlayer SurfaceView 播放就可以了&#xff0c;但如果想加个水印&#xff0c;加点其他特效什么的&#xff0c;那就不行了&#xff1b; 学习 Android 自带的硬件码类 – MediaCodec。 MediaCodec 介绍 在A…

一文了解阿里的 Qwen2.5 模型

最近被DeepSeek刷屏了&#xff0c;但是在之外阿里在2025年1月28日推出了Qwen 2.5 Max模型。 Qwen2.5-Max 的特点&#xff1a;大规模的 MoE 模型&#xff0c;预训练于超 20 万亿 tokens&#xff0c;并经过 SFT 和 RLHF 后训练。 性能表现&#xff1a;在多个基准测试中与领先模型…

DeepSeek R1 linux云部署

云平台&#xff1a;AutoDL 模型加载工具&#xff1a;Ollama 参考&#xff1a;https://github.com/ollama/ollama/blob/main/docs/linux.md 下载Ollama 服务器上下载ollama比较慢&#xff0c;因此我使用浏览器先下载到本地电脑上。 https://ollama.com/download/ollama-linux…

FlashAttention v1 论文解读

论文标题&#xff1a;FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 论文地址&#xff1a;https://arxiv.org/pdf/2205.14135 FlashAttention 是一种重新排序注意力计算的算法&#xff0c;它无需任何近似即可加速注意力计算并减少内存占用。…