Continued refactor work.
[tagua.git] / src / variants / kboard.rb
blobe8ca4065300d5016c2da4c5f76b8d7a62acaf1bd
1 module KBoard
3 class Point
4   attr_reader :x, :y
5   
6   def initialize(x, y)
7     @x = x
8     @y = y
9   end
10   
11   def +(other)
12     Point.new(@x + other.x, @y + other.y)
13   end
14   
15   def -(other)
16     Point.new(@x - other.x, @y - other.y)
17   end
18   
19   def *(k)
20     Point.new(@x * k, @y * k)
21   end
22   
23   def self.shift(v)
24     x = v.shift
25     if x.respond_to? :x and x.respond_to? :y
26       x
27     else
28       new(x, v.shift)
29     end
30   end
31 end
33 class Grid
34   attr_reader :size
35   
36   def initialize(size)
37     @size = size
38     @grid = Array.new(size.x * size.y)
39   end
40   
41   def [](*args)
42     p = Point.shift(args)
43     @grid[p.x + p.y * size.x]
44   end
45   
46   def []=(*args)
47     p = Point.shift(args)
48     val = args.shift
49     @grid[p.x + p.y * size.x] = val
50   end
51   
52   def clone
53     res = self.class.new(@size)
54     res.grid = @grid.dup
55     res
56   end
57   
58   def ==(other)
59     return false unless @size == other.size
60     @grid.each do |i|
61       return false unless self[i] == other[i]
62     end
63     true
64   end
65   
66   def each_square
67     @grid.each {|i| yield Point.new(i % size.x, i / size.x) }
68   end
69   
70 private
71   attr_accessor :grid
72 end
74 module GridAccess
75   def [](*args)
76     p = Point.shift(args)
77     @board[p]
78   end
79   
80   def []=(*args)
81     p = Point.shift(args)
82     val = args.shift
83     @board[p] = val
84   end
85 end
87 def self.register(name, var)
89 end
91 end