我的编程空间,编程开发者的网络收藏夹
学习永远不晚

python基于pygame实现俄罗斯方块的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

python基于pygame实现俄罗斯方块的方法

小编给大家分享一下python基于pygame实现俄罗斯方块的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

一、简单说明

90后的小伙伴都玩过“俄罗斯方块”,那种“叱咤风云”场景 偶尔闪现在脑海 真的是太爽了;如果没有来得及玩过的同学,这次可以真正的自己做一个了

本实例用的是Python3(当然了Python3.5 3.6 3.7....都行 )+ pygame实现的

运行之前需要安装pygame模块,安装命令如下

pip install pygame -i https://mirrors.aliyun.com/pypi/simple/

二、运行效果

python基于pygame实现俄罗斯方块的方法

python基于pygame实现俄罗斯方块的方法

三、完整代码

文件main.py代码如下:

"""作者:it项目实例网更多项目实例,请访问:www.itprojects.cn"""import randomimport sysimport timeimport pygamefrom blocks import block_s, block_i, block_j, block_l, block_o, block_t, block_zSCREEN_WIDTH, SCREEN_HEIGHT = 450, 750BG_COLOR = (40, 40, 60) # 背景色BLOCK_COL_NUM = 10 # 每行的方格数SIZE = 30 # 每个小方格大小BLOCK_ROW_NUM = 25 # 每列的方个数BORDER_WIDTH = 4 # 游戏区边框宽度RED = (200, 30, 30) # 红色,GAME OVER 的字体颜色def judge_game_over(stop_all_block_list): """ 判断游戏是否结束 """ if "O" in stop_all_block_list[0]:  return Truedef change_speed(score): speed_level = [("1", 0.5, 0, 20), ("2", 0.4, 21, 50), ("3", 0.3, 51, 100), ("4", 0.2, 101, 200), ("5", 0.1, 201, None)] for speed_info, speed, score_start, score_stop in speed_level:  if score_stop and score_start <= score <= score_stop:   return speed_info, speed  elif score_stop is None and score >= score_start:   return speed_info, speeddef judge_lines(stop_all_block_list): """ 判断是否有同一行的方格,如果有则消除 """ # 记录刚刚消除的行数 move_row_list = list() # 消除满格的行 for row, line in enumerate(stop_all_block_list):  if "." not in line:   # 如果这一行没有. 那么就意味着全部是O,则消除这一行   stop_all_block_list[row] = ['.' for _ in range(len(line))]   move_row_list.append(row) # 如果没有满格的行,则结束此函数 if not move_row_list:  return 0 # 移动剩余的行到下一行 for row in move_row_list:  stop_all_block_list.pop(row)  stop_all_block_list.insert(0, ['.' for _ in range(len(line))]) return len(move_row_list) * 10def add_to_stop_all_block_list(stop_all_block_list, current_block, current_block_start_row, current_block_start_col): """ 将当前已经停止移动的block添加到列表中 """ for row, line in enumerate(current_block):  for col, block in enumerate(line):   if block != '.':    stop_all_block_list[current_block_start_row + row][current_block_start_col + col] = "O"def change_current_block_style(current_block): """ 改变图形的样式 """ # 计算出,当前图形样式属于哪个图形 current_block_style_list = None for block_style_list in [block_s, block_i, block_j, block_l, block_o, block_t, block_z]:  if current_block in block_style_list:   current_block_style_list = block_style_list # 得到当前正在用的图形的索引(下标) index = current_block_style_list.index(current_block) # 它的下一个图形的索引 index += 1 # 防止越界 index = index % len(current_block_style_list) # 返回下一个图形 return current_block_style_list[index]def judge_move_right(current_block, current_block_start_col): """ 判断是否可以向右移动 """ # 先判断列的方式是从右到左 for col in range(len(current_block[0]) - 1, -1, -1):  # 得到1列的所有元素  col_list = [line[col] for line in current_block]  # 判断是否碰到右边界  if 'O' in col_list and current_block_start_col + col >= BLOCK_COL_NUM:   return False return Truedef judge_move_left(current_block, current_block_start_col): """ 判断是否可以向左移动 """ # 先判断列的方式是从左到右 for col in range(len(current_block[0])):  # 得到1列的所有元素  col_list = [line[col] for line in current_block]  # 判断是否碰到右边界  if 'O' in col_list and current_block_start_col + col < 0:   return False return Truedef judge_move_down(current_block, current_block_start_row, current_block_start_col, stop_all_block_list): """ 判断是否碰撞到其它图形或者底边界 """ # 得到其它图形所有的坐标 stop_all_block_position = list() for row, line in enumerate(stop_all_block_list):  for col, block in enumerate(line):   if block != ".":    stop_all_block_position.append((row, col)) # print(stop_all_block_position) # 判断碰撞 for row, line in enumerate(current_block):  if 'O' in line and current_block_start_row + row >= BLOCK_ROW_NUM:   # 如果当前行有0,且从起始行开始算+当前显示的行,超过了总行数,那么就认为碰到了底部   return False  for col, block in enumerate(line):   if block != "." and (current_block_start_row + row, current_block_start_col + col) in stop_all_block_position:    return False return Truedef get_block(): """ 创建一个图形 """ block_style_list = random.choice([block_s, block_i, block_j, block_l, block_o, block_t, block_z]) return random.choice(block_style_list)def main(): pygame.init() screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption('俄罗斯方块') current_block = get_block() # 当前图形 current_block_start_row = -2 # 当前图片从哪一行开始显示图形 current_block_start_col = 4 # 当前图形从哪一列开始显示 next_block = get_block() # 下一个图形 last_time = time.time() speed = 0.5 # 降落的速度 speed_info = '1' # 显示的速度等级 # 定义一个列表,用来存储所有的已经停止移动的形状 stop_all_block_list = [['.' for i in range(BLOCK_COL_NUM)] for j in range(BLOCK_ROW_NUM)] # 字体 font = pygame.font.Font('yh.ttf', 24) # 黑体24 game_over_font = pygame.font.Font("yh.ttf", 72) game_over_font_width, game_over_font_height = game_over_font.size('GAME OVER') game_again_font_width, game_again_font_height = font.size('鼠标点击任意位置,再来一局') # 得分 score = 0 # 标记游戏是否结束 game_over = False # 创建计时器(防止while循环过快,占用太多CPU的问题) clock = pygame.time.Clock() while True:  for event in pygame.event.get():   if event.type == pygame.QUIT:    sys.exit()   elif event.type == pygame.KEYDOWN:    if event.key == pygame.K_LEFT:     if judge_move_left(current_block, current_block_start_col - 1):      current_block_start_col -= 1    elif event.key == pygame.K_RIGHT:     if judge_move_right(current_block, current_block_start_col + 1):      current_block_start_col += 1    elif event.key == pygame.K_UP:     current_block_next_style = change_current_block_style(current_block)     if judge_move_left(current_block_next_style, current_block_start_col) and \       judge_move_right(current_block_next_style, current_block_start_col) and \       judge_move_down(current_block, current_block_start_row, current_block_start_col, stop_all_block_list):      # 判断新的样式没有越界      current_block = current_block_next_style    elif event.key == pygame.K_DOWN:     # 判断是否可以向下移动,如果碰到底部或者其它的图形就不能移动了     if judge_move_down(current_block, current_block_start_row + 1, current_block_start_col, stop_all_block_list):      current_block_start_row += 1   elif event.type == pygame.MOUSEBUTTONDOWN and event.button:    if game_over:     # 重置游戏用到的变量     current_block = get_block() # 当前图形     current_block_start_row = -2 # 当前图片从哪一行开始显示图形     current_block_start_col = 4 # 当前图形从哪一列开始显示     next_block = get_block() # 下一个图形     stop_all_block_list = [['.' for i in range(BLOCK_COL_NUM)] for j in range(BLOCK_ROW_NUM)]     score = 0     game_over = False  # 判断是否修改当前图形显示的起始行  if not game_over and time.time() - last_time > speed:   last_time = time.time()   # 判断是否可以向下移动,如果碰到底部或者其它的图形就不能移动了   if judge_move_down(current_block, current_block_start_row + 1, current_block_start_col, stop_all_block_list):    current_block_start_row += 1   else:    # 将这个图形存储到统一的列表中,这样便于判断是否成为一行    add_to_stop_all_block_list(stop_all_block_list, current_block, current_block_start_row, current_block_start_col)    # 判断是否有同一行的,如果有就消除,且加上分数    score += judge_lines(stop_all_block_list)    # 判断游戏是否结束(如果第一行中间有O那么就表示游戏结束)    game_over = judge_game_over(stop_all_block_list)    # 调整速度    speed_info, speed = change_speed(score)    # 创建新的图形    current_block = next_block    next_block = get_block()    # 重置数据    current_block_start_col = 4    current_block_start_row = -2  # 画背景(填充背景色)  screen.fill(BG_COLOR)  # 画游戏区域分隔线  pygame.draw.line(screen, (100, 40, 200), (SIZE * BLOCK_COL_NUM, 0), (SIZE * BLOCK_COL_NUM, SCREEN_HEIGHT), BORDER_WIDTH)  # 显示当前图形  for row, line in enumerate(current_block):   for col, block in enumerate(line):    if block != '.':     pygame.draw.rect(screen, (20, 128, 200), ((current_block_start_col + col) * SIZE, (current_block_start_row + row) * SIZE, SIZE, SIZE), 0)  # 显示所有停止移动的图形  for row, line in enumerate(stop_all_block_list):   for col, block in enumerate(line):    if block != '.':     pygame.draw.rect(screen, (20, 128, 200), (col * SIZE, row * SIZE, SIZE, SIZE), 0)  # 画网格线 竖线  for x in range(BLOCK_COL_NUM):   pygame.draw.line(screen, (0, 0, 0), (x * SIZE, 0), (x * SIZE, SCREEN_HEIGHT), 1)  # 画网格线 横线  for y in range(BLOCK_ROW_NUM):   pygame.draw.line(screen, (0, 0, 0), (0, y * SIZE), (BLOCK_COL_NUM * SIZE, y * SIZE), 1)  # 显示右侧(得分、速度、下一行图形)  # 得分  score_show_msg = font.render('得分: ', True, (255, 255, 255))  screen.blit(score_show_msg, (BLOCK_COL_NUM * SIZE + 10, 10))  score_show_msg = font.render(str(score), True, (255, 255, 255))  screen.blit(score_show_msg, (BLOCK_COL_NUM * SIZE + 10, 50))  # 速度  speed_show_msg = font.render('速度: ', True, (255, 255, 255))  screen.blit(speed_show_msg, (BLOCK_COL_NUM * SIZE + 10, 100))  speed_show_msg = font.render(speed_info, True, (255, 255, 255))  screen.blit(speed_show_msg, (BLOCK_COL_NUM * SIZE + 10, 150))  # 下一个图形(文字提示)  next_style_msg = font.render('下一个: ', True, (255, 255, 255))  screen.blit(next_style_msg, (BLOCK_COL_NUM * SIZE + 10, 200))  # 下一个图形(图形)  for row, line in enumerate(next_block):   for col, block in enumerate(line):    if block != '.':     pygame.draw.rect(screen, (20, 128, 200), (320 + SIZE * col, (BLOCK_COL_NUM + row) * SIZE, SIZE, SIZE), 0)     # 显示这个方格的4个边的颜色     # 左     pygame.draw.line(screen, (0, 0, 0), (320 + SIZE * col, (BLOCK_COL_NUM + row) * SIZE), (320 + SIZE * col, (BLOCK_COL_NUM + row + 1) * SIZE), 1)     # 上     pygame.draw.line(screen, (0, 0, 0), (320 + SIZE * col, (BLOCK_COL_NUM + row) * SIZE), (320 + SIZE * (col + 1), (BLOCK_COL_NUM + row) * SIZE), 1)     # 下     pygame.draw.line(screen, (0, 0, 0), (320 + SIZE * col, (BLOCK_COL_NUM + row + 1) * SIZE), (320 + SIZE * (col + 1), (BLOCK_COL_NUM + row + 1) * SIZE), 1)     # 右     pygame.draw.line(screen, (0, 0, 0), (320 + SIZE * (col + 1), (BLOCK_COL_NUM + row) * SIZE), (320 + SIZE * (col + 1), (BLOCK_COL_NUM + row + 1) * SIZE), 1)  # 显示游戏结束画面  if game_over:   game_over_tips = game_over_font.render('GAME OVER', True, RED)   screen.blit(game_over_tips, ((SCREEN_WIDTH - game_over_font_width) // 2, (SCREEN_HEIGHT - game_over_font_height) // 2))   # 显示"鼠标点击任意位置,再来一局"   game_again = font.render('鼠标点击任意位置,再来一局', True, RED)   screen.blit(game_again, ((SCREEN_WIDTH - game_again_font_width) // 2, (SCREEN_HEIGHT - game_again_font_height) // 2 + 80))  # 刷新显示(此时窗口才会真正的显示)  pygame.display.update()  # FPS(每秒钟显示画面的次数)  clock.tick(60) # 通过一定的延时,实现1秒钟能够循环60次if __name__ == '__main__': main()

