软件价值4-俄罗斯方块

俄罗斯方块也是一个可以简单实现的游戏

代码:

import pygame
import random
import numpy as nppygame.init()# 游戏参数
WIDTH, HEIGHT = 300, 600
GRID_SIZE = 30
GRID_WIDTH = WIDTH // GRID_SIZE
GRID_HEIGHT = HEIGHT // GRID_SIZE
FPS = 3# 颜色定义
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
CYAN = (0, 255, 255)
MAGENTA = (255, 0, 255)
YELLOW = (255, 255, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
PURPLE = (148, 0, 211)# 俄罗斯方块形状定义
SHAPES = [[[1, 1, 1, 1]],[[0, 1, 0],[1, 1, 1]],[[1, 1, 1],[0, 0, 1]],[[1, 1, 1],[1, 0, 0]],[[1, 1],[1, 1]],[[1, 1, 0],[0, 1, 1]],[[0, 1, 1],[1, 1, 0]],
]class TetrisGame:def __init__(self):self.grid = [[0] * GRID_WIDTH for _ in range(GRID_HEIGHT)]self.current_shape = Noneself.current_color = Noneself.current_x = 0self.current_y = 0self.score = 0self.game_over = Falseself.current_shape_index = 0self.colors = [RED, CYAN, MAGENTA, YELLOW, GREEN, BLUE, PURPLE]self.current_color_index = 0def new_shape(self):while True:self.current_shape = random.choice(SHAPES)self.current_shape_index = SHAPES.index(self.current_shape)self.current_color_index = self.current_shape_indexself.current_color = self.colors[self.current_color_index]if self.current_shape is not None:breakself.current_x = GRID_WIDTH // 2 - len(self.current_shape[0]) // 2self.current_y = 0return self.current_shapedef rotate(self):if self.current_shape is not None:rotated_shape = np.rot90(self.current_shape)if not self.collision(rotated_shape):self.current_shape = rotated_shapedef move_down(self):self.current_y += 1if self.collision():self.current_y -= 1self.freeze()self.clear_lines()if self.current_y <= 0:# 如果当前方块堆积到游戏区域的顶部,触发游戏结束self.game_over = Trueelse:self.new_shape()def move_left(self):self.current_x -= 1if self.collision():self.current_x += 1def move_right(self):self.current_x += 1if self.collision():self.current_x -= 1def collision(self, shape=None):shape = shape if shape is not None else self.current_shapeif shape is not None:for y, row in enumerate(shape):for x, cell in enumerate(row):if cell and (self.current_y + y >= GRID_HEIGHTor self.current_x + x < 0or self.current_x + x >= GRID_WIDTHor self.grid[self.current_y + y][self.current_x + x]):return Truereturn Falsedef freeze(self):for y, row in enumerate(self.current_shape):for x, cell in enumerate(row):if cell:self.grid[self.current_y + y][self.current_x + x] = self.current_colordef clear_lines(self):lines_to_clear = [i for i, row in enumerate(self.grid) if all(row)]for line in reversed(lines_to_clear):del self.grid[line]self.grid.insert(0, [0] * GRID_WIDTH)self.score += 10def draw_grid(self, surface):for y, row in enumerate(self.grid):for x, cell in enumerate(row):if cell:pygame.draw.rect(surface,cell,(x * GRID_SIZE, y * GRID_SIZE, GRID_SIZE, GRID_SIZE),)def draw_current_shape(self, surface):if self.current_shape is not None:for y, row in enumerate(self.current_shape):for x, cell in enumerate(row):if cell:pygame.draw.rect(surface,self.current_color,((self.current_x + x) * GRID_SIZE, (self.current_y + y) * GRID_SIZE, GRID_SIZE, GRID_SIZE),)def draw_score(self, surface):font = pygame.font.Font(None, 36)score_text = font.render(f"Score: {self.score}", True, WHITE)surface.blit(score_text, (10, 10))def draw_game_over(self, surface):font = pygame.font.Font(None, 72)game_over_text = font.render("Game Over", True, WHITE)surface.blit(game_over_text, (WIDTH // 4, HEIGHT // 3))score_text = font.render(f"Score: {self.score}", True, WHITE)surface.blit(score_text, (WIDTH // 3, HEIGHT // 2))def main():pygame.display.set_caption("Tetris")screen = pygame.display.set_mode((WIDTH, HEIGHT))clock = pygame.time.Clock()game = TetrisGame()# 在循环外部创建第一个形状game.new_shape()while not game.game_over:for event in pygame.event.get():if event.type == pygame.QUIT:game.game_over = Trueelif event.type == pygame.KEYDOWN:if event.key == pygame.K_DOWN:game.move_down()elif event.key == pygame.K_LEFT:game.move_left()elif event.key == pygame.K_RIGHT:game.move_right()elif event.key == pygame.K_UP:game.rotate()# 移动下移移到事件处理外部game.move_down()screen.fill(BLACK)game.draw_grid(screen)game.draw_current_shape(screen)game.draw_score(screen)pygame.display.flip()clock.tick(FPS)while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()returnif __name__ == "__main__":main()

运行效果:

俄罗斯方块

失败截图:

核心代码解释:

    def freeze(self):for y, row in enumerate(self.current_shape):for x, cell in enumerate(row):if cell:self.grid[self.current_y + y][self.current_x + x] = self.current_color

这段代码位于 TetrisGame 类中的 freeze 方法中,其作用是将当前正在下落的方块 "冻结" 到游戏区域中。具体来说,它将方块的颜色信息赋值给游戏区域中对应位置的格子,从而将方块的形状固定在游戏区域中。

 

  1. for y, row in enumerate(self.current_shape):
    使用 enumerate 函数遍历当前正在下落的方块的每一行,其中 y 是行索引,row 是行的内容。

  2. for x, cell in enumerate(row):
    在每一行中,再次使用 enumerate 函数遍历该行的每个单元格,其中 x 是列索引,cell 是单元格的值。

  3. if cell:
    检查当前单元格是否包含方块的一部分,即是否为非零值。如果是,表示这个单元格是方块的一部分。

  4. self.grid[self.current_y + y][self.current_x + x] = self.current_color
    将当前方块的颜色信息 self.current_color 赋值给游戏区域中对应位置的格子。self.current_y + y 表示方块在游戏区域中的纵坐标,self.current_x + x 表示方块在游戏区域中的横坐标。self.current_x 表示当前方块左上角单元格在游戏区域中的横坐标,x是当前正在遍历的方块的一行中的相对横坐标。通过相加,可以得到方块中每个单元格在游戏区域中的绝对坐标。y也是类似。

可以改进的地方:

  • 方块可以更加立体,界面可以更加美化
  • 方块控制可以支持长按 
  • 增加音乐
  • 其它

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

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

相关文章

吉大计网笔记

Osi七层模型 物理层&#xff1a;比特流的透明传输 数据链路层&#xff1a;ip数据包装成帧并传输&#xff0c;处理相邻节点的数据传输。 网络层&#xff1a;选择路由和交换节点&#xff0c;处理任意节点的数据传输。 运输层&#xff1a;主机进程的数据传输服务&#xff0c;端到端…

轻量式RPC调用日志链路设计方案

导语: 调用链跟踪系统,又称为tracing&#xff0c;是微服务设计架构中&#xff0c;从系统层面对整体的monitoring和profiling的一种技术手 背景说明 由于我们的项目是微服务方向&#xff0c;中后台服务调用链路过深&#xff0c;追踪路径过长&#xff0c;其中某个服务报错或者异…

什么样的评论更容易得到别人的关注

要发表吸引人的评论&#xff0c;可以注意这些个方面&#xff1a; 合适的软件&#xff1a;用DT浏览器的笔记本写文本&#xff0c;保存为图片&#xff0c;用图片的方式评论更容易得到别人的关注。 特别的观点&#xff1a;发表与众不同的观点&#xff0c;或者从不同的角度看待问…

solr的原理是什么

1 Java程序里如果有无限for循环的代码导致CPU负载超高&#xff0c;如何排查&#xff1f; 排查Java程序中由于无限循环导致的CPU负载过高的问题&#xff0c;可以按照以下步骤进行&#xff1a; 资源监控&#xff1a; 使用系统命令行工具&#xff08;如Linux上的top或htop&#xf…

C语言第十四弹---函数递归

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 函数递归 1、递归是什么&#xff1f; 1.1、递归的思想 1.2、递归的限制条件 2、递归举例 2.1、举例1&#xff1a;求n的阶乘 2.1.1、分析和代码实现 2.1.2、…

三子棋游戏小课堂

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 今天的主菜是&#xff0c;C语言实现的三子棋小游戏&#xff0c; 所属专栏&#xff1a; C语言知识点 主厨的主页&#xff1a;Chef‘s blog 前言&…

gitlab-runner注册到gitlab时报错:ERROR: Registering runner... failed xxxxxxxx

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

vscode 插件 Tailwind CSS IntelliSense 解决 class 提示问题

问题描述&#xff1a; 如下写js字符串是没有class智能提示的&#xff1a; const clsName bg-[#123456] text-[#654321] return <div className{clsName}></div>解决方案&#xff1a; 安装 clsx 依赖 pnpm i clsx设置 vscode 的 settings.json {"tailwin…

Android组件化中的Arouter学习

假设现在有两个业务组件登录和问答模块之间需要进行通信&#xff0c;可能会想到用反射的方式&#xff0c;是可以但是会影响性能&#xff0c;而写的代码比较多类名这些要记清楚。 路由可以看做表&#xff0c;每个map对应一张表 我们可以试着这么写&#xff0c;完成MainActivity跳…

LTC5548 具宽带 DC 至 6GHz IF 的 2GHz 至 14GHz 微波混频器

优势和特点 上变频或下变频高 IIP3&#xff1a;在 5.8GHz 为 24.4dBm在 9GHz 为 21.4dBm7.1dB 转换损耗 (在 5.8GHz)15.2dBm 输入 P1dB (在 5.8GHz)集成型 LO 缓冲器&#xff1a;0dBm LO 驱动可选的集成型 LO 倍频器低 LO-RF 泄漏&#xff1a;< –30dBm50Ω 宽带匹配 RF 和…

【数据结构】(三)树Tree

目录 1、基本概念 2、二叉树Binary Tree 3、树、森林与二叉树的转换 4、赫夫曼树Huffman Tree与赫夫曼编码Huffman Coding 1、基本概念 &#xff08;1&#xff09;树&#xff08;Tree&#xff09;是 n&#xff08;n ≥\geq 1&#xff09;个节点的有限集&#xff0c;n 0时称…

【word visio绘图】关闭visio两线交叉的跳线(跨线)

【visio绘图】关闭visio两线交叉的跳线&#xff08;跨线&#xff09; 1 如何在Visio绘图中关闭visio两线交叉的跳线&#xff08;跨线&#xff09;第一步&#xff1a;打开Visio并创建您的图形第二步&#xff1a;绘制您的连接线第三步&#xff1a;关闭跳线第四步&#xff1a;手动…

Android 拍照以及相册中选择(适配高版本)————上传头像并裁剪(一)

前言 在项目研发中&#xff0c;相信大家都遇到过给用户增加头像照片的需求。 随着手机版本的不断更新&#xff0c;android 8、android 9、android 10、android 12、android 13、鸿蒙系统等等&#xff1b;遇到这个功能需求&#xff0c;大家肯定会想&#xff0c;“这还不好写&…

C++文件操作(2)

文件操作&#xff08;2&#xff09; 1.二进制模式读取文本文件2.使用二进制读写其他类型内容3.fstream类4.文件的随机存取文件指针的获取文件指针的移动 1.二进制模式读取文本文件 用二进制方式打开文本存储的文件时&#xff0c;也可以读取其中的内容&#xff0c;因为文本文件…

RabbitMQ快速上手

首先他的需求实在什么地方。我美哟明显的感受到。 它给我的最大感受就是脱裤子放屁——多此一举&#xff0c;的感觉。 他将信息发送给服务端中间件。在由MQ服务器发送消息。 服务器会监听消息。 但是它不仅仅局限于削峰填谷和稳定发送信息的功能&#xff0c;它还有其他重要…

15.Golang中的反射机制及应用

目录 概述实践基本应用复杂应用 结束 概述 Golang中的反射用法还是比较简单的 reflect.TypeOf(arg)reflect.ValueOf(arg) 实践 基本应用 package mainimport ("fmt""reflect" )func reflectNum(arg interface{}) {fmt.Println("type ", re…

十分钟快速上手Spring Boot与微信小程序API接口的调用,快速开发小程序后端服务

1.1 微信小程序API接口介绍 微信小程序API接口是连接小程序前端与后端服务器的桥梁&#xff0c;它提供了丰富的功能接口&#xff0c;包括用户信息、支付、模板消息、数据存储等。这些API接口能够满足开发者在小程序中实现各种复杂业务逻辑的需求。 用户信息接口 用户信息接口…

全流程机器视觉工程开发(四)PaddleDetection C++工程化应用部署到本地DLL以供软件调用

前言 我们之前跑了一个yolo的模型&#xff0c;然后我们通过PaddleDetection的库对这个模型进行了一定程度的调用&#xff0c;但是那个调用还是基于命令的调用&#xff0c;这样的库首先第一个不能部署到客户的电脑上&#xff0c;第二个用起来也非常不方便&#xff0c;那么我们可…

【C++干货基地】C++引用与指针的区别:深入理解两者特性及选择正确应用场景

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

MYSQL的配置和安装

下载安装 打开官网 MYSQL官网 点击DOWNLOADS 滑到最低下点击&#xff1a;MYSQL Community(GPL) Downlads 点击Download Archives 点击MySQL Community Server进入网站 选择相应版本下载&#xff0c;这里选择的是5.7.24版本,x86 64位【按需选择】 下载解压 配置文件…