python游戏实战项目之俄罗斯方块的魅力

目录
  • 导语
  • 正文
  • 效果图:
  • ​总结

导语

为什么有这么一个简单的游戏?这个游戏如此受欢迎?

仅仅是因为它在游戏行业异常匮乏的年代出现,从而成为了一代人的记忆吗?恐怕并不是。

玩过俄罗斯方块的人都明白,它给人的感觉就像是嗑瓜子一样,一旦开始就会像上瘾一样难以停下来,绞尽脑汁只想填满空缺的地方。

哈哈哈!小编每周的话基本上都会整理一些游戏代码的哈!

这一期文章就带大家来开发一款俄罗斯方块小游戏!

正文

游戏规则:由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。

这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。

(1)游戏定义,俄罗斯方块儿的不同的类型:

class tetrisShape():
    def __init__(self, shape=0):
        # 空块
        self.shape_empty = 0
        # 一字型块
        self.shape_I = 1
        # L型块
        self.shape_L = 2
        # 向左的L型块
        self.shape_J = 3
        # T型块
        self.shape_T = 4
        # 田字型块
        self.shape_O = 5
        # 反向Z型块
        self.shape_S = 6
        # Z型块
        self.shape_Z = 7

(2)​获得该形状当前旋转状态的四个小方块的相对坐标分布:

def getRotatedRelativeCoords(self, direction):
        # 初始分布
        if direction == 0 or self.shape == self.shape_O:
            return self.relative_coords
        # 逆时针旋转90度
        if direction == 1:
            return [[-y, x] for x, y in self.relative_coords]
        # 逆时针旋转180度
        if direction == 2:
            if self.shape in [self.shape_I, self.shape_Z, self.shape_S]:
                return self.relative_coords
            else:
                return [[-x, -y] for x, y in self.relative_coords]
        # 逆时针旋转270度
        if direction == 3:
            if self.shape in [self.shape_I, self.shape_Z, self.shape_S]:
                return [[-y, x] for x, y in self.relative_coords]
            else:
                return [[y, -x] for x, y in self.relative_coords]

(3)游戏的方块儿可以向不同方向移动:​

'''向右移动'''
    def moveRight(self):
        if self.ableMove([self.current_coord[0] + 1, self.current_coord[1]]):
            self.current_coord[0] += 1
    '''向左移动'''
    def moveLeft(self):
        if self.ableMove([self.current_coord[0] - 1, self.current_coord[1]]):
            self.current_coord[0] -= 1
    '''顺时针转'''
    def rotateClockwise(self):
        if self.ableMove(self.current_coord, (self.current_direction - 1) % 4):
            self.current_direction = (self.current_direction-1) % 4
    '''逆时针转'''
    def rotateAnticlockwise(self):
        if self.ableMove(self.current_coord, (self.current_direction + 1) % 4):
            self.current_direction = (self.current_direction+1) % 4
    '''向下移动'''
    def moveDown(self):
        removed_lines = 0
        if self.ableMove([self.current_coord[0], self.current_coord[1] + 1]):
            self.current_coord[1] += 1
        else:
            x_min, x_max, y_min, y_max = self.current_tetris.getRelativeBoundary(self.current_direction)
            # 简单起见, 有超出屏幕就判定游戏结束
            if self.current_coord[1] + y_min < 0:
                self.is_gameover = True
                return removed_lines
            self.mergeTetris()
            removed_lines = self.removeFullLines()
            self.createNewTetris()
        return removed_lines
    '''坠落'''
    def dropDown(self):
        removed_lines = 0
        while self.ableMove([self.current_coord[0], self.current_coord[1] + 1]):
            self.current_coord[1] += 1
        x_min, x_max, y_min, y_max = self.current_tetris.getRelativeBoundary(self.current_direction)
        # 简单起见, 有超出屏幕就判定游戏结束
        if self.current_coord[1] + y_min < 0:
            self.is_gameover = True
            return removed_lines
        self.mergeTetris()
        removed_lines = self.removeFullLines()
        self.createNewTetris()
        return removed_lines

(4)合并俄罗斯方块(最下面定型不能再动的那些):

    def mergeTetris(self):
        for x, y in self.current_tetris.getAbsoluteCoords(self.current_direction, self.current_coord[0], self.current_coord[1]):
            self.board_data[x + y * self.width] = self.current_tetris.shape
        self.current_coord = [-1, -1]
        self.current_direction = 0
        self.current_tetris = tetrisShape()

(5)当每行铺满之后会得分,相应的消失一行:

'''移出整行都有小方块的'''
    def removeFullLines(self):
        new_board_data = [0] * self.width * self.height
        new_y = self.height - 1
        removed_lines = 0
        for y in range(self.height - 1, -1, -1):
            cell_count = sum([1 if self.board_data[x + y * self.width] > 0 else 0 for x in range(self.width)])
            if cell_count < self.width:
                for x in range(self.width):
                    new_board_data[x + new_y * self.width] = self.board_data[x + y * self.width]
                new_y -= 1
            else:
                removed_lines += 1
        self.board_data = new_board_data
        return removed_lines

