繁体   English   中英

Python 3.x中的简单矩形终端动画

[英]Simple rectangle terminal animation in Python 3.x

我有一个作业,其中我必须编写一个函数,该函数将逐帧打印一个矩形(用户可以更改其高度和宽度),并在其中包含一个“ x”的正方形(我尽了最大的努力来描述它,但是希望该图片对您有所帮助)。

在我的代码中,我将框架表示为行列表(用“ o”填充)。 我已经有一个函数可以找到矩形的中心,并用“ x”替换中间的“ o”,这是我的第一帧。

最初,我想使所有剩余的框架都具有嵌套循环,但是由于有2条水平线“ x”,所以它很快就引起了混乱。

我很确定我需要一个新的“坐标系”来遍历框架。 有人可以指出我正确的方向吗?

def squareAnimation():

    while True:

        frameHeight = int(input("Please enter frame's height: \nRemember: Odd numbers only!\n"))
        frameWidth = int(input("Please enter frame's width:\nRemember: Odd numbers only!\n"))


        if (frameHeight % 2 != 0 and frameWidth % 2 != 0):
            break
    numberOfFrames = min(int(frameWidth/2), int(frameHeight/2))

    lineTemplate = "o " * frameWidth
    #frame filled with "o" only
    blankFrame = [lineTemplate] * frameHeight

    #frame with x in center
    frameTemplate = blankFrame
    findListCenter(frameTemplate, frameHeight, frameWidth)
    printListWithoutBrackets(frameTemplate)

def findListCenter(frame, height, width):
    frame[int(height / 2)] = "o " * (int(width / 2)) + "x " + "o " * (int(width / 2))

def printListWithoutBrackets(frame):
    for object in range(0, len(frame)):
        tempLine = frame[object]
        print("".join(tempLine))

squareAnimation()

在此处输入图片说明

所以最终我想出了自己的解决方案。 它可能不是最漂亮的,但它可以工作。

import copy
import time

def squareAnimation():

    while True:

        height = int(input("Please enter frame's height: \nRemember: Odd numbers only!\n"))
        width = int(input("Please enter frame's width:\nRemember: Odd numbers only!\n"))

        if (height % 2 != 0 and width % 2 != 0):
            break
    numberOfFrames = min(int(width/2), int(height/2))
    middleRow = int(height / 2)
    middleColumn = int(width / 2)

    numberOfHorizontalXes = 3
    lineTemplate = "o " * width
    blankFrame = [lineTemplate] * height
    currentFrameIndex = 1

    completeListOfFrames = ([blankFrame] * (numberOfFrames + 1)) #an array filled with blankGrames

    firstFrame = copy.deepcopy(blankFrame)
    firstFrame [int(height / 2)] = "o " * (int(width / 2)) + "x " + "o " * (int(width / 2))

    completeListOfFrames[0] = firstFrame

    for frame in completeListOfFrames:
        if frame == firstFrame:
            continue

        numberOfO = int((width - numberOfHorizontalXes) / 2)
        loopFrameCopy = copy.deepcopy(frame)

        loopFrameCopy[middleRow + currentFrameIndex] = "o " * numberOfO + "x " * numberOfHorizontalXes + "o " * numberOfO
        loopFrameCopy[middleRow - currentFrameIndex] = "o " * numberOfO + "x " * numberOfHorizontalXes + "o " * numberOfO
        loopFrameCopy[middleRow] = "o " * numberOfO + "x " + "o " * (width - (2 * numberOfO + 2)) + "x " + "o " * numberOfO

        for wallIndex in range(1, currentFrameIndex):
            loopFrameCopy[middleRow + wallIndex] = "o " * numberOfO + "x " + "o " * (width - (2 * numberOfO + 2)) + "x " + "o " * numberOfO
            loopFrameCopy[middleRow - wallIndex] = "o " * numberOfO + "x " + "o " * (width - (2 * numberOfO + 2)) + "x " + "o " * numberOfO

        completeListOfFrames[currentFrameIndex] = loopFrameCopy

        numberOfO += 3
        numberOfHorizontalXes += 2
        currentFrameIndex += 1

    revCompleteListOfFrames = copy.deepcopy(completeListOfFrames[::-1])
    revCompleteListOfFrames.pop(0)
    finalList = completeListOfFrames + revCompleteListOfFrames
    printListWithoutBrackets(finalList)

def printListWithoutBrackets(frameOfFrames):

    for frame in frameOfFrames:
        for line in frame:

           print("".join(line))
        time.sleep(0.3)
        print("\n")

squareAnimation()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM