Saat ini saya sedang mengerjakan editor peta untuk game di pygame, menggunakan peta ubin. Level dibangun dari balok dalam struktur berikut (meskipun jauh lebih besar):
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))
di mana "1" adalah blok yang merupakan tembok dan "0" adalah blok yang kosong.
Kode berikut pada dasarnya adalah yang menangani perubahan tipe blok:
clicked = pygame.mouse.get_pressed()
if clicked[0] == 1:
currLevel[((mousey+cameraY)/60)][((mousex+cameraX)/60)] = 1
Tetapi karena level disimpan dalam tuple, saya tidak dapat mengubah nilai dari blok yang berbeda. Bagaimana cara saya mengubah nilai yang berbeda di level dengan cara yang mudah?
//
bukan hanya/
karena di Python 3,/
akan melakukan pembagian titik mengambang dan mengacaukan kode Anda.Jawaban:
Konversikan tuple ke daftar:
Konversi daftar menjadi tuple:
sumber
p list(...)
saja.Anda memiliki tuple tuple.
Untuk mengonversi setiap tuple ke daftar:
--- ATAU ---
Dan setelah Anda selesai mengedit, cukup konversikan kembali:
--- ATAU --- (Terima kasih @jamylak)
Anda juga dapat menggunakan larik numpy:
Untuk memanipulasi:
sumber
Anda dapat memiliki daftar daftar. Ubah tupel tupel Anda menjadi daftar daftar menggunakan:
atau
dan memodifikasinya sesuai.
Tapi array numpy lebih dingin.
sumber
Untuk mengonversi tuple ke daftar
(Koma tidak ada di antara tupel dalam pertanyaan yang diberikan, ditambahkan untuk mencegah pesan kesalahan)
Metode 1:
Metode 2:
Metode 1 mengambil --- 0,0019991397857666016 detik ---
Metode 2 mengambil --- 0,0010001659393310547 detik ---
sumber
Mengapa Anda tidak mencoba mengubah tipenya dari tuple ke daftar dan sebaliknya.
sumber
Kedua jawaban itu baik, tetapi sedikit saran:
Tuples tidak berubah, yang menyiratkan bahwa mereka tidak dapat diubah. Jadi, jika Anda perlu memanipulasi data, lebih baik menyimpan data dalam daftar, itu akan mengurangi overhead yang tidak perlu.
Dalam kasus Anda, ekstrak data ke daftar, seperti yang ditunjukkan oleh eumiro, dan setelah memodifikasi buat tuple serupa struktur yang sama sebagai jawaban yang diberikan oleh Schoolboy.
Juga seperti yang disarankan menggunakan array numpy adalah opsi yang lebih baik
sumber
numpy
akan memberikan solusi tercepat untuk bekerja dengan tipe data ini.Daftar ke Tuple dan kembali dapat dilakukan seperti di bawah ini
sumber
Anda dapat secara dramatis mempercepat barang-barang Anda jika Anda hanya menggunakan satu daftar dan bukan daftar daftar. Ini tentu saja mungkin hanya jika semua daftar batin Anda memiliki ukuran yang sama (yang benar dalam contoh Anda, jadi saya hanya menganggap ini).
Dan Anda bisa lebih cepat jika menggunakan bitfield daripada daftar:
dengan
Tapi itu hanya berfungsi jika bidang Anda hanya berisi 0 atau 1 saja. Jika Anda membutuhkan lebih banyak nilai, Anda harus menggabungkan beberapa bit yang akan membuat masalah lebih rumit.
sumber