俄罗斯方块小游戏(附源码)

游戏展示

一.导包

import turtle
import random

二.定义一个Block类

  1. 定义一个Block类,用于表示游戏中的方块,包含颜色和形状。
class Block:def __init__(self, color, tiles):self.color = colorself.tiles = tiles

三.定义了7个不同的Block对象

  1. 定义了7个不同的Block对象,分别代表游戏中的7种不同的方块,每种方块都有其特定的颜色和形状。
I = Block("cyan", [[[1, 0, 0, 0],[1, 0, 0, 0],[1, 0, 0, 0],[1, 0, 0, 0]],[[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[1, 1, 1, 1]]])J = Block("blue", [[[0, 1, 0],[0, 1, 0],[1, 1, 0]],[[0, 0, 0],[1, 1, 1],[0, 0, 1]],[[1, 1, 0],[1, 0, 0],[1, 0, 0]],[[0, 0, 0],[1, 0, 0],[1, 1, 1]]])L = Block("orange", [[[1, 0, 0],[1, 0, 0],[1, 1, 0]],[[0, 0, 0],[0, 0, 1],[1, 1, 1]],[[0, 1, 1],[0, 0, 1],[0, 0, 1]],[[0, 0, 0],[1, 1, 1],[1, 0, 0]]])S = Block("lime", [[[0, 0, 0],[0, 1, 1],[1, 1, 0]],[[1, 0, 0],[1, 1, 0],[0, 1, 0]]])Z = Block("red", [[[0, 0, 0],[1, 1, 0],[0, 1, 1]],[[0, 1, 0],[1, 1, 0],[1, 0, 0]]])O = Block("yellow", [[[1, 1],[1, 1]]])T = Block("magenta", [[[0, 0, 0],[0, 1, 0],[1, 1, 1]],[[0, 1, 0],[1, 1, 0],[0, 1, 0]],[[0, 0, 0],[1, 1, 1],[0, 1, 0]],[[1, 0, 0],[1, 1, 0],[1, 0, 0]]])

 四.定义了一些游戏相关的全局变量

定义了一些游戏相关的全局变量,如方块大小、地图大小、地图起始坐标、分数等

tile_size = 25
map_rows = 20
map_cols = 10
map_x = -125
map_y = 250

五.创建了几个Turtle对象

用于在屏幕上绘制地图、方块、分数和游戏结束信息

map_turtle = turtle.Turtle()
map_turtle.hideturtle()
map_turtle.up()game_map = [["" for _ in range(map_cols)] for _ in range(map_rows)]active_block = None
active_block_row = 0
active_block_col = 0
active_block_index = 0block_turtle = turtle.Turtle()
block_turtle.hideturtle()
block_turtle.up()game_update_interval = 250score = 0
score_turtle = turtle.Turtle()
score_turtle.hideturtle()
score_turtle.up()
score_turtle.goto(170, 210)
score_turtle.write("Score: " + str(score), font=("Calibri", 20, "bold"))game_over_turtle = turtle.Turtle()
game_over_turtle.hideturtle()
game_over_turtle.color("red")

六.定义函数

(1)draw_box函数

用于绘制方块

def draw_box(t, width, height, pencolor, fillcolor):t.color(pencolor, fillcolor)t.down()t.begin_fill()for _ in range(2):t.forward(width)t.right(90)t.forward(height)t.right(90)t.end_fill()t.up()

(2)draw_map函数

用于绘制地图

def draw_map():map_turtle.clear()for row in range(map_rows):for col in range(map_cols):map_turtle.goto(map_x + tile_size * col, map_y - tile_size * row)draw_box(map_turtle, tile_size, tile_size, "black",game_map[row][col].color if game_map[row][col] else "mintcream")

(3)make_new_block函数

用于生成新的方块

def make_new_block():global active_blockglobal active_block_row, active_block_colglobal active_block_indexactive_block = random.choice((I, J, L, S, Z, O, T))active_block_row = 0active_block_col = 4active_block_index = 0

(4)draw_block函数

用于绘制当前方块

def draw_block():block_turtle.clear()# Find the x and y position of the blockx = map_x + active_block_col * tile_sizey = map_y - active_block_row * tile_sizeblock_tiles = active_block.tiles[active_block_index]block_color = active_block.colorfor row in range(len(block_tiles)):for col in range(len(block_tiles[row])):if block_tiles[row][col] == 1:block_turtle.goto(x + col * tile_size, y - row * tile_size)draw_box(block_turtle, tile_size, tile_size, "black", block_color)

(5)is_valid_block函数

用于检查方块是否可以在当前位置放置

def is_valid_block(block_type, block_row, block_col, block_index):block_tiles = block_type.tiles[block_index]for row in range(len(block_tiles)):for col in range(len(block_tiles[row])):if block_tiles[row][col] == 1:if block_row + row not in range(0, map_rows):return Falseif block_col + col not in range(0, map_cols):return Falseif game_map[block_row + row][block_col + col] != "":return Falsereturn True

(6)set_block_on_map函数

用于将方块固定到地图上

def set_block_on_map():block_tiles = active_block.tiles[active_block_index]for row in range(len(block_tiles)):for col in range(len(block_tiles[row])):if block_tiles[row][col] == 1:game_map[active_block_row + row][active_block_col + col] = active_blockdraw_map()r = 0

(7)remove_completed_rows函数

用于移除完成的行,并更新分数和游戏难度

def remove_completed_rows():global game_mapglobal scoreglobal game_update_intervalglobal rnew_map = []for row in range(len(game_map)):game_row = game_map[row]if "" in game_row:new_map.append(game_row)else:score += 10score_turtle.clear()score_turtle.write("Score: " + str(score), font=("Calibri", 20, "bold"))r += 1if r == 5:game_update_interval = int(game_update_interval / 1.1)r = 0for row in range(0, map_rows - len(new_map)):game_row = ["" for _ in range(map_cols)]new_map.insert(0, game_row)game_map = new_mapdraw_map()# Task: increase the score and difficulty when a row is completedpause = False

 七.定义了一个游戏循环

用于控制游戏的主要逻辑,如方块的移动、旋转、下落

 设置了键盘事件监听,用于处理玩家的输入,如旋转、移动、加速下落和暂停游戏

def game_loop():global active_block, active_block_rowif active_block is None:make_new_block()if not is_valid_block(active_block, active_block_row, active_block_col, active_block_index):active_block = Nonegame_over_turtle.write("Game over!", align="center", font=("Calibri", 60, "bold"))returndraw_block()else:if is_valid_block(active_block, active_block_row + 1, active_block_col, active_block_index):if not pause:active_block_row += 1draw_block()else:set_block_on_map()active_block = Noneremove_completed_rows()turtle.update()# Set the next updateturtle.ontimer(game_loop, game_update_interval)# Set up the turtle window
turtle.setup(800, 600)
turtle.title("Tetris")
turtle.bgcolor("navajowhite")
turtle.up()
turtle.hideturtle()
turtle.tracer(False)# Draw the background border around the map
turtle.goto(map_x - 10, map_y + 10)
draw_box(turtle, tile_size * map_cols + 20, tile_size * map_rows + 20, \"", "lightslategray")# Draw the empty map in the window
draw_map()
turtle.update()# Set up the game loop
turtle.ontimer(game_loop, game_update_interval)def rotate():global active_block_indexif active_block is None:returnnew_block_index = (active_block_index + 1) % len(active_block.tiles)if is_valid_block(active_block, active_block_row, active_block_col, new_block_index):active_block_index = new_block_indexdraw_block()turtle.onkeypress(rotate, "Up")def move_left():global active_block_colif active_block is None:returnif is_valid_block(active_block, active_block_row, active_block_col - 1, active_block_index):active_block_col -= 1draw_block()turtle.onkeypress(move_left, "Left")def move_right():global active_block_colif active_block is None:returnif is_valid_block(active_block, active_block_row, active_block_col + 1, active_block_index):active_block_col += 1draw_block()turtle.onkeypress(move_right, "Right")def drop():global active_block_rowif active_block is None:returnwhile is_valid_block(active_block, active_block_row + 1, active_block_col, active_block_index):active_block_row += 1draw_block()turtle.onkeypress(drop, "Down")def pause_game():global pausepause = not pauseturtle.onkeypress(pause_game, "space")def change_block_type():global active_blockglobal active_block_indexnew_block = random.choice((I, J, L, S, Z, O, T))new_block_index = 0if is_valid_block(new_block, active_block_row, active_block_col, new_block_index):active_block = new_blockactive_block_index = new_block_indexdraw_block()turtle.onkeypress(change_block_type, "c")turtle. Listen()

八.启动游戏

turtle.done()

全部代码

代码来自微信公众号python顾木子吖 感兴趣的小伙伴可以关注一下

import turtle
import randomclass Block:def __init__(self, color, tiles):self.color = colorself.tiles = tilesI = Block("cyan", [[[1, 0, 0, 0],[1, 0, 0, 0],[1, 0, 0, 0],[1, 0, 0, 0]],[[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[1, 1, 1, 1]]])J = Block("blue", [[[0, 1, 0],[0, 1, 0],[1, 1, 0]],[[0, 0, 0],[1, 1, 1],[0, 0, 1]],[[1, 1, 0],[1, 0, 0],[1, 0, 0]],[[0, 0, 0],[1, 0, 0],[1, 1, 1]]])L = Block("orange", [[[1, 0, 0],[1, 0, 0],[1, 1, 0]],[[0, 0, 0],[0, 0, 1],[1, 1, 1]],[[0, 1, 1],[0, 0, 1],[0, 0, 1]],[[0, 0, 0],[1, 1, 1],[1, 0, 0]]])S = Block("lime", [[[0, 0, 0],[0, 1, 1],[1, 1, 0]],[[1, 0, 0],[1, 1, 0],[0, 1, 0]]])Z = Block("red", [[[0, 0, 0],[1, 1, 0],[0, 1, 1]],[[0, 1, 0],[1, 1, 0],[1, 0, 0]]])O = Block("yellow", [[[1, 1],[1, 1]]])T = Block("magenta", [[[0, 0, 0],[0, 1, 0],[1, 1, 1]],[[0, 1, 0],[1, 1, 0],[0, 1, 0]],[[0, 0, 0],[1, 1, 1],[0, 1, 0]],[[1, 0, 0],[1, 1, 0],[1, 0, 0]]])tile_size = 25
map_rows = 20
map_cols = 10
map_x = -125
map_y = 250map_turtle = turtle.Turtle()
map_turtle.hideturtle()
map_turtle.up()game_map = [["" for _ in range(map_cols)] for _ in range(map_rows)]active_block = None
active_block_row = 0
active_block_col = 0
active_block_index = 0block_turtle = turtle.Turtle()
block_turtle.hideturtle()
block_turtle.up()game_update_interval = 250score = 0
score_turtle = turtle.Turtle()
score_turtle.hideturtle()
score_turtle.up()
score_turtle.goto(170, 210)
score_turtle.write("Score: " + str(score), font=("Calibri", 20, "bold"))game_over_turtle = turtle.Turtle()
game_over_turtle.hideturtle()
game_over_turtle.color("red")def draw_box(t, width, height, pencolor, fillcolor):t.color(pencolor, fillcolor)t.down()t.begin_fill()for _ in range(2):t.forward(width)t.right(90)t.forward(height)t.right(90)t.end_fill()t.up()def draw_map():map_turtle.clear()for row in range(map_rows):for col in range(map_cols):map_turtle.goto(map_x + tile_size * col, map_y - tile_size * row)draw_box(map_turtle, tile_size, tile_size, "black",game_map[row][col].color if game_map[row][col] else "mintcream")def make_new_block():global active_blockglobal active_block_row, active_block_colglobal active_block_indexactive_block = random.choice((I, J, L, S, Z, O, T))active_block_row = 0active_block_col = 4active_block_index = 0def draw_block():block_turtle.clear()# Find the x and y position of the blockx = map_x + active_block_col * tile_sizey = map_y - active_block_row * tile_sizeblock_tiles = active_block.tiles[active_block_index]block_color = active_block.colorfor row in range(len(block_tiles)):for col in range(len(block_tiles[row])):if block_tiles[row][col] == 1:block_turtle.goto(x + col * tile_size, y - row * tile_size)draw_box(block_turtle, tile_size, tile_size, "black", block_color)def is_valid_block(block_type, block_row, block_col, block_index):block_tiles = block_type.tiles[block_index]for row in range(len(block_tiles)):for col in range(len(block_tiles[row])):if block_tiles[row][col] == 1:if block_row + row not in range(0, map_rows):return Falseif block_col + col not in range(0, map_cols):return Falseif game_map[block_row + row][block_col + col] != "":return Falsereturn Truedef set_block_on_map():block_tiles = active_block.tiles[active_block_index]for row in range(len(block_tiles)):for col in range(len(block_tiles[row])):if block_tiles[row][col] == 1:game_map[active_block_row + row][active_block_col + col] = active_blockdraw_map()r = 0def remove_completed_rows():global game_mapglobal scoreglobal game_update_intervalglobal rnew_map = []for row in range(len(game_map)):game_row = game_map[row]if "" in game_row:new_map.append(game_row)else:score += 10score_turtle.clear()score_turtle.write("Score: " + str(score), font=("Calibri", 20, "bold"))r += 1if r == 5:game_update_interval = int(game_update_interval / 1.1)r = 0for row in range(0, map_rows - len(new_map)):game_row = ["" for _ in range(map_cols)]new_map.insert(0, game_row)game_map = new_mapdraw_map()# Task: increase the score and difficulty when a row is completedpause = Falsedef game_loop():global active_block, active_block_rowif active_block is None:make_new_block()if not is_valid_block(active_block, active_block_row, active_block_col, active_block_index):active_block = Nonegame_over_turtle.write("Game over!", align="center", font=("Calibri", 60, "bold"))returndraw_block()else:if is_valid_block(active_block, active_block_row + 1, active_block_col, active_block_index):if not pause:active_block_row += 1draw_block()else:set_block_on_map()active_block = Noneremove_completed_rows()turtle.update()# Set the next updateturtle.ontimer(game_loop, game_update_interval)# Set up the turtle window
turtle.setup(800, 600)
turtle.title("Tetris")
turtle.bgcolor("navajowhite")
turtle.up()
turtle.hideturtle()
turtle.tracer(False)# Draw the background border around the map
turtle.goto(map_x - 10, map_y + 10)
draw_box(turtle, tile_size * map_cols + 20, tile_size * map_rows + 20, \"", "lightslategray")# Draw the empty map in the window
draw_map()
turtle.update()# Set up the game loop
turtle.ontimer(game_loop, game_update_interval)def rotate():global active_block_indexif active_block is None:returnnew_block_index = (active_block_index + 1) % len(active_block.tiles)if is_valid_block(active_block, active_block_row, active_block_col, new_block_index):active_block_index = new_block_indexdraw_block()turtle.onkeypress(rotate, "Up")def move_left():global active_block_colif active_block is None:returnif is_valid_block(active_block, active_block_row, active_block_col - 1, active_block_index):active_block_col -= 1draw_block()turtle.onkeypress(move_left, "Left")def move_right():global active_block_colif active_block is None:returnif is_valid_block(active_block, active_block_row, active_block_col + 1, active_block_index):active_block_col += 1draw_block()turtle.onkeypress(move_right, "Right")def drop():global active_block_rowif active_block is None:returnwhile is_valid_block(active_block, active_block_row + 1, active_block_col, active_block_index):active_block_row += 1draw_block()turtle.onkeypress(drop, "Down")def pause_game():global pausepause = not pauseturtle.onkeypress(pause_game, "space")def change_block_type():global active_blockglobal active_block_indexnew_block = random.choice((I, J, L, S, Z, O, T))new_block_index = 0if is_valid_block(new_block, active_block_row, active_block_col, new_block_index):active_block = new_blockactive_block_index = new_block_indexdraw_block()turtle.onkeypress(change_block_type, "c")turtle.listen()turtle.done()

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

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

相关文章

docker通过容器id查看运行命令;Portainer监控管理docker容器

1、docker通过容器id查看运行命令 参考:https://blog.csdn.net/a772304419/article/details/138732138 docker inspect 运行镜像id“Cmd”: [ “–model”, “/qwen-7b”, “–port”, “10860”, “–max-model-len”, “4096”, “–trust-remote-code”, “–t…

C# Winform内嵌窗体(在主窗体上显示子窗体)

在开发Winform项目中,经常会要切换不同的窗体。通常程序都有一个主窗体,在切换窗体时往往需要关闭其他子窗体,这个实例就来介绍MDI主窗体内嵌子窗体的实现方法。 MDI主窗体要设置一个比较重要的属性,IsMdiContainertrue。子窗体的…

论文阅读——ApeGNN- Node-Wise Adaptive Aggregation in GNNs for Recommendation

ApeGNN: Node-Wise Adaptive Aggregation in GNNs for Recommendation ApeGNN:GNN 中的节点自适应聚合以进行推荐 Abstract 近年来,图神经网络(GNN)在推荐方面取得了长足的进步。基于 GNN 的推荐系统的核心机制是迭代聚合用户-…

ThinkPHP 的老漏洞仍然被攻击者钟情

研究人员发现安全领域出现了令人不安的趋势:攻击者不仅对新披露的漏洞十分感兴趣,对已知的漏洞也丝毫不放过,尽管有些漏洞已经存在了好些年头,攻击者仍然能够通过老漏洞成功完成攻击。 典型的例子就是 ThinkPHP 远程代码执行漏洞…

轨迹优化 | 图解欧氏距离场与梯度场算法(附ROS C++/Python实现)

目录 0 专栏介绍1 什么是距离场?2 欧氏距离场计算原理3 双线性插值与欧式梯度场4 仿真实现4.1 ROS C实现4.2 Python实现 0 专栏介绍 🔥课程设计、毕业设计、创新竞赛、学术研究必备!本专栏涉及更高阶的运动规划算法实战:曲线生成…

[Linux] Linux三剑客使用手册

一 作用 三者的功能都是处理文本,但侧重点各不相同。 grep更适合单纯的查找或匹配文本sed更适合编辑匹配到的文本awk功能最强大,但也最复杂。awk更适合格式化文本,对文本进行较复杂格式处理。 二 grep 2.1 命令格式 grep [option] patter…

深度学习之激活函数

激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式。在神经元中,输入的input经过一系列加权求和后作用于另一个函数,这个函数就是这里的激活函数。 1. 为什么需要激活…

【odoo | SQL】odoo使用sql语句操作数据库

概要 Odoo的SQL指的是在Odoo框架内使用SQL语句直接操作数据库。这些操作通常是通过Odoo提供的数据库游标(self.env.cr)来执行的。虽然Odoo主要鼓励使用其ORM(对象关系映射)来进行数据库操作,因为ORM更安全、易维护且与…

深入解析:数据库连接池的必要性与优化策略

引言 在现代的应用程序架构中,数据库连接池已成为提升性能和资源管理的关键组件。想象一下,如果没有连接池,每次用户请求都需建立新的数据库连接,这将是多么低效且资源浪费的场景。本文将深入探讨数据库连接池的必要性&#xff0…

configs

configs 部分 python import os # 导入os模块,用于系统级操作 emotion ["Valence"] # 定义情绪列表,只包含情绪维度"Valence" # 配置参数字典 config { "extract_class_label": 1, # 是否提取类别标签 &q…

鸿蒙开发:【线程模型】

线程模型 线程类型 Stage模型下的线程主要有如下三类: 主线程 执行UI绘制。管理主线程的ArkTS引擎实例,使多个UIAbility组件能够运行在其之上。管理其他线程的ArkTS引擎实例,例如使用TaskPool(任务池)创建任务或取消…

数据持久层与 SQL 注入

使用 ORM(Object/Relation Mapping)框架对 SQL 注入是有积极意义的。我们知道对抗 SQL 注入的最佳方式就是使用“预编译绑定变量”。在实际解决 SQL 注入时,还有一个难点就 是应用复杂后,代码数量庞大,难以把可能存在 …

示例:WPF中应用MarkupExtention自定义IValueConverter

一、目的:应用MarkupExtention定义IValueConverter,使得应用起来更简单和高效 二、实现 public abstract class MarkupValueConverterBase : MarkupExtension, IValueConverter{public abstract object Convert(object value, Type targetType, object …

数字化转型对企业有什么价值?

数字化转型对企业有什么价值? 1. 信息共享 很多业务设计和管理规划,通常需要综合多个业务部门和业务专题的数据。 如果企业的数据和信息在位置分布上非常分散,就很难充分利用企业积累的数据资源,并将其用于有效的管理决策和业务…

《java 编程基础》试题

2023-2024 学年第二学期《java 编程基础》试题 系 班 姓名 学号 (说明:本试卷共五大题,共 2 页,满分100分,答题时间90分钟。) 开卷考试:要求书写答案在纸上。 一、单…

零基础直接上手java跨平台桌面程序,使用javafx(七)用户操作界面探讨,这个系列结束

GUI&#xff0c;我们还是喜欢web。如果javafx有像wpf的WebView2差不多的功能&#xff0c;我们就开心了scene builder中拖出一个webview&#xff0c;然后再回到代码中。发现<?import javafx.scene.web.*?>是红色的&#xff0c;我们缺少配置。于是在pom.xml中添加JavaFX依…

Spring (63)CORS,如何在Spring中配置它

CORS简介 CORS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨源资源共享&#xff09;是一种机制&#xff0c;它使用额外的HTTP头来告诉浏览器让运行在一个origin&#xff08;源&#xff09;上的Web应用被准许访问来自不同源服务器上的指定资源。当一个资源从与该资…

Google ghOSt 调度器分析(2)

调度器分析 *ghOSt* 调度干预过程1. 内核相关介绍2. 干预过程ghOSt 调度干预过程 1. 内核相关介绍 下面先来介绍以下 ghost 调度类相关的内容。 ghost 调度类 ghost 调度器在内核中新建了两个调度类: ghost_agent 调度类 ghost 调度类 ghost 调度类与其他调度类的优先级关系…

Nodejs 第七十七章(MQ高级)

MQ介绍和基本使用在75章介绍过了&#xff0c;不再重复 MQ高级用法-延时消息 什么是延时消息? Producer 将消息发送到 MQ 服务端&#xff0c;但并不期望这条消息立马投递&#xff0c;而是延迟一定时间后才投递到 Consumer 进行消费&#xff0c;该消息即延时消息 插件安装 R…

【康复学习--LeetCode每日一题】521. 最长特殊序列 Ⅰ

题目&#xff1a; 给你两个字符串 a 和 b&#xff0c;请返回 这两个字符串中 最长的特殊序列 的长度。如果不存在&#xff0c;则返回 -1 。 「最长特殊序列」 定义如下&#xff1a;该序列为 某字符串独有的最长 子序列 &#xff08;即不能是其他字符串的子序列&#xff09; 。…