2012-04-12 112 views
1

我創建戰艦遊戲板是10×10,看起來這樣的:戰艦遊戲蟒蛇船安置問題

------------------------------------------------- 
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 
------------------------------------------------- 
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 
------------------------------------------------- 
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
------------------------------------------------- 
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 
------------------------------------------------- 
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 
------------------------------------------------- 
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 
------------------------------------------------- 
60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 
------------------------------------------------- 
70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 
------------------------------------------------- 
80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 
------------------------------------------------- 
90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 
------------------------------------------------- 

我已經能夠用我的代碼打印這一點,但現在我想編寫一個函數來檢查選擇是否可以放置在船上的位置。

這是一個暗示,我已經給了,但我從字面上不知道如何解決這個問題。

如果選擇是88,shipDir是水平的,shipType是3,那麼船舶不適合,因爲它將採取位置88-89-90和90是下一行中的位置(並且因此船舶將不在板)。

如果選擇是88,shipDir是垂直的,shipType是3,那麼出貨也不合適,因爲它將採取88-98-108和108的位置。

此功能還可以檢查選定的位置是否已被船上其他船舶佔用的位置。

如果船舶在船外,並且如果船上有另一艘船,則功能應返回False。否則,函數應返回True

任何人都可以幫忙嗎?

+10

我感覺到一些創造了板 「你嘗試過什麼?」在空中 – icecrime 2012-04-12 18:18:47

+0

是完全誠實的,我不知道從哪裏開始 – user1329880 2012-04-12 18:23:25

+0

這是功課嗎? – GWW 2012-04-12 18:23:58

回答

1

你應該發佈你如何在內部表示數據,而不僅僅是你打印出來的內容。但是,從你的輸出中,我想你有一個線性列表,並使用某種元素來知道它是否「包含船隻」或「不包含船隻」。

建議是忘掉它,並採取機會學習更多關於面向對象的編碼 - 以便您可以擁有一個知道其內容的「Board」類和一個「can_place_ship(self, <coord>, <shipsize>, <shiporientation>)」方法,例如。

這裏,嘗試本教程爲OO部分: http://www.voidspace.org.uk/python/articles/OOP.shtml你應該做的事情(只是拿起從谷歌的第一個結果中的鏈接)在您的文章提示

2

的意見。例如,詹姆斯泰勒建議製作邊緣效應好壞位置的索引。我喜歡這個想法。一個非常強大的方法是利用numpy的廣播功能爲你做檢查。像這樣的方法的優點是能夠定義「非傳統」船舶,也就是說船舶的形狀不僅僅是線性的。

由於教學原因,我打算髮佈一個完整的解決方案,也就是說,我希望它對你有所幫助。做家庭作業,請自己編寫解決方案 - 但請從下面的答案中獲得答案。你會注意到我以一個「非傳統」的U形船作爲例子。

import numpy as np 

# Define the problem 
N = 10 
msl = 4 # max_ship_length 

# Reserve the boards 
BOARD = np.zeros((N,N)) 
CHECK = np.zeros((N+msl,N+msl)) 

# Mark the positions outside the board as bad 
CHECK[:N,:N] = 1 

# Define some ships 
battleship = np.array([[0,1,2,3],[0,0,0,0]]) 
patrol = np.array([[0,1],[0,0]]) 
uboat = np.array([[0,0,1,2,2],[1,0,0,0,1]]) 
v_idx = [1,0] 

def try_place(location, ship, color): 
    location = np.reshape(location,(2,1)) 
    idx = zip(location+ship) 
    if CHECK[idx].all() and not BOARD[idx].any(): 
     BOARD[idx] = color 
     return True 
    return False 

def random_spot(): return np.random.random_integers(0,N-1,2) 

# Check some random locations for ships and place them if possible 
for _ in xrange(3): 
    try_place(random_spot(), patrol, 1)    # Horz. patrol boat 
    try_place(random_spot(), battleship, 2)   # Horz. battleship 
    try_place(random_spot(), battleship[v_idx], 2) # Vertical battleship 
    try_place(random_spot(), uboat, 3)    # Horz. UBoat 

您可以用可視化pylab

import pylab as plt 
plt.matshow(BOARD) 
plt.show() 

enter image description here