Борис обнови решението на 01.12.2015 17:34 (преди около 9 години)
+class TurtleGraphics
+ class Canvas
+ class ASCII
+
+ def initialize(symbols)
+ @hash = symbols.map.with_index { |n, i| [i, n] }.to_h
+ end
+
+ def symbols
+ @hash
+ end
+ end
+ end
+
+ class Turtle
+
+ def initialize(rows, columns)
+ @orientation = :right
+ @turtle_position
+ @grid, helper = [], []
+ while columns > 0
+ helper << 0
+ columns -= 1
+ end
+ while rows > 0
+ @grid << helper.dup
+ rows -= 1
+ end
+ end
+
+ def look(orientation)
+ @orientation = orientation
+ end
+
+ def spawn_at(row, column)
+ @turtle_position = [row, column]
+ raise_counter
+ if (row != 0) or (column != 0)
+ @grid[0][0] = 0
+ end
+ end
+
+ def turn_right
+ case @orientation
+ when :right
+ @orientation = :down
+ when :down
+ @orientation = :left
+ when :left
+ @orientation = :up
+ when :up
+ @orientation = :right
+ end
+ end
+
+ def turn_left
+ case @orientation
+ when :right
+ @orientation = :up
+ when :down
+ @orientation = :right
+ when :left
+ @orientation = :down
+ when :up
+ @orientation = :left
+ end
+ end
+
+ def draw(type = nil, &block)
+ spawn_at(0,0)
+ self.instance_eval(&block) if block_given?
+ if type == nil
+ @grid
+ elsif type.class == TurtleGraphics::Canvas::ASCII
+ ascii_grid(type)
+ end
+ end
+
+ def move
+ case @orientation
+ when :right
+ @turtle_position[1] += 1
+ when :left
+ @turtle_position[1] -= 1
+ when :up
+ @turtle_position[0] -= 1
+ when :down
+ @turtle_position[0] += 1
+ end
+ raise_counter
+ end
+
+ private
+
+ def raise_counter
+ row, column = *@turtle_position
+ row = (row + @grid.size) % @grid.size
+ column = (column + @grid[0].size) % @grid[0].size
+ @turtle_position = [row,column]
+ @grid[row][column] += 1
+ end
+
+ def ascii_grid(type)
+ @grid.map { |row| row.map { |n| type.symbols[n] } }.
+ map { |n| n.join"" }.join"\n"
+ end
+ end
+end
Здравей,
Отнемам ти точка заради:
- Процедурното генериране на матрица с
while
и използване на брояч. - Мястото, на което си дефинирал логиката за създаване на ASCII арт. Това е логично да се случва в класа за
ASCII
. В противен случай ако имаше иHTML
всичко щеше да е на едно място, което води до лош код, който се поддържа трудно. - Имената
n
иi
Прегледай нашето решение и помисли за местата на различните методи.