【发布时间】:2014-06-07 04:12:48
【问题描述】:
所以我正在用 ruby 制作一个扫雷游戏,只是为了好玩。我已经完成了大部分工作,但是我的检测器对象在处理电路板边缘时遇到了问题。 board 对象由一个大小 int 和一个由 row..col 组成的 3d 数组组成。我的检测器对象必须忽略我设置的超出范围的索引,除非有条件处理。然后问题是当它检查地雷时,它可以总计它将计算顶部或底部阵列上的东西的数量。如果它在板的底部,它将从顶部等开始计数。还有一些地雷到右边的边界似乎没有检测到任何东西。董事会中间阵列中的地雷似乎工作正常。我一直在尝试很多不同的配置,却不知所措。这是板子和探测器对象:
class Board
attr_accessor :size, :board
def initialize(size = gets.chomp.to_i)
@size = size
@board = (1..@size).map { |x| ["L"] * @size }
end
def print_board
@board.map { |row| puts row.join }
end
end
class Detector
attr_accessor :proxi, :row, :col, :value
def initialize(proxi)
@proxi = proxi
@row = 0
@col = 0
@value = 0
end
def mine?
if @proxi.board[@row - 1][@col - 1] == "*"
true
else
false
end
end
def detect
unless (@row < 0 || @row > @proxi.size - 1) || (@col < 0 || @col > @proxi.size - 1)
@value += 1 if @proxi.board[@row - 2][@col - 1] == "*"
@value += 1 if @proxi.board[@row - 2][@col - 2] == "*"
@value += 1 if @proxi.board[@row - 1][@col - 2] == "*"
@value += 1 if @proxi.board[@row][@col - 2] == "*"
@value += 1 if @proxi.board[@row][@col - 1] == "*"
@value += 1 if @proxi.board[@row][@col] == "*"
@value += 1 if @proxi.board[@row - 1][@col] == "*"
@value += 1 if @proxi.board[@row - 2][@col] == "*"
end
end
def map_position
@proxi.board[@row - 1][@col - 1] = @value
@row = 0
@col = 0
@value = 0
end
end
为了时间,我一直在对小板进行测试。我注意到底部面板在应该说 5 时给出了 0。顶部的 6 反映了它们周围的地雷以及板的底部。所以我如何管理我的 3d 数组。在较大的板上,我注意到中间物体检测良好,当它们位于边缘时,它们要么检测到另一侧,要么它们是哑弹和假 0。
这是一个带有调试的游戏的输出:
Minefield size:
3
Lets play minesweeper!
LL*
***
*L*
LLL
LLL
LLL
pick a row:
1
pick a col:
1
flag position? (y/n)
n
6L*
***
*L*
6LL
LLL
LLL
pick a row:
1
pick a col:
2
flag position? (y/n)
n
66*
***
*L*
66L
LLL
LLL
pick a row:
1
pick a col:
3
flag position? (y/n)
y
66*
***
*L*
66!
LLL
LLL
pick a row:
2
pick a col:
1
flag position? (y/n)
y
66*
***
*L*
66!
!LL
LLL
pick a row:
2
pick a col:
2
flag position? (y/n)
y
66*
***
*L*
66!
!!L
LLL
pick a row:
2
pick a col:
3
flag position? (y/n)
y
66*
***
*L*
66!
!!!
LLL
pick a row:
3
pick a col:
1
flag position? (y/n)
y
66*
***
*L*
66!
!!!
!LL
pick a row:
3
pick a col:
2
flag position? (y/n)
n
66*
***
*0*
66!
!!!
!0L
pick a row:
3
pick a col:
3
flag position? (y/n)
y
66*
***
*0*
you win
continue? (y/n)
感谢您的任何建议和帮助!
【问题讨论】:
-
太长了。很少有人愿意免费阅读您的问题。
-
别担心,打扰您了!
标签: ruby arrays indexing minesweeper