效果图:

​​​

​总结

哈哈哈!好啦!按住方向键也可以变形的哈!赶快试试~

到此这篇关于python游戏实战项目之俄罗斯方块的魅力的文章就介绍到这了,更多相关python 俄罗斯方块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python如何写个俄罗斯方块

    俄罗斯方块是俄罗斯人发明的一款休闲类的小游戏,这款小游戏可以说是很多人童年的主打电子游戏了,本文我们使用 Python 来实现这款小游戏. 游戏的基本规则是:移动.旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分. 实现 我们实现俄罗斯方块,主要用到的是 PyQt5 库,安装使用 pip install PyQt5 即可,游戏的组成比较简单,主要包括:主界面.各种方块和计分板,下面我们来看一下具体实现. 首先,我们来画一个主界面,主要实现代码如下: class MainB

  • Python Pygame实现俄罗斯方块

    本文实例为大家分享了Python Pygame实现俄罗斯方块的具体代码,供大家参考,具体内容如下 源码: # coding : utf-8 #: pip install pygame import random import sys import pygame #: 颜色定义 COLOR_WHITE = (255, 255, 255) COLOR_BLACK = (0, 0, 0) class Block: """小块""" width = 24

  • Python控制台输出俄罗斯方块的方法实例

    今天填一个坑,俄罗斯方块!! 俄罗斯方块的移动不难实现,但是旋转就不太容易实现,究其原因是因为Python中没有数组这种数据结构,所以不能用矩阵的公式.今天把旋转做出来了,刚好整理一下,把之前的都整合在一起 俄罗斯方块-打印 功能:输入字母,打印俄罗斯方块的*图形 # 尽可能吧俄罗斯方块放在中间 Tetris = {'L': [[1, 1], [1, 2], [1, 3], [2, 3]], 'O': [[1, 1], [2, 1], [1, 2], [2, 2]], 'J': [[2, 1],

  • Python控制台输出俄罗斯方块移动和旋转功能

    今天填一个坑,俄罗斯方块!! 俄罗斯方块的移动不难实现,但是旋转就不太容易实现,究其原因是因为Python中没有数组这种数据结构,所以不能用矩阵的公式.今天把旋转做出来了,刚好整理一下,把之前的都整合在一起 这两天浏览量有点离谱,说明一下,我没有使用pygame,只是在控制台可以打印.移动和旋转生成的俄罗斯方块星号图形 俄罗斯方块-打印 功能:输入字母,打印俄罗斯方块的*图形 # 尽可能吧俄罗斯方块放在中间 Tetris = {'L': [[1, 1], [1, 2], [1, 3], [2,

  • python 基于pygame实现俄罗斯方块

    一.简单说明 80.90后的小伙伴都玩过"俄罗斯方块",那种"叱咤风云"场景 偶尔闪现在脑海 真的是太爽了:如果没有来得及玩过的同学,这次可以真正的自己做一个了 本实例用的是Python3(当然了Python3.5 3.6 3.7....都行 )+ pygame实现的 运行之前需要安装pygame模块,安装命令如下 pip install pygame -i https://mirrors.aliyun.com/pypi/simple/ 二.运行效果 三.完整代码

  • python游戏实战项目之俄罗斯方块的魅力

    目录 导语 正文 效果图: ​总结 导语 ​ 为什么有这么一个简单的游戏?这个游戏如此受欢迎? 仅仅是因为它在游戏行业异常匮乏的年代出现,从而成为了一代人的记忆吗?恐怕并不是. 玩过俄罗斯方块的人都明白,它给人的感觉就像是嗑瓜子一样,一旦开始就会像上瘾一样难以停下来,绞尽脑汁只想填满空缺的地方. ​ 哈哈哈!小编每周的话基本上都会整理一些游戏代码的哈! 这一期文章就带大家来开发一款俄罗斯方块小游戏! 正文 游戏规则:由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,

  • python游戏实战项目之童年经典超级玛丽

    导语 "超级玛丽"--有多少人还记得这款经典游戏?那个戴帽子的大胡子穿着背带裤的马里奥! 带您重温经典的回忆,超级马里奥拯救不开心!炫酷来袭. 如果您的童年,也曾被魔性的 灯~灯灯~灯~灯灯~灯洗脑~那就来怀旧一番吧! 我是华丽的分割线------------------------------ 往期写过游戏实战已经积累到30几篇了哦~嘿嘿,推一波之前的,狗头保命.jpg. 欢迎大家来领免费的游戏,开玩啦~源码可以直接找我拿滴! 在座的各位大佬,你们都玩过这里面的几个游戏吖? ​ 往期

  • python游戏实战项目之智能五子棋简易版

    目录 导语 正文 总结 导语 前段时间不是制作了一款升级版本五子棋的嘛! 但是居然有粉丝私信我说: "准备拿到代码玩一下ok过去了!太难了准备放收藏夹落灰q@q~" 所噶,今天先放一个简易版本的五子棋给大家看看!学习嘛~从简单到难 还是慢慢来撒~ 学玩这篇可以学下一篇难一点的撒: Pygame实战:下五子棋吗?信不信我让你几步你也赢不了?​​​​​​​ 正文 嘿嘿!这五子棋只有人机对战了哈!不要看人机对战感觉很简单,其实代码量也超多滴. 主要代码:都有注释的撒!就不一步一步介绍了. i

  • python游戏实战项目之智能五子棋

    目录 导语 正文 总结 导语 ​ 今日游戏更新,大家好,我是木木子,每天都给大家更新最好玩的游戏!关注我,从此你再也不用去费力找游戏了! 最热门最好玩的Python游戏点击即玩! 今天推荐的游戏是五子棋小游戏--人机对战.联机对战皆可! 你是否还记得?中学时代和同桌下过的五子棋? ​ 这样下棋只怕是会被打!​!!!我怀疑他开挂了,并且找到了证据. ​ 正文 首先准备好需要的图片等素材部分如下: ​​​ 好了!直接上代码吧--设置游戏开始界面: class gameStartUI(QWidget)

  • Python爬虫实战项目掌握酷狗音乐的加密过程

    1.前言 小编在这里讲一下,下面的内容仅供学习参考,切莫用于商业活动,一经被相关人员发现,本小编概不负责!读者切记切记. 2.获取音乐播放列表 其实,这就是小编要讲的重点,因为就是这部分用到了加密. 我们在搜索栏上输入我们想听的音乐,小编输入:刺客 是不是看到了一系列音乐,怎样得到这些音乐的一些信息呢?(这里指的音乐信息是指音乐的hash值和音乐的album_id值[这两个参数在获取音乐的下载链接那里会用到],当然还包括音乐的名称[不然怎么区别呢?]). 由于这一系列音乐是动态加载出来的,也就是

  • Python PyQt5实战项目之文件拷贝器的具体实现详解

    目录 简介 UI设置 主要逻辑 信号与槽 成果展示 简介 写了一个简单的文件夹内容下所有文件复制到另一个文件夹内,主要逻辑代码是来自<2小时玩转python多线程编程>中的一个章节. UI设置 def ui_init(self): ''' 界面的函数 ''' self.setWindowTitle('拷贝器') self.resize(600,400) self.setMinimumSize(600,400) # 设置窗口的最小值 '''控件''' self.root_btn = QPushB

  • Python PyQt5实战项目之查询器的实现流程详解

    目录 简介 主界面 添加数据的界面 删除数据的界面 修改数据的界面 全部代码 展示 简介 这是一个操作数据库(sqlite3)的项目,用PyQt5进行界面封装. 此次项目最主要的是,主界面与子界面的交互,一个主界面与三个子界面交互 可以添加数据,修改数据,删除数据 主界面 class MainWidget(QMainWindow): def __init__(self): super(MainWidget,self).__init__() self.ui_init() self.connect_

  • Python PyQt5实战项目之网速监控器的实现

    目录 简介 psutil模块使用 主界面 网速线程 全部代码 成果展示 简介 看到了一个能够轻松实现获取系统运行的进程和系统利用率(包括CPU.内存.磁盘.网络等)信息的模块–psutil模块.这次利用psutil.net_io_counters()这个方法. psutil模块使用 >>> psutil.net_io_counters() # 获取网络读写字节/包的个数 snetio(bytes_sent=16775953, bytes_recv=712657945, packets_s

  • python爬虫实战项目之爬取pixiv图片

    自从接触python以后就想着爬pixiv,之前因为梯子有点问题就一直搁置,最近换了个梯子就迫不及待试了下. 爬虫无非request获取html页面然后用正则表达式或者beautifulsoup之类现成工具截取我们想要的页面,pixiv也不例外. 首先我们来实现模拟登陆,虽然大多数情况不需要我们实现模拟登录,但如果你是会员之类的,登录和不登录网页就有区别.思路是登录时抓包抓到post请求,看pixiv构建的post的数据表格是什么格式,我们根据这个格式构建form,然后调用post方法去请求,再

  • Python 游戏大作炫酷机甲闯关游戏爆肝数千行代码实现案例进阶

    目录 导语 正文 一.小编有话说 ​二.游戏规则 2.1闯关模式 2.2技能提示 三.游戏素材 3.1像素画风-- 3.2机甲模型-- 3.3冒险闯关 四.环境安装 五.项目代码 5.1加载动画以及音效 5.2初始化地图 5.3关卡动画 5.4玩家角色 5.5敌人死亡删除 5.6 敌方大BOSS 5.7敌方BOSS章鱼怪 5.8敌方BOSS 绿坦克 5.9掉落的血瓶 5.10捡血包 5.11结束类 六.效果展示 总结 导语 大家早上好哈!--有没有想我啊? 木木子来啦,今日上线放一波大招给大家!

随机推荐