目录

  • 实现效果
  • 实现思路
  • 实现代码
  • 总结

欢迎关注 『Python黑科技』 系列,持续更新中
欢迎关注 『Python黑科技』 系列,持续更新中

实现效果


实现思路

  • 空间――由 15*25 个空格组成

  • 盒子――组成方块的其中小方块,是组成方块的基本单元。

  • 方块――从边框顶掉下的东西,游戏者可以翻转和改变位置。每个方块由 4 个盒子组成。

  • 预设的方块类型――不同类型的方块。这里形状的名字被叫做 T, S, Z ,J, L, I , O。

  • 通过左右的箭头进行控制左右位移,上下箭头控制顺时针逆时针的翻转。

实现代码

需要准备一个方圆体.ttc文件

链接: https://pan.baidu.com/s/1ld0yqhJ_wETv2UtIghEXSQ?pwd=7djn
提取码: 7djn

# @Time    : 2022/2/9 20:16
# @Author  : 南黎
# @FileName: 俄罗斯方块.pyimport pygame
import random
import ospygame.init()GRID_WIDTH = 20
GRID_NUM_WIDTH = 15
GRID_NUM_HEIGHT = 25
WIDTH, HEIGHT = GRID_WIDTH * GRID_NUM_WIDTH, GRID_WIDTH * GRID_NUM_HEIGHT
SIDE_WIDTH = 200
SCREEN_WIDTH = WIDTH + SIDE_WIDTH
WHITE = (0xff, 0xff, 0xff)
BLACK = (0, 0, 0)
LINE_COLOR = (0x33, 0x33, 0x33)CUBE_COLORS = [(0xcc, 0x99, 0x99), (0xff, 0xff, 0x99), (0x66, 0x66, 0x99),(0x99, 0x00, 0x66), (0xff, 0xcc, 0x00), (0xcc, 0x00, 0x33),(0xff, 0x00, 0x33), (0x00, 0x66, 0x99), (0xff, 0xff, 0x33),(0x99, 0x00, 0x33), (0xcc, 0xff, 0x66), (0xff, 0x99, 0x00)
]screen = pygame.display.set_mode((SCREEN_WIDTH, HEIGHT))
pygame.display.set_caption("俄罗斯方块")
clock = pygame.time.Clock()
FPS = 30score = 0
level = 1screen_color_matrix = [[None] * GRID_NUM_WIDTH for i in range(GRID_NUM_HEIGHT)]# 设置游戏的根目录为当前文件夹
base_folder = os.path.dirname(__file__)def show_text(surf, text, size, x, y, color=WHITE):font_name = os.path.join(base_folder, '方圆体.ttc')font = pygame.font.Font(font_name, size)text_surface = font.render(text, True, color)text_rect = text_surface.get_rect()text_rect.midtop = (x, y)surf.blit(text_surface, text_rect)class CubeShape(object):SHAPES = ['I', 'J', 'L', 'O', 'S', 'T', 'Z']I = [[(0, -1), (0, 0), (0, 1), (0, 2)],[(-1, 0), (0, 0), (1, 0), (2, 0)]]J = [[(-2, 0), (-1, 0), (0, 0), (0, -1)],[(-1, 0), (0, 0), (0, 1), (0, 2)],[(0, 1), (0, 0), (1, 0), (2, 0)],[(0, -2), (0, -1), (0, 0), (1, 0)]]L = [[(-2, 0), (-1, 0), (0, 0), (0, 1)],[(1, 0), (0, 0), (0, 1), (0, 2)],[(0, -1), (0, 0), (1, 0), (2, 0)],[(0, -2), (0, -1), (0, 0), (-1, 0)]]O = [[(0, 0), (0, 1), (1, 0), (1, 1)]]S = [[(-1, 0), (0, 0), (0, 1), (1, 1)],[(1, -1), (1, 0), (0, 0), (0, 1)]]T = [[(0, -1), (0, 0), (0, 1), (-1, 0)],[(-1, 0), (0, 0), (1, 0), (0, 1)],[(0, -1), (0, 0), (0, 1), (1, 0)],[(-1, 0), (0, 0), (1, 0), (0, -1)]]Z = [[(0, -1), (0, 0), (1, 0), (1, 1)],[(-1, 0), (0, 0), (0, -1), (1, -1)]]SHAPES_WITH_DIR = {'I': I, 'J': J, 'L': L, 'O': O, 'S': S, 'T': T, 'Z': Z}def __init__(self):self.shape = self.SHAPES[random.randint(0, len(self.SHAPES) - 1)]# 骨牌所在的行列self.center = (2, GRID_NUM_WIDTH // 2)self.dir = random.randint(0, len(self.SHAPES_WITH_DIR[self.shape]) - 1)self.color = CUBE_COLORS[random.randint(0, len(CUBE_COLORS) - 1)]def get_all_gridpos(self, center=None):curr_shape = self.SHAPES_WITH_DIR[self.shape][self.dir]if center is None:center = [self.center[0], self.center[1]]return [(cube[0] + center[0], cube[1] + center[1])for cube in curr_shape]def conflict(self, center):for cube in self.get_all_gridpos(center):# 超出屏幕之外,说明不合法if cube[0] < 0 or cube[1] < 0 or cube[0] >= GRID_NUM_HEIGHT or \cube[1] >= GRID_NUM_WIDTH:return True# 不为None,说明之前已经有小方块存在了,也不合法if screen_color_matrix[cube[0]][cube[1]] is not None:return Truereturn Falsedef rotate(self):new_dir = self.dir + 1new_dir %= len(self.SHAPES_WITH_DIR[self.shape])old_dir = self.dirself.dir = new_dirif self.conflict(self.center):self.dir = old_dirreturn Falsedef down(self):# import pdb; pdb.set_trace()center = (self.center[0] + 1, self.center[1])if self.conflict(center):return Falseself.center = centerreturn Truedef left(self):center = (self.center[0], self.center[1] - 1)if self.conflict(center):return Falseself.center = centerreturn Truedef right(self):center = (self.center[0], self.center[1] + 1)if self.conflict(center):return Falseself.center = centerreturn Truedef draw(self):for cube in self.get_all_gridpos():pygame.draw.rect(screen, self.color,(cube[1] * GRID_WIDTH, cube[0] * GRID_WIDTH,GRID_WIDTH, GRID_WIDTH))pygame.draw.rect(screen, WHITE,(cube[1] * GRID_WIDTH, cube[0] * GRID_WIDTH,GRID_WIDTH, GRID_WIDTH),1)def draw_grids():for i in range(GRID_NUM_WIDTH):pygame.draw.line(screen, LINE_COLOR,(i * GRID_WIDTH, 0), (i * GRID_WIDTH, HEIGHT))for i in range(GRID_NUM_HEIGHT):pygame.draw.line(screen, LINE_COLOR,(0, i * GRID_WIDTH), (WIDTH, i * GRID_WIDTH))pygame.draw.line(screen, WHITE,(GRID_WIDTH * GRID_NUM_WIDTH, 0),(GRID_WIDTH * GRID_NUM_WIDTH, GRID_WIDTH * GRID_NUM_HEIGHT))def draw_matrix():for i, row in zip(range(GRID_NUM_HEIGHT), screen_color_matrix):for j, color in zip(range(GRID_NUM_WIDTH), row):if color is not None:pygame.draw.rect(screen, color,(j * GRID_WIDTH, i * GRID_WIDTH,GRID_WIDTH, GRID_WIDTH))pygame.draw.rect(screen, WHITE,(j * GRID_WIDTH, i * GRID_WIDTH,GRID_WIDTH, GRID_WIDTH), 2)def draw_score():show_text(screen, u'得分:{}'.format(score), 20, WIDTH + SIDE_WIDTH // 2, 100)def remove_full_line():global screen_color_matrixglobal scoreglobal levelnew_matrix = [[None] * GRID_NUM_WIDTH for i in range(GRID_NUM_HEIGHT)]index = GRID_NUM_HEIGHT - 1n_full_line = 0for i in range(GRID_NUM_HEIGHT - 1, -1, -1):is_full = Truefor j in range(GRID_NUM_WIDTH):if screen_color_matrix[i][j] is None:is_full = Falsecontinueif not is_full:new_matrix[index] = screen_color_matrix[i]index -= 1else:n_full_line += 1score += n_full_linelevel = score // 20 + 1screen_color_matrix = new_matrixdef show_welcome(screen):show_text(screen, u'俄罗斯方块', 30, WIDTH / 2, HEIGHT / 2)show_text(screen, u'按任意键开始游戏', 20, WIDTH / 2, HEIGHT / 2 + 50)running = True
gameover = True
counter = 0
live_cube = None
while running:clock.tick(FPS)for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if gameover:gameover = Falselive_cube = CubeShape()breakif event.key == pygame.K_LEFT:live_cube.left()elif event.key == pygame.K_RIGHT:live_cube.right()elif event.key == pygame.K_DOWN:live_cube.down()elif event.key == pygame.K_UP:live_cube.rotate()elif event.key == pygame.K_SPACE:while live_cube.down() == True:passremove_full_line()# level 是为了方便游戏的难度,level 越高 FPS // level 的值越小# 这样屏幕刷新的就越快,难度就越大if gameover is False and counter % (FPS // level) == 0:# down 表示下移骨牌,返回False表示下移不成功,可能超过了屏幕或者和之前固定的# 小方块冲突了if live_cube.down() == False:for cube in live_cube.get_all_gridpos():screen_color_matrix[cube[0]][cube[1]] = live_cube.colorlive_cube = CubeShape()if live_cube.conflict(live_cube.center):gameover = Truescore = 0live_cube = Nonescreen_color_matrix = [[None] * GRID_NUM_WIDTH for i in range(GRID_NUM_HEIGHT)]# 消除满行remove_full_line()counter += 1# 更新屏幕screen.fill(BLACK)draw_grids()draw_matrix()draw_score()if live_cube is not None:live_cube.draw()if gameover:show_welcome(screen)pygame.display.update()