文件blocks.py代码如下:

# S形方块block_s = [['.OO',   'OO.',   '...'],   ['O..',   'OO.',   '.O.']]# Z形方块block_z = [['OO.',   '.OO',   '...'],   ['.O.',   'OO.',   'O..']]# I型方块block_i = [['.O..',   '.O..',   '.O..',   '.O..'],   ['....',   '....',   'OOOO',   '....']]# O型方块block_o = [['OO',   'OO']]# J型方块block_j = [['O..',   'OOO',   '...'],   ['.OO',   '.O.',   '.O.'],   ['...',   'OOO',   '..O'],   ['.O.',   '.O.',   'OO.']]# L型方块block_l = [['..O',   'OOO',   '...'],   ['.O.',   '.O.',   '.OO'],   ['...',   'OOO',   'O..'],   ['OO.',   '.O.',   '.O.']]# T型方块block_t = [['.O.',   'OOO',   '...'],   ['.O.',   '.OO',   '.O.'],   ['...',   'OOO',   '.O.'],   ['.O.',   'OO.',   '.O.']]

看完了这篇文章,相信你对“python基于pygame实现俄罗斯方块的方法”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

python基于pygame实现俄罗斯方块的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python基于pygame实现俄罗斯方块的方法

小编给大家分享一下python基于pygame实现俄罗斯方块的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、简单说明80、90后的小伙伴都玩过“俄罗斯方块”,那种“叱咤风云”场景 偶尔闪现在脑海 真的是太爽了;如果
2023-06-06

