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


Posted in Python onApril 18, 2021

今天填一个坑,俄罗斯方块!!
俄罗斯方块的移动不难实现,但是旋转就不太容易实现,究其原因是因为Python中没有数组这种数据结构,所以不能用矩阵的公式。今天把旋转做出来了,刚好整理一下,把之前的都整合在一起

这两天浏览量有点离谱,说明一下,我没有使用pygame,只是在控制台可以打印、移动和旋转生成的俄罗斯方块星号图形

俄罗斯方块-打印

功能:输入字母,打印俄罗斯方块的*图形

# 尽可能吧俄罗斯方块放在中间
Tetris = {'L': [[1, 1], [1, 2], [1, 3], [2, 3]],
         'O': [[1, 1], [2, 1], [1, 2], [2, 2]],
         'J': [[2, 1], [2, 2], [1, 3], [2, 3]],
         'Z': [[1, 1], [2, 1], [2, 2], [3, 2]],
         'S': [[1, 1], [1, 2], [2, 2], [2, 3]],
         'I': [[1, 1], [1, 2], [1, 3], [1, 4]],
         'T': [[1, 1], [2, 1], [2, 2], [3, 1]]}
print(Tetris)

while True:
    figure = input("请输入俄罗斯方块的形状")
    flag = 0
    for i in range(0, 5):
        for j in range(0, 4):
            for li in range(0, len(Tetris[figure])):    # Tetris['L']
                if j == Tetris[figure][li][0] and i == Tetris[figure][li][1]:
                    flag = 1
            if flag == 1:
                print("*", end='')
            else:
                print(" ", end='')
            flag = 0
        print()

俄罗斯方块-移动

这一版使用了函数+字典
功能:输入字母,打印俄罗斯方块的*图形,输入468可以移动

# 文件名称:Model-Tetris.PY
# 开发工具:PyCharm

Tetris = {'L': [[1, 1], [1, 2], [1, 3], [2, 3]],
         'O': [[1, 1], [2, 1], [1, 2], [2, 2]],
         'J': [[2, 1], [2, 2], [1, 3], [2, 3]],
         'Z': [[1, 1], [2, 1], [2, 2], [3, 2]],
         'S': [[1, 1], [1, 2], [2, 2], [2, 3]],
         'I': [[1, 1], [1, 2], [1, 3], [1, 4]],
         'T': [[1, 1], [2, 1], [2, 2], [3, 1]]}

def L_char(char):
    flag = 0
    for i in range(0, 7):
        for j in range(0, 7):
            for li in range(0, len(Tetris[char])):  # Tetris['L']
                if j == Tetris[char][li][0] and i == Tetris[char][li][1]:
                    flag = 1
            if flag == 1:
                print("*", end='')
            else:
                print(" ", end='')
            flag = 0
        print()

def move(char, num):
    if num == 2:
        for li in range(0, len(Tetris[char])):
            Tetris[char][li][1] += 1
    if num == 4:
        for li in range(0, len(Tetris[char])):
            Tetris[char][li][0] -= 1
    if num == 6:
        for li in range(0, len(Tetris[char])):
            Tetris[char][li][0] += 1
    if num == 8:
        for li in range(0, len(Tetris[char])):
            Tetris[char][li][1] -= 1
# 文件名称:Test-Tetris.PY
# 开发工具:PyCharm   
from Day05 import Model_Tetris
if __name__ == '__main__':
    char = input("请输入图形:")
    Model_Tetris.L_char(char)
    while True:
        num = int(input("请输入移动代码2/4/6/8:"))
        if num == 8 or num == 2 or num == 4 or num == 6:
            Model_Tetris.move(char, num)
            Model_Tetris.L_char(char)
        else:
            break

俄罗斯方块-旋转

主要思想:预定义4X4的坐标转换,旋转式查找字典中的转换坐标,进行相应的替换
功能:输入字母,打印俄罗斯方块的*图形,输入468可以移动,输入5可以旋转
废话不多说,直接给出代码:

#!/usr/bin/python
# _*_coding:utf-8_*_
# 开发人员:zys
# 开发时间:2021/4/16 16:50 
# 文件名称:Test-Tetris.PY
# 开发工具:PyCharm   
import random

from Day06.test1 import Model_Tetris
if __name__ == '__main__':
    # 随机生成方法
    # Character = "LOJSZIT"
    # char = random.choice(Character)

    char = "L"
    Model_Tetris.L_char(char)
    while True:
        num = int(input("请输入移动代码4/5/6/8:")) # 5是旋转
        if num == 8 or num == 4 or num == 6:
            Model_Tetris.move(char, num)
            Model_Tetris.L_char(char)
        elif num == 5:
            Model_Tetris.revolve(char)
            Model_Tetris.L_char(char)
        else:
            break
#!/usr/bin/python
# _*_coding:utf-8_*_
# 开发人员:zys
# 开发时间:2021/4/16 16:36 
# 文件名称:Model-Tetris.PY
# 开发工具:PyCharm

Tetris = {'L': [[1, 1], [1, 2], [1, 3], [2, 3]],
         'O': [[1, 1], [1, 2], [2, 1], [2, 2]],
         'J': [[1, 2], [2, 2], [3, 1], [3, 2]],
         'Z': [[1, 1], [1, 2], [2, 2], [2, 3]],
         'S': [[1, 1], [2, 1], [2, 2], [3, 2]],
         'I': [[1, 1], [2, 1], [3, 1], [4, 1]],
         'T': [[1, 1], [1, 2], [2, 2], [1, 3]]}
