2017-04-02 144 views
2

我必須創建10X10板和5艘各有2,3,3,4,5的長度。船舶不應該相互重疊,它們應該在網格內(10x10),並且它們只應該是垂直或水平的。我該如何放置戰艦遊戲的船隻?

我一直在爲它工作了將近兩天,迄今爲止唯一能做的事情是在10x10電路板上製作4個水平重疊船隻,長度爲2,3,4,5。

所以我卡住的部分如下: 1)我讓船隻在網格內,但它們重疊。 2)我可以製造4艘船,每艘2,3,4,5長,但不能做3次發生兩次。 3)我只能做水平排列不垂直。我希望這艘船可以隨機垂直或水平。

所以,我寫的代碼如下:

{

matrix = zeros(10,10); 
row = randi(size(matrix, 1),1,1); %row number 
col = randi(size(matrix, 2),1,1); %column number 

for i=2:5 
     while col(1,1)+i-1>10 % Checking if it is within grid 
       row = randi(size(matrix, 1),1,1); %row number 
       col = randi(size(matrix, 2),1,1); %column number 
     end 
      matrix(row,col:col+i-1)=i; 
      row = randi(size(matrix, 1),1,1); %row number 
      col = randi(size(matrix, 2),1,1); %column number 


end 
matrix 

}

我不能拿出任何解決方案。我非常感謝提前的幫助。

+0

我的想法的順序是如下:檢查船舶網格內 - >檢查船舶重疊 - >如果是重疊的,作出新的行和列 - >檢查船舶網格內(回開頭)。我不知道如何將這些句子放入循環中 – Matmaster

回答

1

如果我沒有弄錯,你在編寫方法時遇到問題,而不是編碼本身。

我建議你爲每艘船使用一個船旗(艦船ID),並在10x10矩陣中所有船上佔用的每個地點上輸入這個ID(所有其他地點爲0)。從10×10矩陣的自由點

隨機選擇一個點(X,Y座標):

現在放置的船。讓這個座標代表我們試圖放置的船的一端。現在只能以4種可能的方式放置船舶(從該選定座標開始的4個方向向上/向下/向左/向右)。 對於每個的4種可能的方式,檢查(取決於船的長度),如果:

a)船舶配合和不走的10×10矩陣

b)船舶不與重疊外被佔用的地點

如果這兩個方向中的一個或多個方向都滿足,則隨機選擇一個並放置該船。否則,在一個虛擬的10x10矩陣中,將這個未佔用的點標記爲不能用於放置當前船舶的點,並隨機挑選另一個未佔用的點(這仍然是合理的,即在我們的虛擬矩陣內沒有標記爲不可能)。

+0

我嘗試使用與您所解釋的相同的方法,但我無法編寫滿足條件a和b的代碼。這可能是因爲我現在只是個初學者。如果你有代碼的話,你有可能給我一小段代碼嗎?我真的很感謝你的幫助! – Matmaster

+0

如果你想保持簡單,現在就用更硬編碼的方法。因此,在搜索展示位置的while循環中,在隨機選取空閒點(x,y)後,檢查x + 3 <=10, or x-3> = 1或y + 3 <=10 or y-3> = 1。這些對應於4個方向。如果它們中的一個配合(假設X + 3 <= 10),則檢查(X + 1,Y)(X + 2,y)和(X + 3,y)是自由的,如果它們然後將船否則不要從那裏繼續。這裏的值「3」表示船的長度,您不需要對其進行硬編碼,只需對4種方向進行硬編碼!祝你好運! –

+1

謝謝!榮譽給你! – Matmaster