Obecnie pracuję nad edytorem map do gry w grze pygame, używając map kafelkowych. Poziom składa się z bloków w następującej strukturze (choć znacznie większej):
level1 = (
(1,1,1,1,1,1)
(1,0,0,0,0,1)
(1,0,0,0,0,1)
(1,0,0,0,0,1)
(1,0,0,0,0,1)
(1,1,1,1,1,1))
gdzie „1” to blok, który jest ścianą, a „0” to blok, który jest pustym powietrzem.
Poniższy kod jest w zasadzie tym, który obsługuje zmianę typu bloku:
clicked = pygame.mouse.get_pressed()
if clicked[0] == 1:
currLevel[((mousey+cameraY)/60)][((mousex+cameraX)/60)] = 1
Ale ponieważ poziom jest przechowywany w krotce, nie jestem w stanie zmienić wartości różnych bloków. Jak mogę w prosty sposób zmieniać różne wartości na poziomie?
//
zamiast tylko/
dlatego, że w Pythonie 3/
wykonasz dzielenie zmiennoprzecinkowe i spieprzysz swój kod.Odpowiedzi:
Konwertuj krotkę na listę:
Konwertuj listę na krotkę:
źródło
p list(...)
zamiast tego.Masz krotkę krotek.
Aby przekonwertować każdą krotkę na listę:
--- LUB ---
A po zakończeniu edycji po prostu przekonwertuj je z powrotem:
--- LUB --- (Dzięki @jamylak)
Możesz także użyć tablicy numpy:
Do manipulowania:
źródło
Możesz mieć listę list. Konwertuj krotkę krotek na listę list, używając:
lub
i odpowiednio je zmodyfikuj.
Ale tablica numpy jest fajniejsza.
źródło
Aby przekonwertować krotki na listę
(Pomiędzy krotkami w danym pytaniu brakowało przecinków, dodano je, aby zapobiec komunikatowi o błędzie)
Metoda 1:
Metoda 2:
Metoda 1 zajęła --- 0,0019991397857666016 sekund ---
Metoda 2 zajęła --- 0,0010001659393310547 sekund ---
źródło
Dlaczego nie spróbujesz przekonwertować jego typu z krotki na listę i odwrotnie?
źródło
Obie odpowiedzi są dobre, ale mała rada:
Krotki są niezmienne, co oznacza, że nie można ich zmienić. Więc jeśli musisz manipulować danymi, lepiej przechowywać dane na liście, zmniejszy to niepotrzebny narzut.
W twoim przypadku wyodrębnij dane do listy, jak pokazuje eumiro, a po modyfikacji stwórz podobną krotkę o podobnej strukturze, co odpowiedź udzielona przez Schoolboy.
Również zgodnie z sugestią użycie tablicy numpy jest lepszą opcją
źródło
numpy
zapewni najszybsze rozwiązanie do pracy z tego typu danymi.Listę do Tuple i wstecz można wykonać jak poniżej
źródło
Możesz znacznie przyspieszyć swoje rzeczy, jeśli użyjesz tylko jednej listy zamiast listy list. Jest to oczywiście możliwe tylko wtedy, gdy wszystkie twoje wewnętrzne listy są tego samego rozmiaru (co jest prawdą w twoim przykładzie, więc po prostu to zakładam).
Możesz być jeszcze szybszy, jeśli użyjesz pola bitowego zamiast listy:
z
Ale działa to tylko wtedy, gdy twoje pola zawierają tylko 0 lub 1, oczywiście. Jeśli potrzebujesz więcej wartości, musisz połączyć kilka bitów, co znacznie skomplikuje problem.
źródło