总结

大家喜欢的话,给个

【Python黑科技】tkinter库实战“俄罗斯方块”小游戏(保姆级图文+实现代码)相关推荐

  1. 【Python黑科技】tkinter库实战“连连看”小游戏(保姆级图文+实现代码)

    目录 实现效果 实现思路 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 实现思路 链接: https://pan.b ...

  2. 【Python黑科技】tkinter库实战“2048”小游戏(保姆级图文+实现代码)

    目录 实现效果 实现思路 接收玩家操作 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 实现思路 按上下左右移动方块. ...

  3. 【Python黑科技】获取每日一句美句,并定时发送邮件到指定邮箱(保姆级图文+实现代码)

    目录 实现效果 实现思路 1.获取每日一句美句 2.定时发送需要接入时间模块 3.邮件发送 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列, ...

  4. [Python] 黑白棋(翻转棋)小游戏

    [Python] 黑白棋(翻转棋)小游戏 游戏介绍 黑白棋(Reversi or Othello)在西方和日本很流行.游戏通过相互翻转对方的棋子,最后以棋盘上谁的棋子多来判断胜负. 规则 黑白棋的每颗 ...

  5. 【Python黑科技】tkinter库实战“贪吃蛇”小游戏(保姆级图文+实现代码)

    目录 实现效果 实现思路 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 实现思路 初始状态的蛇的长 3个像素点,食物 ...

  6. 【Python黑科技】tkinter库实战制作一个记事本(保姆级图文+实现代码)

    目录 实现效果 实现思路 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 实现思路 具有记事本的基本功能,可以另存为t ...

  7. 【Python黑科技】tkinter库实战制作一个计算器(保姆级图文+实现代码)

    目录 实现效果 实现思路 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 实现思路 图形界面=界面组件+组件的事件监听 ...

  8. 【Python黑科技】制作一个定时小闹钟,自动发送系统通知提示(保姆级图文+实现代码)

    目录 实现效果 图片素材和源码 实现思路 实现代码 总结 欢迎关注 『Python黑科技』 系列,持续更新中 欢迎关注 『Python黑科技』 系列,持续更新中 实现效果 图片素材和源码 已经上传至我 ...

  9. 【Python黑科技】常用的user_agent 浏览器头爬虫模拟用户(保姆级图文+实现代码)

    目录 1. 常用的浏览器请求头User-Agent 2. 随机获取一个浏览器头 3. 关于user_agent知识的介绍 一.基础知识篇: 1.浏览器标识 2.操作系统标识 3.加密等级标识 4.浏览 ...

