2012-04-12 9 views
1

ich mit einem Brett ein Schlachtschiff Spiel erschaffe, die 10x10, die als solche suchen:Battleship Spiel in Platzierung Python Schiff gibt

------------------------------------------------- 
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 | 
------------------------------------------------- 

konnte ich dies mit meinem Code drucken, aber jetzt versuche ich um eine Funktion zu schreiben, die überprüft, ob die Wahl eine Position ist, an der ein Schiff innerhalb des Boards platziert werden kann.

Dies ist ein Hinweis, den ich bekommen habe, aber ich kann buchstäblich nicht herausfinden, wie man das löst.

Wenn die Wahl 88 ist, ist shipDir horizontal und shipType ist 3, dann passt Schiff nicht, da es Positionen 88-89-90 und 90 eine Position in der nächsten Zeile nimmt (und so wird Schiff aus dem sein Tafel).

Wenn die Wahl 88 ist, ist shipDir vertikal und shipType ist 3, dann auch Schiff passt nicht, da es Positionen 88-98-108 nehmen wird und 108 ist aus dem Board heraus.

Diese Funktion prüft auch, ob die gewählte Position eine Position ist, die bereits von einem anderen Schiff auf der Platine eingenommen wurde.

Funktion sollte False zurückkehren, wenn ein Schiff aus dem Board ist und wenn ein Schiff Position ein anderes Schiff auf dem Brett genommen wird. Die Funktion sollte andernfalls True zurückgeben.

Kann jemand helfen?

+10

Ich spüre etwas, "was haben Sie versucht?" in der Luft – icecrime

+0

um ganz ehrlich zu sein Ich weiß nicht, wo ich anfangen soll – user1329880

+0

Ist das Hausaufgaben? – GWW

Antwort

1

Sie sollten angeben, wie Sie die Daten intern darstellen, nicht nur, was Sie ausdrucken.

Aber von Ihrer Ausgabe, stelle ich mir vor, Sie haben eine lineare Liste, und verwenden Sie eine Art von Element in dort zu wissen, ob es "enthält ein Schiff" oder "kein Schiff enthalten".

Der Rat ist, es zu vergessen, und nutzen Sie die Möglichkeit, mehr über Object Oriented-Programmierung zu lernen - so dass Sie eine "Board" -Klasse, die über ihren Inhalt wissen kann, und eine "can_place_ship(self, <coord>, <shipsize>, <shiporientation>)" -Methode zum Beispiel haben .

Hier versuchen dieses Tutorial für den OO Teil: http://www.voidspace.org.uk/python/articles/OOP.shtml (nur einen Link von Googles erste Ergebnisse gepflückt)

2

Die Kommentare in Ihrem Beitrag Hinweis auf das, was Sie tun sollten. Zum Beispiel schlägt James Thiele vor, einen Index für gute und schlechte Orte für Kanteneffekte zu erstellen. Ich mag diese Idee. Eine unglaublich leistungsstarke Möglichkeit, dies zu tun, ist es, die Leistung von numpy Broadcasting nutzen, um die Überprüfung für Sie zu tun. Der Vorteil einer solchen Methode liegt in der Möglichkeit, "nicht-traditionelle" Schiffe zu definieren, also Schiffe, die nicht einfach linear sind.

Ich werde aus pädagogischen Gründen unten eine vollständige Lösung posten, das heißt, ich möchte, dass es nützlich für Sie ist, von zu lernen. Wenn Sie Hausaufgaben machen, kodieren Sie bitte die Lösung selbst - aber nehmen Sie, was Sie können, aus der Antwort unten. Sie werden feststellen, dass ich ein "nicht-traditionelles" U-förmiges Schiff als ein Beispiel definiere.

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 

Sie können die Karte mit pylab

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

enter image description here