2017-10-28 2 views
0

Ich habe eine Aufgabe, wo ich eine Funktion schreiben muss, die ein Rechteck (Benutzer kann seine Höhe und Breite ändern) Rahmen für Rahmen mit einem Quadrat von "x" es innen davon (ich habe mein Bestes versucht, es zu beschreiben, aber ich hoffe, das Bild wird helfen).Einfache Rechteck-Terminal-Animation in Python 3.x

In meinem Code stelle ich Frame als eine Liste von Zeilen (gefüllt mit "o" s). Ich habe bereits eine Funktion, die das Zentrum des Rechtecks ​​findet und das mittlere "o" durch "x" ersetzt - das ist mein erstes Bild.

Ursprünglich wollte ich alle verbleibenden Frames mit verschachtelten Loops machen, aber es wurde ziemlich schnell verwirrend, da es 2 horizontale Zeilen von "x" es gibt.

Ich bin mir ziemlich sicher, dass ich ein neues "Koordinatensystem" brauche, um über Frames zu iterieren. Kann mir bitte jemand in die richtige Richtung zeigen?

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

Antwort

0

So schließlich kam ich mit meiner eigenen Lösung auf. Es ist vielleicht nicht das Schönste, aber es funktioniert.

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