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

游戏展示

一.导包

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 专栏介绍 🔥课程设计、毕业设计、创新竞赛、学术研究必备!本专栏涉及更高阶的运动规划算法实战:曲线生成…

深度学习之激活函数

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

鸿蒙开发:【线程模型】

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

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

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

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

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

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

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

Nodejs 第七十七章(MQ高级)

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

[C++] 从零实现一个ping服务

&#x1f4bb;文章目录 前言ICMP概念报文格式 Ping服务实现系统调用函数具体实现运行测试 总结 前言 ping命令&#xff0c;因为其简单、易用等特点&#xff0c;几乎所有的操作系统都内置了一个ping命令。如果你是一名C初学者&#xff0c;对网络编程、系统编程有所了解&#xff…

学会python——读取大文本文件(python实例六)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、读取大文本文件 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强…

电脑内存怎么看?5个秘诀,轻松查看内存!

“新买了一台电脑&#xff0c;想查看一下我电脑的内存&#xff0c;大家可以分享一下查看方法吗&#xff1f;” 当我们谈论电脑的性能时&#xff0c;内存无疑是一个不容忽视的关键组件。然而&#xff0c;对于许多普通用户来说&#xff0c;如何查看电脑内存的大小、类型以及使用情…

跳舞电动机器人单片机方案

这款机器人形状智能电子玩具是一款集娱乐、教育和互动于一身的高科技产品。它的主要功能包括&#xff1a; 1、智能对话&#xff1a;机器人可以进行简单的对话&#xff0c;回答用户的问题&#xff0c;提供有趣的互动体验。 2、前进、后退、左转、右转、滑行&#xff1a;机器人…

BERT报错记录

一、加载数据集下载失败 报错&#xff1a; TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应&#xff0c;连接尝试失败。urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x00000241F9AD4…

Element UI 一键校验多表单(v-for循环表单,异步校验规则,v-for 中的 ref 属性,避坑 forEach 不支持异步 await )

需求描述 表单为数组 v-for 循环得到的多表单&#xff0c;如可自由增删的动态表单表单中存在异步校验规则&#xff0c;如姓名需访问接口校验是否已存在点击提交按钮&#xff0c;需一键校验所有表单&#xff0c;仅当所有表单都通过校验&#xff0c;才能最终提交到后台 效果预览 …

亚马逊新店如何实现高效流量转化?自养号测评深度解析与实用策略

在亚马逊平台上&#xff0c;自养号测评是一种通过卖家自行控制的海外买家账号对商品进行评价的方法&#xff0c;旨在提高商品的排名和流量。 亚马逊的自养号测评是指卖家通过使用在海外真实环境注册的买家账号&#xff0c;代替真实买家对商品进行测评。账号由卖家自己管理&…

电子传真怎么在国产系统上使用?一文看懂网络传真信创方案

国产化浪潮正在逐步深入&#xff0c;越来越多的企业开始关注如何在国产系统上高效、安全地使用办公软件&#xff0c;电子传真系统也不例外。 作为网络电子传真领域的重要品牌&#xff0c;EastFax也对原Windows电子传真系统进行了信创改造&#xff0c;全面支持国产化操作系统、…

串扰(一)

一、说明 串扰应该算比较常见的信号完整性问题了&#xff0c;一般是指由于走线较近&#xff0c;传输信号时在临线上产生耦合噪声的现象。串扰的原因是由于电场和磁场的耦合&#xff0c;我们经常用耦合电容和耦合电感模型进行问题分析。 本文是基于被攻击线阻抗匹配的情形下计…