2014-06-05 31 views
0

我正在嘗試編寫掃雷遊戲以獲得樂趣。到目前爲止,我正在研究一個董事會和我的對象,最終將會在董事會中得到充分利用。目前,當我爲測試目的製作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 
+0

在'Mine.map_position'你叫'Mine.initialize'沒有參數,但我認爲它需要董事會,不是嗎?也許你應該將隨機化函數從'initialize'移出到另一個方法(例如'place_mine'),然後從'initialize'和'check_position'中調用'place_mine'。順便說一句:當你的董事會擁擠時,你可能會遇到堆溢出問題,因爲你仍然有一個從'check_position'到'place_mine'到'check_position'的循環調用。 –

回答

0

check_position方法嘗試如果位置已經被帶到回打電話initialize,但未能通過所需proxi參數。

我認爲它不明智(如果可能)重新調用initialize方法,因爲這是您的類的構造函數。

我寧願將與找到開放位置相關的邏輯提取到一組輔助方法。像下面的內容將幫助你到達那裏:

private 

    def find_open_position 
    x = 0 
    y = 0 

    begin 
     x, y = random_position 
    while position_taken?(x, y) 

    [x, y] 
    end 

    def random_position 
    [Random.rand([email protected]), @col = Random.rand([email protected][0].length)] 
    end 

    def position_taken?(x, y) 
    @proxi.board[x - 1][x - 1] != "L" 
    end 

然後你initialize僅需要包括

@row, @col = find_open_position 
+0

謝謝!就是這樣!我進入並更改了我的init的init,以便啓動col和row作爲int值和一個隨機對象實例。然後我使檢測方法使用隨機實例來填充整型值,如果它不符合條件,它會重新使用它。這種方式我有我的所有屬性開始與對象,我不重建。謝謝你,先生! – user3712902