iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python是怎么实现简单的俄罗斯方块
  • 284
分享到

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

2023-06-26 06:06:12 284人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

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

本篇文章为大家展示了python是怎么实现简单的俄罗斯方块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Python主要用来做什么

Python主要应用于:1、web开发;2、数据科学研究;3、网络爬虫;4、嵌入式应用开发;5、游戏开发;6、桌面应用开发。

1. 案例介绍

俄罗斯方块是由 4 个小方块组成不同形状的板块,随机从屏幕上方落下,按方向键调整板块的位置和方向,在底部拼出完整的一行或几行。这些完整的横条会消失,给新落下来的板块腾出空间,并获得分数奖励。没有被消除掉的方块不断堆积,一旦堆到顶端,便告输,游戏结束。本例难度为高级,适合具有 Python 进阶和 Pygame 编程技巧的用户学习

2. 设计要点

边框――由 15*25 个空格组成,方块就落在这里面。盒子――组成方块的其中小方块,是组成方块的基本单元。方块――从边框顶掉下的东西,游戏者可以翻转和改变位置。每个方块由 4 个盒子组成。形状――不同类型的方块。这里形状的名字被叫做 T, S, Z ,J, L, I , O。如下图所示:

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

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

模版――用一个列表存放形状被翻转后的所有可能样式。全部存放在变量里,变量名字如 S or J。着陆――当一个方块到达边框的底部或接触到在其他的盒子话,就说这个方块着陆了。那样的话,另一个方块就会开始下落。

3. 示例效果

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

4. 示例源码

