我正在嘗試編寫掃雷遊戲以獲得樂趣。到目前爲止,我正在研究一個董事會和我的對象,最終將會在董事會中得到充分利用。目前,當我爲測試目的製作5×5板並將其加載到我的地雷對象中時,它可以選取隨機的列行,但部分時間會出錯。下面是代碼,我跑什麼,錯誤我得到:紅寶石中的隨機對象,需要異常處理的幫助
class Board
attr_accessor :size, :board
def initialize(size = gets.chomp.to_i)
@size = size
@board = ([email protected]).map { |x| ["L"] * @size }
end
def print_board
@board.map { |row| puts row.join }
end
end
class Mine
attr_accessor :proxi, :row, :col
def initialize(proxi)
@proxi = proxi
@row = Random.rand([email protected])
@col = Random.rand([email protected][0].length)
check_position
end
def check_position
if @proxi.board[@row - 1][@col - 1] != "L"
initialize
else
map_position
end
end
def map_position
@proxi.board[@row - 1][@col - 1] = "*"
end
end
b = Board.new(5)
=> #<Board:0x000000024cbb50 @size=5, @board=[["L", "L", "L", "L", "L"], ["L", "L", "L", "L", "L"], ["L", "L", "L", "L", "L"], ["L", "L", "L", "L", "L"], ["L", "L", "L", "L", "L"]]>
m = Mine.new(b)
=> #<Mine:0x000000024ae9d8 @proxi=#<Board:0x000000024cbb50 @size=5, @board=[["L", "L", "L", "L", "L"], ["L", "L", "L", "L", "L"], ["L", "L", "*", "L", "L"], ["L", "L", "L", "L", "L"], ["L", "L", "L", "L", "L"]]>, row3, col3
m = Mine.new(b)
=> #<Mine:0x00000002487888 @proxi=#<Board:0x000000024cbb50 @size=5, @board=[["L", "L", "L", "L", "L"], ["L", "L", "L", "L", "L"], ["L", "L", "*", "L", "L"], ["*", "L", "L", "L", "L"], ["L", "L", "L", "L", "L"]]>, row4, col1
m = Mine.new(b)
=> #<Mine:0x000000024758b8 @proxi=#<Board:0x000000024cbb50 @size=5, @board=[["L", "L", "L", "L", "L"], ["L", "L", "L", "L", "L"], ["L", "L", "*", "L", "L"], ["*", "L", "*", "L", "L"], ["L", "L", "L", "L", "L"]]>, row4, col3
m = Mine.new(b)
=> #<Mine:0x000000024211a0 @proxi=#<Board:0x000000024cbb50 @size=5, @board=[["L", "L", "L", "*", "L"], ["L", "L", "L", "L", "L"], ["L", "L", "*", "L", "L"], ["*", "L", "*", "L", "L"], ["L", "L", "L", "L", "L"]]>, row1, col4
m = Mine.new(b)
=> #<Mine:0x000000023b37e0 @proxi=#<Board:0x000000024cbb50 @size=5, @board=[["L", "L", "L", "*", "L"], ["L", "L", "L", "L", "L"], ["*", "L", "*", "L", "L"], ["*", "L", "*", "L", "L"], ["L", "L", "L", "L", "L"]]>, row3, col1
m = Mine.new(b)
=> #<Mine:0x0000000235ed08 @proxi=#<Board:0x000000024cbb50 @size=5, @board=[["L", "L", "L", "*", "L"], ["L", "L", "L", "*", "L"], ["*", "L", "*", "L", "L"], ["*", "L", "*", "L", "L"], ["L", "L", "L", "L", "L"]]>, row2, col4
m = Mine.new(b)
=> #<Mine:0x00000002310888 @proxi=#<Board:0x000000024cbb50 @size=5, @board=[["L", "L", "L", "*", "L"], ["L", "L", "L", "*", "L"], ["*", "L", "*", "L", "*"], ["*", "L", "*", "L", "L"], ["L", "L", "L", "L", "L"]]>, row3, col5
m = Mine.new(b)
ArgumentError: wrong number of arguments (0 for 1)
from (irb):16:in `initialize'
from (irb):25:in `check_position'
from (irb):20:in `initialize'
from (irb):43:in `new'
from (irb):43
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p353/bin/irb:12:in `<main>'
所以最終,當我養活一個新的對象實例的修改實例董事會不採取。我不確定這是爲什麼,但希望有人能引導我走向正確的方向,這樣我就可以實現自動化。謝謝!
這裏是我去解決:
class Mine
attr_accessor :proxi, :row, :col
def initialize(proxi)
@proxi = proxi
@row = 0
@col = 0
@random = Random.new
check_position
end
def check_position
if @proxi.board[@row - 1][@col - 1] != "L"
@row = @random.rand([email protected])
@col = @random.rand([email protected][0].length)
check_position
else
map_position
end
end
def map_position
@proxi.board[@row - 1][@col - 1] = "*"
end
end
在'Mine.map_position'你叫'Mine.initialize'沒有參數,但我認爲它需要董事會,不是嗎?也許你應該將隨機化函數從'initialize'移出到另一個方法(例如'place_mine'),然後從'initialize'和'check_position'中調用'place_mine'。順便說一句:當你的董事會擁擠時,你可能會遇到堆溢出問題,因爲你仍然有一個從'check_position'到'place_mine'到'check_position'的循環調用。 –