用python制作俄罗斯方块

这篇具有很好参考价值的文章主要介绍了用python制作俄罗斯方块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码如下,可以直接运行:文章来源地址https://www.toymoban.com/news/detail-510055.html

import random, pygame, sys, ctypes
from pygame.locals import *

FPS = 60
CELL_SIZE = 20
CELLS_WIDE = 16
CELLS_HIGH = 24

GRID = []
for x in range(CELLS_WIDE):
    GRID.append([None] * CELLS_HIGH)

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
DARKGRAY = (40, 40, 40)
BGCOLOR = BLACK
GRID_LINES_COLOR = DARKGRAY

WINDOWWIDTH = CELL_SIZE * CELLS_WIDE
WINDOWHEIGHT = CELL_SIZE * CELLS_HIGH

DEFAULT_SPEED = 650

G_BLOCK = [
    [[0, 1, 0], [1, 1, 0], [1, 0, 0]],
    [[2, 0, 0], [2, 2, 0], [0, 2, 0]],
    [[3, 3, 0], [0, 3, 0], [0, 3, 0]],
    [[4, 4, 0], [4, 0, 0], [4, 0, 0]],
    [[0, 5, 0], [5, 5, 5], [0, 0, 0]],
    [[6, 6], [6, 6]],
    [[7, 0, 0, 0], [7, 0, 0, 0], [7, 0, 0, 0], [7, 0, 0, 0]],
]

BLOCK_COLOR = [(255, 0, 0), (255, 165, 0), (255, 255, 0), (0, 255, 0), (0, 127, 255), (0, 0, 255), (139, 0, 255)]


class Block():
    def __init__(self, _type=None, speed=None):
        if _type is None:
            self._type = random.randint(0, 6)
        else:
            self._type = _type

        if speed is None:
            self.speed = DEFAULT_SPEED
        else:
            self.speed = speed

        self.block = G_BLOCK[self._type]
        self._len = len(self.block)
        self.pos = []
        for i in range(self._len):
            self.pos.append([7, -1 * (i + 1)])

    def drop(self):
        if self.isStop():
            return False

        setBlock(True)

        for pos in iter(self.pos):
            pos[1] += 1

        pygame.time.wait(self.speed)
        return True

    def isStop(self):
        skip = []
        for i in range(self._len):
            if self.pos[i][1] < 0:
                continue
            layer = self.block[self._len - i - 1]
            for j, _type in enumerate(layer):
                pos = [self.pos[i][0] + j, self.pos[i][1]]
                if (_type != 0 and pos[1] + 1 in (-1, CELLS_HIGH)) or (
                        j not in skip and _type != 0 and GRID[pos[0]][pos[1] + 1]):
                    return True
                if _type != 0:
                    skip.append(j)

        return False

    def move(self, is_right=False):
        x = self.pos[0][0]
        for i, layer in enumerate(self.block):
            if self.pos[i][1] >= CELLS_HIGH:
                continue
            for j, _type in enumerate(layer):
                if _type == 0:
                    continue
                if is_right:
                    if x + j + 1 in (-1, CELLS_WIDE) or GRID[x + j + 1][self.pos[i][1]]:
                        return
                else:
                    if x + j - 1 in (-1, CELLS_WIDE) or GRID[x + j - 1][self.pos[i][1]]:
                        return

        setBlock(True)
        for pos in iter(self.pos):
            if is_right:
                pos[0] += 1
            else:
                pos[0] -= 1

        if self.pos[0][1] >= CELLS_HIGH - 1:
            setBlock(False)

    def change(self):
        if self._type == 5:
            return

        new_block = []
        if self._type == 0 or self._type == 1 or self._type == 6:
            if self.block != G_BLOCK[self._type]:
                new_block = G_BLOCK[self._type]
        if len(new_block) == 0:
            for i in range(self._len):
                new_block.append([])
            for i in range(self._len - 1, -1, -1):
                for j, _type in enumerate(self.block[i]):
                    new_block[j].append(_type)

        tmp_pos = []
        for i, layer in enumerate(self.block):
            for j, _type in enumerate(layer):
                if _type != 0:
                    tmp_pos.append([self.pos[self._len - i - 1][0] + j, self.pos[self._len - i - 1][1]])
        x = self.pos[0][0]
        for i, layer in enumerate(new_block):
            for j, _type in enumerate(layer):
                if _type == 0:
                    continue
                if [x + j, self.pos[i][1]] in tmp_pos:
                    continue
                if x + j in (-1, CELLS_WIDE) or GRID[x + j][self.pos[i][1]]:
                    return

        setBlock(True)
        self.block = new_block