Python+Pygame实战之俄罗斯方块游戏的实现

俄罗斯方块,作为是一款家喻户晓的游戏,陪伴70、80甚至90后,度过无忧的儿时岁月,它上手简单能自由组合、拼接技巧也很多。本文就来用Python中的Pygame模块实现这一经典游戏,需要的可以参考一下
2022-12-28

基于Python实现俄罗斯方块躲闪小游戏

这篇文章主要为大家详细介绍了如何基于Python实现有趣的俄罗斯方块躲闪小游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
2023-05-15

Python写的俄罗斯方块

在公司实习。公司推崇Python和Django框架,所以也得跟着学点。简单瞅了下Tkinter,和Canvas配合在一起,还算是简洁的界面开发API。threading.Thread创建新的线程,其多线程机制也算是方便。只是canvas.c
2023-01-31

基于Python怎么实现俄罗斯方块躲闪小游戏

这篇“基于Python怎么实现俄罗斯方块躲闪小游戏”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于Python怎么实现俄罗
2023-07-05

Html5中基于canvas实现原创俄罗斯方块的示例

这篇文章将为大家详细讲解有关Html5中基于canvas实现原创俄罗斯方块的示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。第一次写俄罗斯方块的时候已经是1年多前了,也是我刚刚学js不久。为了加强对js
2023-06-09

shell实现俄罗斯方块脚本

本文实例为大家分享了shell实现俄罗斯方块的具体代码,供大家参考,具体内容如下 draw 是画出图形界面,keytest是获取键盘,tetris是整个游戏 tetris.sh#!/bin/bash APP_NAME="${0##*[\\/
2022-06-04

基于Matlab实现俄罗斯方块游戏的代码怎么写

本篇内容介绍了“基于Matlab实现俄罗斯方块游戏的代码怎么写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!游戏效果完整代码function
2023-06-29

怎么在Python中利用Pygame实现一个俄罗斯方块游戏

今天就跟大家聊聊有关怎么在Python中利用Pygame实现一个俄罗斯方块游戏,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。源码:# coding : utf-8#: pip ins
2023-06-06

python是怎么实现简单的俄罗斯方块

本篇文章为大家展示了python是怎么实现简单的俄罗斯方块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬
2023-06-26

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录