Python: Вопрос по реализации программы рисования на холсте - PullRequest
0 голосов
/ 01 февраля 2019

Я написал код, из любопытства хорошо перевел немного кода Java на python.Суть проблемы заключается в следующем:

Command Description C w h Create a new canvas of width w and height h. L x1 y1 x2 y2 Create a new line of 'x' from (x1,y1) to (x2,y2). Only support horizontal or vertical lines. R x1 y1 x2 y2 Create a new rectangle, (x1,y1) is upper left corner & (x2,y2) is lower right corner. B x y c Fill the entire area around (x,y) with "colour" c. Same as that of the "bucket fill" tool in paint programs. Q Quit.

Ниже приведен мой код, это прекрасно работает.Мне нужен совет, если это лучшее решение или оно может быть реализовано еще лучше (возможно, с использованием подклассов?)

Ниже приведен мой код, он отлично работает.Мне нужен совет, если это лучшее решение или может быть реализовано еще лучше (возможно, с использованием подклассов?)

class CanvasApp(object):

def __init__(self):
    self.canvasArray= []

def init(self, width, height):
    self.width = width + 2
    self.height = height + 2
    self.canvasArray = [['' for x in range(self.width+2)] for y in range(self.height+2)]

    self.drawLine(0, 0, self.width-1, 0, '-');
    self.drawLine(0, self.height-1, self.width-1, self.height-1, '-');
    self.drawLine(0, 1, 0, self.height-2, '|');
    self.drawLine(self.width-1, 1, self.width-1, self.height-2, '|');
    return self.doAction()

def checkCanvasExists(self):
    if not self.canvasArray:
        raise Exception("Canvas doesn't exist. Please create a canvas first.")    

def doAction(self):

    stringArr = []

    for i in range(0, self.height):
        for j in range(0, self.width):
            if self.canvasArray[i][j] == '':
                res = ' '
            else:
                res = self.canvasArray[i][j]
            stringArr.append(res);

        stringArr.append("\n");

    return ''.join(stringArr).strip();

def drawLine(self, x1, y1, x2, y2, char='x'):
    self.checkCanvasExists()
    x1, x2, y1, y2 = int(x1), int(x2), int(y1), int(y2)

    for i in range(y1, y2+1):
        for j in range(x1, x2+1):
            self.canvasArray[i][j] = char;
    return self.doAction()

def drawRectangle(self, x1, y1, x2, y2, char='x'):
    self.checkCanvasExists()
    self.drawLine(x1, y1, x2, y1, char)
    self.drawLine(x1, y1, x1, y2, char)
    self.drawLine(x2, y1, x2, y2, char)
    self.drawLine(x1, y2, x2, y2, char)
    return self.doAction()

def fillColor(self, x, y, char='x'):
    self.checkCanvasExists()
    x, y = int(x), int(y)
    if(self.canvasArray[y][x] != ''):
        return;

    if(x > 0 or x < self.height or y > 0 or y  < self.width):
        if(self.canvasArray[y][x] == ''):
            self.canvasArray[y][x] = char
            self.fillColor(x+1,y, char)
            self.fillColor(x-1,y, char)
            self.fillColor(x,y-1, char)
            self.fillColor(x,y+1, char)
    return self.doAction()


def draw(self, command):
    args = command.split(' ')
    firstArg = args[0]
    if firstArg == 'B':
        remArgs=[int(arg) for arg in args[1:-1]]
        remArgs.append(args[-1])
    else:
        remArgs=[int(arg) for arg in args[1:]]

    switch= {'C': self.init,
             'L' : self.drawLine,
             'R' : self.drawRectangle,
             'B' : self.fillColor
            }
    try:
        func = switch.get(firstArg, lambda *args: 'Invalid Argument. Commands should start with C, L, R or B')
        res = func(*remArgs)
        print res
    except Exception as e:
        print str(e) + '. Please try again'


def start(self):
    while True:
        command = raw_input("Enter the command:")
        if command == 'Q':
            break
        self.draw(command)

def main():
    canvasApp = CanvasApp()
    canvasApp.start()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...