最新文章

  1. 项目经理都在用什么项目管理工具?
  2. ubuntu 14.04 mysql 5.7_ubuntu14.04 升级mysql到5.7版本
  3. 按钮配置之自定义按钮使用(一)——JEPLUS软件快速开发平台
  4. .Net Core应用框架Util介绍(三)
  5. vue aplayer 进度条无法拖动_Vue-rideo-player视频播放插件的使用
  6. java中挂起和恢复,应用程序“未能及时恢复”并挂起
  7. python-视频分帧多帧合成视频
  8. C++之指针探究(二):一级指针和一维数组
  9. java四类八种基本数据类型
  10. mui的实例项目源码_Spring Boot 2.x 启动全过程源码分析
  11. 轴承后缀ce和ca_SKF各类型轴承后缀含义
  12. win10本机计算机策略,Win10怎么打开本地安全策略_Win10本地安全策略在哪?-192路由网...
  13. js、Java的url参数转码(url里中文、特殊符号参数转码)
  14. 【JAVASCRIPT】-【AES加密解密】01、前端AES加密解密的方式
  15. webp图片文件无需转换直接下载成JPG或者gif等其他格式的方法
  16. 网络安全 Windows用户密码破解 使用破解MD5值的在线网站和监听工具Cain
  17. 360 腾讯 迅雷Windows编程 网络编程面试题及答案
  18. Java后台代码word转pdf文件下载(类库参考)附jar包
  19. swoole-面向连接(tcp)的心跳检测和合包分包
  20. 文本对比。文本编辑距离算法

热门文章

  1. 如何给使用 i 标签放图标 文字类型图标
  2. APS.NET MVC + EF (01)---Linq和Lambda表达式
  3. PMBOK#项目进度管理
  4. 高级网管网上培训班即将开课
  5. 2007人类还有什么未解之谜
  6. 浅谈制药行业的MES制造执行系统
  7. 使用lxml+xpath解析html页面
  8. SPOJ7258 SUBLEX - Lexicographical Substring Search
  9. SPOJ7258--SUBLEX(SAM)
  10. 生肖迷宫之福娃吃蛋糕问题