def setBlock(clear_old):
    for i, pos in enumerate(g_block.pos):
        if pos[1] < 0:
            continue
        block = g_block.block[g_block._len - i - 1]
        for j, _type in enumerate(block):
            if _type != 0:
                if clear_old:
                    GRID[pos[0] + j][pos[1]] = None
                else:
                    GRID[pos[0] + j][pos[1]] = BLOCK_COLOR[_type - 1]


def checkCleanLine():
    clean_row = 0
    for i in range(CELLS_HIGH - 1, -1, -1):
        flag = True
        for j in range(CELLS_WIDE - 1, -1, -1):
            if GRID[j][i + clean_row] is None:
                flag = False
                break

        if flag:
            for j in range(CELLS_WIDE - 1, -1, -1):
                GRID[j].pop(i + clean_row)
                GRID[j].insert(0, None)
            clean_row += 1


def gameOver():
    ctypes.windll.user32.MessageBoxA(0, "Don't lose heart, try it again", 'Game Over', 0)


def handleEvents():
    for event in pygame.event.get():  # event handling loop
        if (event.type == QUIT) or (event.type == KEYDOWN and event.key == K_ESCAPE):
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN or event.type == KEYUP:
            handleControl(event)


def handleControl(event):
    if event.type == KEYDOWN:
        if event.key == K_LEFT:
            g_block.move()
        elif event.key == K_RIGHT:
            g_block.move(True)
        elif event.key == K_SPACE or event.key == K_UP:
            g_block.change()
        elif event.key == K_DOWN:
            g_block.speed -= 600
    elif event.type == KEYUP and event.key == K_DOWN:
        g_block.speed = DEFAULT_SPEED


def drawGrid():
    DISPLAYSURF.fill(BGCOLOR)
    for x in range(0, WINDOWWIDTH, CELL_SIZE):
        pygame.draw.line(DISPLAYSURF, GRID_LINES_COLOR, (x, 0), (x, WINDOWHEIGHT))
    for y in range(0, WINDOWHEIGHT, CELL_SIZE):
        pygame.draw.line(DISPLAYSURF, GRID_LINES_COLOR, (0, y), (WINDOWWIDTH, y))
    for x in range(0, CELLS_WIDE):
        for y in range(0, CELLS_HIGH):
            if GRID[x][y] is None:
                continue
            color = GRID[x][y]
            darkerColor = (max(color[0] - 50, 0), max(color[1] - 50, 0), max(color[2] - 50, 0))
            pygame.draw.rect(DISPLAYSURF, darkerColor, (x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE))
            pygame.draw.rect(DISPLAYSURF, color, (x * CELL_SIZE + 4, y * CELL_SIZE + 4, CELL_SIZE - 8, CELL_SIZE - 8))


def main():
    global FPSCLOCK, DISPLAYSURF
    global g_block

    pygame.init()
    FPSCLOCK = pygame.time.Clock()
    DISPLAYSURF = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT))
    pygame.display.set_caption('Tetris')

    g_block = Block(6)

    while True:
        handleEvents()

        if not g_block.drop():
            checkCleanLine()
            del g_block
            g_block = Block(6)

        setBlock(False)
        drawGrid()

        pygame.display.update()
        FPSCLOCK.tick(FPS)


if __name__ == '__main__':
    main()

