2016-06-12 12 views
1
worldArray = [["." for i in range(5)] for i in range(5)] 

Dies erzeugt eine Karte, die ich für mein Spiel verwenden kann. Es sollte etwas wie folgt aussehen:Wie ändern Sie die Werte mehrerer Indizes?

[['.', '.', '.', '.', '.'], 
['.', '.', '.', '.', '.'], 
['.', '.', '.', '.', '.'], 
['.', '.', '.', '.', '.'], 
['.', '.', '.', '.', '.']] 

Lassen Sie uns sagen, dass die '.' eine Kachel Gras darstellt. Wenn ich stattdessen eine bestimmte Anzahl von Indizes zu '~' ersetzen möchte, um eine Wasserkachel darzustellen, was wäre der einfachste Weg? Ich möchte die Karte ein wenig wie folgt aussehen:

[['.', '.', '.', '.', '.'], 
['.', '.', '.', '.', '.'], 
['.', '.', '.', '.', '.'], 
['~', '~', '.', '.', '.'], 
['~', '~', '~', '.', '.']] 

Ich weiß, dass ich manuell durchgehen können und jedes bestimmten Index der '~' Fliese zu zeigen, ändern, aber die eigentliche Karte im Spiel I verwenden 40 x 40 statt - - was die Aufgabe des individuellen Ersetzens jedes Indexes ein wenig mühsam und überflüssig machen würde. Ich möchte in der Lage sein zu definieren, welche Kacheln ich ersetzen möchte, d. H. Reihe 4, Spalten 1 - 2; Zeile 5, Spalten 1 - 3. Wie könnte ich das tun?

Antwort

1

Sie könnten eine Hilfsfunktion schreiben

def replace_at_position(world_array, row_col_dict, repl_char): 
    """ 
    Use row_col_dict in format of {row : (startOfRange, endOfRange)} to replace the characters 
    inside the specific range at the specific row with repl_char 
    """ 

    for row in row_col_dict.keys(): 
     startPos, endPos = row_col_dict[row] 

     for i in range(startPos, endPos): 
      worldArray[row][i] = repl_char 
    return worldArray 

Sie können es wie folgt verwenden:

worldArray = [["." for i in range(10)] for j in range(5)] 

# replace row 2 (the third row) colums 0-4 (inclusive, exclusive, like range) with character '~' 
worldArray = replace_at_position(worldArray, {2 : (0,10)}, '~') 

#replace row 1 (the second row) colums 0-5 (inc, exc, like range) with character '~' 
worldArray = replace_at_position(worldArray, {1 : (0, 5)}, '~') 

pprint.pprint(worldArray) 

Dies führt zu:

[['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'], 
['~', '~', '~', '~', '~', '.', '.', '.', '.', '.'], 
['~', '~', '~', '~', '~', '~', '~', '~', '~', '~'], 
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.'], 
['.', '.', '.', '.', '.', '.', '.', '.', '.', '.']] 
0

ich eine Funktion definieren würde, die zurückgibt ob es ~ statt . machen soll.

""" 
Determines if the game position is regular or not 
""" 
def isRegular(x,y): 
    # Only replace Row 4 column 1 and 2 with ~ 
    return not (x==4 and y in [1,2]) 

worldArray = [["." if isRegular(x,y) else "~" for x in range(5) ] for y in range(5)] 

Sie können die Funktion nach Ihren Wünschen ändern.

3

Scheibe Notation ist für dieses perfekt:

from functools import partial 

def tile(icon, row, col_start, col_end): 
    worldArray[row][col_start:col_end] = icon * (col_end - col_start) 

water = partial(tile, '~') 
mountain = partial(tile, '^') 

water(3, 0, 2) 
water(4, 0, 3) 
+0

Hoppla, ich habe die Frage falsch gelesen. Dachte über zufällige Zeilen/Spalten (+1) –

0

Auf der Grundlage Ihrer Frage, die ich warf zusammen eine einfache Funktion, die Sie ausführen können. Fühlen Sie sich frei, um es in die IDLE-Konsole zu kopieren und einzufügen:

>>> def a(): 
global worldArray 
b = 1 
while b < 2: 
    c = (int(input('Row #: ')),int(input('Column-Leftbound: ')),int(input('Column-Rightbound: '))) 
    worldArray[c[0]][c[1]] = '~' 
    worldArray[c[0]][c[2]] = '~' 
    d = c[2] - c[1] 
    for i in range(d): 
     worldArray[c[0]][c[1]+i] = '~' 
    print(worldArray) 
    b = int(input('b now equals: ')) 
>>> a() #This line is for you to call the function at the console 

Bewahren Sie diese Dinge im Auge:

Legitime Zeilen- und Spaltennummern sind von: 0-4.

Um die while-Schleife zu beenden, müssen Sie den Wert von b zurücksetzen. Sie bleiben in der Schleife, wenn Sie einen Wert kleiner als 2 eingeben. Lassen Sie mich wissen, ob das hilft. Ich habe versucht, es sehr einfach zu halten.

.

.

Als Randbemerkung,

worldArray = [[ "" für i im Bereich (5)] für i im Bereich (5)]

erzeugt keine nette und saubere Matrix für mich.

Verwandte Themen