1

次のような 10x10 のボードで戦艦ゲームを作成しています。

-------------------------------------------------
 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 の場合、ship は 88-89-90 の位置になり、90 は次の行の位置になるため適合しません (したがって、ship はボードから外れます)。

選択が 88 で、shipDir が垂直で、shipType が 3 の場合、ship は 88-98-108 の位置になり、108 がボードから外れるため、適合しません。

この関数は、選択された位置がボード上の別の船によって既に占有されている位置であるかどうかも確認します。

False船がボードの外にある場合、および船の位置がボード上の別の船になった場合、関数は戻る必要があります。それ以外の場合、関数は返さTrueれます。

誰でも助けることができますか?

4

2 に答える 2

3

投稿のコメントは、何をすべきかを示唆しています。たとえば、James Thiele は、エッジ効果の良い場所と悪い場所のインデックスを作成することを提案しています。私はこのアイデアが好きです。これを行う非常に強力な方法は、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()

ここに画像の説明を入力

于 2012-04-12T21:50:08.433 に答える
1

印刷したものだけでなく、内部でデータをどのように表現しているかを投稿する必要があります。

ただし、出力から、線形リストがあり、そこに何らかの要素を使用して、「船を含む」か「船を含まない」かを知ることができると思います。

アドバイスは、それを忘れて、機会を利用してオブジェクト指向コーディングについてさらに学ぶことです。これにより、たとえば、その内容を知る「ボード」クラスと「can_place_ship(self, <coord>, <shipsize>, <shiporientation>)」メソッドを作成できます。

ここで、OO 部分のこのチュートリアルを試してください: http://www.voidspace.org.uk/python/articles/OOP.shtml (Google の最初の結果からリンクを選んだだけです)

于 2012-04-12T18:26:53.533 に答える