2017-12-12 4 views
0

Ich und mein Partner, wir müssen ein Spiel in Python erstellen. Wir sind absolute Anfänger, es tut uns leid, wenn wir Fragen stellen, die für Python-Pros vielleicht sehr unklug klingen.Python: Wie wird der Inhalt einer Zelle in unserem Spielfeld abgerufen?

Hier ist unser Code ein Feld mit einem Bereich von 7x7 zu erstellen:

import string 

class board: 
    def __init__(self, width): 
     self.w = width 
     self.board = [[[] for i in range(width)] for b in range(width)] 

    def __setitem__(self, coords, val): 
     self.board[coords[0]][coords[-1]] = [val] 

    def __repr__(self): 
     return ' '+' '.join(list(string.ascii_lowercase[:self.w]))+"\n"+'\n'.join(string.ascii_lowercase[a]+' '.join(str(i) for i in b) for a, b in enumerate(self.board)) 

board = board(7) 
board[(3, 3)] = 'X' 

Bis jetzt funktioniert es (nicht perfekt, aber gut genug, um mit ihm zu gehen).

Ich habe jetzt einige Fragen. Wenn es Ihnen nichts ausmacht, können Sie einfach einen von ihnen beantworten. Wir wären sehr dankbar.

  1. Der Titel der Spalten und Zeilen sind Buchstaben (a-g), wie invertiere ich sie in Zahlen?

  2. Was muss getan werden, um den Inhalt einer bestimmten "Zelle" zu erhalten? z.B. Wenn die Zelle in 3,3 den Inhalt 'X' hat, wie bekomme ich nur das 'X'?

Vielen Dank Jungs!

+0

Seine definitiv schlechte Praxis Ihr 'zu nennen objects' die gleichen wie ihre' classes'. – RottenCandy

Antwort

0

das Objekt zu erhalten, müssen Sie Methode definieren __getitem__, für Ihren Fall:

class board: 
    def __init__(self, width): 
     self.w = width 
     self.board = [[[] for i in range(width)] for b in range(width)] 

    def __setitem__(self, coords, val): 
     self.board[coords[0]][coords[-1]] = [val] 

    def __getitem__(self, item): 
     row, col = item 
     return self.board[row][col] 

    def __repr__(self): 
     return ' ' + ' '.join(list(map(str, range(self.w)))) + "\n" + '\n'.join(str(a) + ' '.join(str(i) for i in b) for a, b in enumerate(self.board)) 


board = board(7) 
board[(3, 3)] = 'X' 

print(board[(3, 3)]) 
# ['X'] 

print('{board!r}'.format(board=board) 

Und Sie haben das Board wie folgt aussieht:

0 1 2 3 4 5 6 
0[] [] [] [] [] [] [] 
1[] [] [] [] [] [] [] 
2[] [] [] [] [] [] [] 
3[] [] [] ['X'] [] [] [] 
4[] [] [] [] [] [] [] 
5[] [] [] [] [] [] [] 
6[] [] [] [] [] [] [] 

BTW, warum Sie den Wert definieren eine Liste in __setitem__? Ich änderte auch die Codes für __repr__, um es die Zahl anstelle der Buchstaben darzustellen. Eigentlich sollten Sie dafür __str__ method not __repr__ verwenden.

+0

Vielen Dank! –

+0

Entschuldigung, ich bin neu in diesem Forum. Ich habe es jetzt akzeptiert. –

-1

Für die erste, mit der Nutzung der Funktion ord():

ord('a') # => 97 
ord('g') # => 103 
ord("letter of column/row") - ord('a') # will return index of column/row 
ord('g') - ord('a') # this will return 6 
+0

Die Bezeichner werden in der '__repr __()' Methode direkt als Buchstaben gesetzt. Wenn Sie 'ord()' verwenden, um sie dann in Zahlen umzuwandeln, erscheint dies ein bisschen von hinten nach vorne. – SiHa

Verwandte Themen