import pygameimport randomimport os pygame.init() GRID_WIDTH = 20GRID_NUM_WIDTH = 15GRID_NUM_HEIGHT = 25WIDTH, HEIGHT = GRID_WIDTH * GRID_NUM_WIDTH, GRID_WIDTH * GRID_NUM_HEIGHTSIDE_WIDTH = 200SCREEN_WIDTH = WIDTH + SIDE_WIDTHWHITE = (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 = 30 score = 0level = 1 screen_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, 'font/font.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 True        return False    def rotate(self):        new_dir = self.dir + 1        new_dir %= len(self.SHAPES_WITH_DIR[self.shape])        old_dir = self.dir        self.dir = new_dir        if self.conflict(self.center):            self.dir = old_dir            return False    def down(self):        # import pdb; pdb.set_trace()        center = (self.center[0] + 1, self.center[1])        if self.conflict(center):            return False        self.center = center        return True    def left(self):        center = (self.center[0], self.center[1] - 1)        if self.conflict(center):            return False        self.center = center        return True    def right(self):        center = (self.center[0], self.center[1] + 1)        if self.conflict(center):            return False        self.center = center        return True    def 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_matrix    global score    global level    new_matrix = [[None] * GRID_NUM_WIDTH for i in range(GRID_NUM_HEIGHT)]    index = GRID_NUM_HEIGHT - 1    n_full_line = 0    for i in range(GRID_NUM_HEIGHT - 1, -1, -1):        is_full = True        for j in range(GRID_NUM_WIDTH):            if screen_color_matrix[i][j] is None:                is_full = False                continue        if not is_full:            new_matrix[index] = screen_color_matrix[i]            index -= 1        else:            n_full_line += 1    score += n_full_line    level = score // 20 + 1    screen_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 = Truegameover = Truecounter = 0live_cube = Nonewhile running:    clock.tick(FPS)    for event in pygame.event.get():        if event.type == pygame.QUIT:            running = False        elif event.type == pygame.KEYDOWN:            if gameover:                gameover = False                live_cube = CubeShape()                break            if 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:                    pass            remove_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.color            live_cube = CubeShape()            if live_cube.conflict(live_cube.center):                gameover = True                score = 0                live_cube = None                screen_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是怎么实现简单的俄罗斯方块,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网Python频道。

--结束END--

本文标题: python是怎么实现简单的俄罗斯方块

本文链接: https://www.lsjlt.com/news/307173.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • python是怎么实现简单的俄罗斯方块
    本篇文章为大家展示了python是怎么实现简单的俄罗斯方块,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬...
    99+
    2023-06-26
  • python实现简单的俄罗斯方块
    本文实例为大家分享了python实现简单的俄罗斯方块的具体代码,供大家参考,具体内容如下 1. 案例介绍 俄罗斯方块是由 4 个小方块组成不同形状的板块,随机从屏幕上方落下,按方向键...
    99+
    2024-04-02
  • python是怎么实现简单俄罗斯方块游戏
    本篇文章为大家展示了python是怎么实现简单俄罗斯方块游戏,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pyth...
    99+
    2023-06-26
  • python实现简单俄罗斯方块游戏
    本文实例为大家分享了python实现简单俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 import pygame,sys,random,time all_block = [[...
    99+
    2024-04-02
  • java实现简单的俄罗斯方块
    本文实例为大家分享了java实现简单俄罗斯方块的具体代码,供大家参考,具体内容如下 结合网上的资料刚做完课程设计,具体代码如下: public class TetrisPanel e...
    99+
    2024-04-02
  • Python实现简单的俄罗斯方块游戏
    本文实例为大家分享了Python实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 玩法:童年经典,普通模式没啥意思,小时候我们都是玩加速的。 源码分享: import o...
    99+
    2024-04-02
  • python写一个简单的俄罗斯方块
    # teris.py# A module for game teris.# By programmer FYJfrom tkinter import *from time import sleepfrom random import *f...
    99+
    2023-01-31
    俄罗斯方块 简单 python
  • Java实现俄罗斯方块游戏简单版
    本文实例为大家分享了Java实现俄罗斯方块游戏的具体代码,供大家参考,具体内容如下 游戏页面效果如下: 俄罗斯方块游戏本身的逻辑: 俄罗斯方块游戏的逻辑是比较简单的。它就类似于堆砌...
    99+
    2024-04-02
  • Java怎样实现俄罗斯方块游戏简单版
    这篇文章给大家介绍Java怎样实现俄罗斯方块游戏简单版,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。游戏页面效果如下:俄罗斯方块游戏本身的逻辑:俄罗斯方块游戏的逻辑是比较简单的。它就类似于堆砌房子一样,各种各样的方地形...
    99+
    2023-06-26
  • Qt实现俄罗斯方块
    本文实例为大家分享了Qt实现俄罗斯方块,供大家参考,具体内容如下 最近在学习Qt,用它来进行图形界面的开发还是很方便的,想着做一个小游戏来锻炼一下自己,就想到了小时候玩的俄罗斯方块。...
    99+
    2024-04-02
  • Python写的俄罗斯方块
    在公司实习。公司推崇Python和Django框架,所以也得跟着学点。 简单瞅了下Tkinter,和Canvas配合在一起,还算是简洁的界面开发API。threading.Thread创建新的线程,其多线程机制也算是方便。 只是canva...
    99+
    2023-01-31
    俄罗斯方块 Python
  • c语言俄罗斯方块怎么实现
    在C语言中实现俄罗斯方块游戏需要用到控制台字符界面和一些基本的游戏逻辑。以下是一个简单的实现思路: 界面设计:使用控制台字符来表示...
    99+
    2024-04-02
  • C++实现俄罗斯方块源码
    本文实例为大家分享了C++实现俄罗斯方块的具体代码,供大家参考,具体内容如下 先是效果图: 主菜单: 游戏: 设置: 错误处理: 代码: #include <ios...
    99+
    2024-04-02
  • python基于pygame实现俄罗斯方块的方法
    小编给大家分享一下python基于pygame实现俄罗斯方块的方法,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、简单说明90后的小伙伴都玩过“俄罗斯方块”,那种“叱咤风云”场景 偶尔闪现在脑海 真的是太爽了;如果没有来...
    99+
    2023-06-06
  • C++实现俄罗斯方块小游戏
    本文实例为大家分享了C++实现俄罗斯方块小游戏的具体代码,供大家参考,具体内容如下 操作说明: D F:左右旋转 J  L:左右移动 E(一堆键都行): 加快下落速度 空格...
    99+
    2024-04-02
  • 怎么用Javascript实现俄罗斯方块游戏
    这篇文章主要介绍“怎么用Javascript实现俄罗斯方块游戏”,在日常操作中,相信很多人在怎么用Javascript实现俄罗斯方块游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • HTML5怎么实现WebGL 3D版俄罗斯方块
    今天小编给大家分享一下HTML5怎么实现WebGL 3D版俄罗斯方块的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下...
    99+
    2024-04-02
  • Java实现俄罗斯方块的代码怎么写
    本文小编为大家详细介绍“Java实现俄罗斯方块的代码怎么写”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java实现俄罗斯方块的代码怎么写”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。具体实现代码: ...
    99+
    2023-06-30
  • Python+Pygame实战之俄罗斯方块游戏的实现
    目录导语一、运行环境二、代码展示三、效果展示导语 俄罗斯方块,作为是一款家喻户晓的游戏,陪伴70、80甚至90后,度过无忧的儿时岁月 它上手简单能自由组合、拼接技巧也很多。 你知道么...
    99+
    2022-12-28
    Python Pygame俄罗斯方块游戏 Python 俄罗斯方块 Python Pygame 游戏
  • C/C++实现俄罗斯方块游戏
    目录一、游戏效果展示二、完整代码三、所需开发环境四、具体项目实现①游戏欢迎界面 welcome( )②游戏背景 initGameScreen( ) ③方块表示 int bl...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作