到了这里,关于用python制作俄罗斯方块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于Python+Pygame实现一个俄罗斯方块小游戏【完整代码】

    俄罗斯方块,一款起源于上世纪80年代的经典电子游戏,凭借简单的规则和独特的魅力,一跃成为全球家喻户晓的经典。你知道其实只需要一些基础的编程知识,就可以自己实现它吗?今天,我们将使用Python的Pygame库,一步步带你构建属于自己的俄罗斯方块小游戏! 游戏初始

    2024年02月04日
    浏览(50)
  • Javascript 俄罗斯方块 游戏代码

    本俄罗斯方块代码采用 JavaScript 脚本代码写成,简单易懂; 全代码采用静态类及静态变量成员组成; 全脚本通过实现代码全局配置 OLSFK.Options = {...} 定义方块起始坐标及定义各自的旋转点; 从初始化俄罗斯方块界面开始,再监听键盘事件;以及左右,向下及旋转动作判断,

    2024年02月07日
    浏览(48)
  • 经典俄罗斯方块代码(转javascript代码)

    在网上发现一篇60行javascript超经典俄罗斯方块代码,值得学习,转为Delphi如下,有详细注释,不再另讲解:

    2024年01月20日
    浏览(40)
  • 免费分享一套Python俄罗斯方块源码 PyQt5俄罗斯方块源码,太好玩了~

    大家好,我是java1234_小锋老师,看到一个不错的Python俄罗斯方块源码 PyQt5俄罗斯方块源码,分享下哈。 【免费】Python俄罗斯方块源码 PyQt5俄罗斯方块源码 Python小游戏源码_哔哩哔哩_bilibili 【免费】Python俄罗斯方块源码 PyQt5俄罗斯方块源码 Python小游戏源码项目来自互联网,免

    2024年01月25日
    浏览(47)
  • Python课程设计之俄罗斯方块

    点击查看 点击下载 Python课程设计之俄罗斯方块 软件需求 :Python环境 压缩包内含 :源代码、打包好的可执行文件、文档报告 (1)、搭建基础窗体 使用tkinter实现基础窗体。 运行代码生成窗口如下 接下来需要在窗体里面,添加一个画布容器用来“装”俄罗斯方块,就是让这

    2024年02月09日
    浏览(51)
  • python基础项目实战-俄罗斯方块

    一、俄罗斯方块游戏设计分析: 俄罗斯方块是一款风靡全球,从一开始到现在都一直经久不衰的电脑、手机、掌上游戏机产品,是一款游戏规则简单,但又不缺乏乐趣的简单经典小游戏,上手容易,适用范围广泛,人所共知。俄罗斯方块游戏基本规则是油4个小方块组成的7种不

    2024年02月12日
    浏览(44)
  • 用python写一个俄罗斯方块程序

    2024年04月23日
    浏览(40)
  • 俄罗斯方块游戏设计与实现(Python)

    目录 第一章 绪论 1 1.1 任务概述 1 1.1.1 软件功能 1 1.1.2 运行环境 1 1.2 需求分析 3 1.2.1 游戏界面 3 1.2.2 菜单操作 3 1.2.3 游戏操作 3 1.3 设计目的 4 第二章 相关技术及开发工具 5 2.1 python介绍 5 2.2 python发展历史 6 2.3 python特点 6 2.4 python开发环境构建 7 第三章 概要设计 8 3.1 程序流程

    2024年02月02日
    浏览(66)
  • Java实现俄罗斯方块小游戏。(附完整源代码)

    大家好,我是百思不得小赵。 创作时间:2022 年 5 月 12 日 博客主页: 🔍点此进入博客主页 —— 新时代的农民工 🙊 —— 换一种思维逻辑去看待这个世界 👀 今天是加入CSDN的第1167天。觉得有帮助麻烦👏点赞、🍀评论、❤️收藏 目录 一、游戏背景 二、功能实现 三、效果

    2024年02月03日
    浏览(72)
  • Python课程设计 基于python的俄罗斯方块小游戏

    目录 基于python的俄罗斯方块小游戏 1.概述 1.1 摘要 1.2 开发背景 1.3 开发环境 1.4 实现功能 2.代码描述 2.1 模块导入 2.2 初始化变量 2.3 播放音乐 2.4 创建方块类 2.5 绘制游戏地图 2.6 游戏初始化 2.7 绘制有边框矩形 2.8 绘制我的文字 2.9 游戏主体 2.10 主程序运行 3.运行效果 4.注

    2024年02月22日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包