2017-10-28 15 views
0

私は四角形の "x"の内側に四角形(ユーザーは高さと幅を変更できる)をフレームごとに印刷する関数を書く必要があります。 (私はそれを説明するために最善を尽くしましたが、イメージが助けてくれることを願っています)。Python 3.xでのシンプルな矩形の端末アニメーション

私のコードでは、フレームは行のリスト( "o"で埋められています)として表現しています。私はすでに矩形の中心を見つけ、中央の "o"を "x"に置き換える関数を持っています。これが私の最初のフレームです。

元々、ネストされたループで残りのフレームを作りたかったのですが、「x」の2つの水平線があるので、かなり混乱しました。

私は、フレームを反復するために新しい「座標系」が必要であると確信しています。誰かが私を正しい方向に向けることができますか?

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

答えて

0

だから、最終的に私は自分の解決策を考え出しました。それは一番美しいものではないかもしれませんが、それは機能します。

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() 
関連する問題