今天填一个坑,俄罗斯方块!!

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

俄罗斯方块-打印

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

# 尽可能吧俄罗斯方块放在中间
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

俄罗斯方块-旋转

主要思想:预定义4×4的坐标转换,旋转式查找字典中的转换坐标,进行相应的替换

功能:输入字母,打印俄罗斯方块的*图形,输入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输出俄罗斯方块内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!