2017-06-01 63 views
0

INTRO:
我想在Ruby中編寫Snakes以便更熟悉我剛剛開始學習的Ruby,因爲的聲譽。在兩個一維數組中檢查一個x和一個y的Ruby中的(x,y)

所以我保存了Snake的所有座標和兩個數組,一個用於所有X座標,另一個用於所有Y座標,如x=[2,0,0]y=[2,0,0]。當蛇吃食物時,一個新的數值會被添加到這兩個數組中,像這樣x[f]=y[f-1] and y[f]=y[f-1]因此,蛇的每一部分都會繼承前一部分的位置。到現在爲止還挺好。但後來我意識到,通過rand()命令放置的食物與蛇的一部分處於相同的位置。

問題:
這是我的問題所在。我試圖修復它是這樣的:

while randomNumberIsSnake == true 
if $x.include? randomX 
    if $y.include? randomY 
    randomX = 2 + rand(18) 
    randomY = 2 + rand(18) 
    else 
    randomNumberIsSnake = false 
    end 
else 
    randomNumberIsSnake = false 
end 
end 

要檢查食品的X座標等於X蛇的一部分(在陣列中)的座標。如果這是真的,它也檢查Y座標是否在Y數組中。然後它會得到一個新的號碼,直到不再是這種情況。

它似乎正常工作,直到我再次看到它,發現錯誤,如果$y.include? randomY$x.include? randomX都返回true它不一定意味着食物是在蛇的一部分相同的座標,但相反,如果食物是(4,4),蛇在(4,8)上有一部分,並且(8,4)上有一部分,它也將返回真實。這造成了這樣的情況。
-------#
- @ - #
-------#
#####
凡@即使顯然不是在排名的線條仍然將使代碼返回true。

問題:
有沒有一種方法來重新編寫代碼以避免這種情況,或者只需要一個2D數組而不是兩個1D數組。就像我之前提到的,我仍然是Ruby的精簡者,對於每一種幫助,我都會非常感激。

+0

下面的解決方案非常完美,因此無需再回答。我對很長的文本也感到抱歉,這是我問過的第一個問題。 –

回答

0

你應該寫你的檢查像這樣的:

coordinates = loop do 
    randomX = 2 + rand(18) 
    randomY = 2 + rand(18) 
    randomNumberIsSnake = false 
    $x.size.times do |index| 
    randomNumberIsSnake = true if $x[index] == randomX && $y[index] == randomY 
    end 
    break [randomX, randomY] unless randomNumberIsSnake 
end 

然後在你的座標局部變量,你也會有這樣的價值觀。

但我建議你存儲當前時刻的所有空閒單元格。然後隨機選取一個並從這個數組中移除。如果對於某些步驟陣列是空的,則根本沒有空閒單元。如果這不是大量的單元格,這個解決方案是可能的。

+0

'break [randomX,randomY]'是否改變了我可以調用變量的方式? –

+0

@TobiasWilfert在這種情況下,它只是返回一個包含兩個元素的數組。 – DjezzzL

相關問題