# 4*4旋转
'''这里补充一个知识点:
    字典中的key是不可变的,所以不能用list作为字典的key,
    因为list可以修改,这里采用了元组作为key,指明不可改变,
    后面地址查值的时候需要进行类型转换。'''
rotateDict = {(1, 1): [4, 1], (1, 2): [3, 1], (1, 3): [2, 1], (1, 4): [1, 1],
              (2, 1): [4, 2], (3, 1): [4, 3], (4, 1): [4, 4], (4, 2): [3, 4],
              (4, 3): [2, 4], (4, 4): [1, 4], (3, 4): [1, 3], (2, 4): [1, 2],
              (2, 2): [3, 2], (3, 2): [3, 3], (3, 3): [2, 3], (2, 3): [2, 2]}

def L_char(char):
    flag = 0
    for i in range(0, 5):
        for j in range(0, 5):
            for li in range(0, len(Tetris[char])):  # Tetris['L']
                if j == Tetris[char][li][0] and i == Tetris[char][li][1]:
                    flag = 1
            if flag == 1:
                print("*", end='')
            else:
                print(" ", end='')
            flag = 0
        print()

def move(char, num):
    if num == 2:
        for li in range(0, len(Tetris[char])):
            Tetris[char][li][1] += 1
    if num == 4:
        for li in range(0, len(Tetris[char])):
            Tetris[char][li][0] -= 1
    if num == 6:
        for li in range(0, len(Tetris[char])):
            Tetris[char][li][0] += 1
    if num == 8:
        for li in range(0, len(Tetris[char])):
            Tetris[char][li][1] -= 1


def revolve(char):
    newTetris = []  # 新的list
    for i in range(len(Tetris[char])):
        newTetris.append(rotateDict[tuple(Tetris[char][i])])   # 对应坐标添加到新的坐标
    Tetris[char] = newTetris

到此这篇关于Python控制台输出俄罗斯方块移动和旋转的文章就介绍到这了,更多相关Python控制台输出内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Java中重定向输出流实现用文件记录程序日志
Jun 12 Python
python中zip()方法应用实例分析
Apr 16 Python
利用python爬取斗鱼app中照片方法实例
Dec 03 Python
Python面向对象class类属性及子类用法分析
Feb 02 Python
python使用matplotlib画饼状图
Sep 25 Python
Python爬取破解无线网络wifi密码过程解析
Sep 17 Python
python生成大写32位uuid代码
Mar 03 Python
Python获取对象属性的几种方式小结
Mar 12 Python
如何查看Django ORM执行的SQL语句的实现
Apr 20 Python
Python xlwt模块使用代码实例
Jun 10 Python
python 实现波浪滤镜特效
Dec 02 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
Dec 08 Python
深入理解python多线程编程
Apr 18 #Python
Python实现文本文件拆分写入到多个文本文件的方法
Apr 18 #Python
python批量更改目录名/文件名的方法
Apr 18 #Python
python解决12306登录验证码的实现
django注册用邮箱发送验证码的实现
Apr 18 #Python
Python控制台输出俄罗斯方块的方法实例
Apr 17 #Python
python3 实现mysql数据库连接池的示例代码
You might like
php通过exif_read_data函数获取图片的exif信息
2015/05/21 PHP
PHP抓取淘宝商品的用户晒单评论+图片+搜索商品列表实例
2016/04/14 PHP
Save a File Using a File Save Dialog Box
2007/06/18 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
js判断手机访问或者PC的几个例子(常用于手机跳转)
2015/12/15 Javascript
浅谈jQuery 选择器和dom操作
2016/06/07 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
使用electron将vue-cli项目打包成exe的方法
2018/09/29 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
vue实现后台管理权限系统及顶栏三级菜单显示功能
2019/06/19 Javascript
vue实现输入一位数字转汉字功能
2019/12/13 Javascript
跟老齐学Python之复习if语句
2014/10/02 Python
从Python的源码来解析Python下的freeblock
2015/05/11 Python
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
Python中的zipfile模块使用详解
2015/06/25 Python
小小聊天室Python代码实现
2016/08/17 Python
python操作xlsx文件的包openpyxl实例
2018/05/03 Python
Python3 列表,数组,矩阵的相互转换的方法示例
2019/08/05 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
python 爬虫百度地图的信息界面的实现方法
2019/10/27 Python
Python object类中的特殊方法代码讲解
2020/03/06 Python
如何写出好的Java代码
2014/04/25 面试题
外科实习自我鉴定
2013/10/06 职场文书
致百米运动员广播稿
2014/01/29 职场文书
团委书记的竞聘演讲稿
2014/04/24 职场文书
英语教研活动总结
2014/07/02 职场文书
住房租房协议书
2014/08/20 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
贫困证明模板(3篇)
2014/09/16 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
家长意见书
2015/06/04 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
学校趣味运动会开幕词
2016/03/04 职场文书
yolov5返回坐标的方法实例
2022/03/17 Python
Android Studio实现带三角函数对数运算功能的高级计算器
2022/05/20 Java/Android