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

2024-06-25 22:56:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个任务,我必须写一个函数,将打印一个矩形(用户可以改变它的高度和宽度)一帧一帧与一个正方形的“x”在里面(我尽量描述它,但我希望图像会有所帮助)。你知道吗

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

最初我想用嵌套循环生成所有剩余的帧,但很快就变得混乱了,因为有两条水平的“x”e线。你知道吗

我很确定我需要一个新的“坐标系”来迭代帧。有人能给我指一下正确的方向吗?你知道吗

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()

enter image description here


Tags: 函数onlyinputdefwidthframeintenter
1条回答
网友
1楼 · 发布于 2024-06-25 22:56:07

所以最终我想出了自己的解决办法。它可能不是最漂亮的,但它很管用。你知道吗

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()

相关问题 更多 >