Я написал код, из любопытства хорошо перевел немного кода 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()