Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Programming
Gamedevelopment

Menciptakan Kehidupan: Game Kehidupan Conway

by
Difficulty:IntermediateLength:LongLanguages:

Indonesian (Bahasa Indonesia) translation by Kholisa Nurrahmah (you can also view the original English article)

Kadang-kadang bahkan seperangkat aturan dasar sederhana dapat memberi Anda hasil yang sangat menarik. Dalam tutorial kali ini kita akan membangun mesin inti Game of Life Conway dari dasar sampai selesai.

Catatan: Meskipun tutorial ini ditulis menggunakan C# dan XNA, Anda harus dapat menggunakan teknik dan konsep yang sama di hampir semua lingkungan pengembangan game 2D.


Pengantar

Conway's Game of Life adalah automaton seluler yang dibuat pada 1970-an oleh seorang matematikawan Inggris bernama, baik, John Conway.

Dengan adanya sel-sel dua dimensi sel, dengan beberapa "hidup" atau "hidup" dan yang lain "mati" atau "mati", dan seperangkat aturan yang mengatur bagaimana mereka menjadi hidup atau mati, kita dapat memiliki "bentuk kehidupan" yang menarik "terungkap tepat di depan kita. Jadi, dengan hanya menggambar beberapa pola ke grid kami, dan kemudian memulai simulasi, kita dapat menyaksikan bentuk kehidupan dasar berevolusi, menyebar, mati, dan akhirnya stabil. Unduh file sumber akhir, atau lihat demo di bawah ini:

Sekarang, "Game of Life" ini tidak sepenuhnya "game" - itu lebih merupakan mesin, terutama karena tidak ada pemain dan tidak ada gol, itu hanya berkembang berdasarkan pada kondisi awalnya. Meskipun demikian, ini sangat menyenangkan untuk dimainkan, dan ada banyak prinsip desain game yang dapat diterapkan pada pembuatannya. Jadi, tanpa basa-basi lagi, mari kita mulai!

Untuk tutorial ini, saya melanjutkan dan membuat semuanya di XNA karena itulah yang paling nyaman bagi saya. (Ada panduan untuk memulai dengan XNA di sini, jika Anda tertarik.) Namun, Anda harus dapat mengikuti dengan lingkungan pengembangan game 2D apa pun yang Anda kenal.


Membuat Cell (Sel)

Elemen paling dasar dalam Game of Life Conway adalah sel, yang merupakan "bentuk kehidupan" yang membentuk dasar dari keseluruhan simulasi. Setiap sel dapat berada di salah satu dari dua negara: "hidup" atau "mati". Demi konsistensi, kami akan tetap menggunakan kedua nama tersebut untuk status sel untuk sisa tutorial ini.

Sel-sel tersebut tidak bergerak, mereka hanya mempengaruhi tetangga mereka berdasarkan keadaan mereka saat ini.

Sekarang, dalam hal memprogram fungsi mereka, ada tiga perilaku yang perlu kita berikan:

  1. Mereka perlu melacak posisi, batas, dan status mereka, sehingga mereka dapat diklik dan digambar dengan benar.
  2. Mereka perlu beralih antara hidup dan mati ketika diklik, yang memungkinkan pengguna untuk benar-benar membuat hal menarik terjadi.
  3. Mereka harus digambarkan sebagai putih atau hitam jika mereka mati atau hidup, masing-masing.

Semua hal di atas dapat diselesaikan dengan membuat kelas Cell, yang akan berisi kode di bawah ini:


Grid dan Aturannya

Sekarang setiap sel akan berperilaku dengan benar, kita perlu membuat grid yang akan menahan mereka semua, dan menerapkan logika yang memberi tahu masing-masing apakah itu akan menjadi hidup, tetap hidup, mati, atau tetap mati (tidak ada zombie!).

Aturannya cukup sederhana:

  1. Setiap sel hidup dengan kurang dari dua tetangga hidup mati, seolah-olah disebabkan oleh populasi yang kurang.
  2. Setiap sel hidup dengan dua atau tiga tetangga hidup hidup ke generasi berikutnya.
  3. Setiap sel hidup dengan lebih dari tiga tetangga hidup mati, seolah-olah oleh kepadatan.
  4. Setiap sel mati dengan tepat tiga tetangga hidup menjadi sel hidup, seolah-olah dengan reproduksi.

Berikut panduan visual cepat untuk aturan ini pada gambar di bawah ini. Setiap sel yang disorot oleh panah biru akan dipengaruhi oleh aturan bernomor yang terkait di atas. Dengan kata lain, sel 1 akan mati, sel 2 akan tetap hidup, sel 3 akan mati, dan sel 4 akan menjadi hidup.

Jadi, ketika simulasi menjalankan pembaruan game pada interval waktu yang konstan, grid akan memeriksa masing-masing aturan ini untuk semua sel di grid. Itu bisa diselesaikan dengan menempatkan kode berikut di kelas baru yang akan saya sebut Grid:

Satu-satunya hal yang hilang dari sini adalah metode GetLivingNeighbors ajaib, yang hanya menghitung berapa banyak tetangga sel saat ini yang hidup. Jadi, mari tambahkan metode ini ke kelas Grid kami:

Perhatikan bahwa dalam kode di atas, pernyataan if pertama dari setiap pasangan hanya memeriksa bahwa kita tidak berada di tepi grid. Jika kami tidak memiliki pemeriksaan ini, kami akan menjalankan beberapa Pengecualian melebihi batas-batas array. Juga, karena ini akan menyebabkan count tidak pernah bertambah ketika kita memeriksa melewati tepi, itu berarti permainan "mengasumsikan" ujung-ujungnya mati, jadi itu setara dengan memiliki perbatasan permanen putih, sel-sel mati di sekitar jendela permainan kami.


Memperbarui Grid dalam Waktu-Langkah Diskrit

Sejauh ini, semua logika yang kami terapkan adalah suara, tetapi tidak akan berfungsi dengan baik jika kami tidak berhati-hati untuk memastikan simulasi kami berjalan dalam langkah waktu yang berbeda. Ini hanyalah cara mewah untuk mengatakan bahwa semua sel kita akan diperbarui pada waktu yang sama, demi konsistensi. Jika kita tidak mengimplementasikan ini, kita akan mendapatkan perilaku aneh karena urutan pemeriksaan sel akan menjadi masalah, jadi aturan ketat yang baru saja kita tetapkan akan berantakan dan kekacauan kecil akan terjadi.

Misalnya, perulangan kami di atas memeriksa semua sel dari kiri ke kanan, jadi jika sel di sebelah kiri yang baru saja kami centang menjadi hidup, ini akan mengubah jumlah sel di tengah yang sekarang kami periksa dan mungkin membuatnya menjadi hidup. Tapi, jika kita memeriksa dari kanan ke kiri, sel di sebelah kanan mungkin mati, dan sel di sebelah kiri belum hidup, jadi sel tengah kita akan tetap mati. Ini buruk karena tidak konsisten! Kita harus dapat memeriksa sel-sel dalam urutan acak yang kita inginkan (seperti spiral!) Dan langkah selanjutnya harus selalu identik.

Untungnya, ini sangat mudah diterapkan dalam kode. Yang kita butuhkan adalah memiliki grid sel kedua dalam memori untuk keadaan selanjutnya dari sistem kami. Setiap kali kita menentukan keadaan sel selanjutnya, kita menyimpannya di grid kedua kita untuk keadaan selanjutnya dari keseluruhan sistem. Kemudian, ketika kami menemukan keadaan selanjutnya dari setiap sel, kami menerapkan semuanya pada saat yang bersamaan. Jadi kita dapat menambahkan array 2D boolean nextCellStates sebagai variabel pribadi, dan kemudian menambahkan metode ini ke kelas Grid:

Akhirnya, jangan lupa untuk memperbaiki metode Update Anda di atas sehingga menetapkan hasilnya ke keadaan berikutnya daripada yang sekarang, lalu panggil SetNextState di bagian paling akhir dari metode Update, tepat setelah loop selesai.


Menggambar Grid

Sekarang kita telah menyelesaikan bagian-bagian rumit dari logika grid, kita harus bisa menggambarnya ke layar. Grid akan menggambar setiap sel dengan memanggil metode penarikan mereka satu per satu, sehingga semua sel hidup akan menjadi hitam, dan yang mati akan menjadi putih.

Grid sebenarnya tidak perlu menggambar apa pun, tetapi jauh lebih jelas dari perspektif pengguna jika kita menambahkan beberapa garis grid. Ini memungkinkan pengguna untuk lebih mudah melihat batas-batas sel, dan juga mengkomunikasikan skala rasa, jadi mari kita buat metode Draw sebagai berikut:

Perhatikan bahwa dalam kode di atas, kami mengambil satu piksel dan meregangkannya untuk membuat garis yang sangat panjang dan tipis. Mesin permainan khusus Anda mungkin menyediakan metode DrawLine sederhana di mana Anda dapat menentukan dua titik dan memiliki garis dengan digambar di antara mereka, yang akan membuatnya lebih mudah daripada di atas.


Menambahkan Logika Game Tingkat Tinggi

Pada titik ini, kita memiliki semua bagian dasar yang kita butuhkan untuk membuat game berjalan, kita hanya perlu menyatukannya. Jadi, sebagai permulaan, di kelas utama permainan Anda (yang memulai semuanya), kita perlu menambahkan beberapa konstanta seperti dimensi grid dan framerate (seberapa cepat pembaruannya), dan semua hal lain yang kita butuhkan seperti gambar piksel tunggal, ukuran layar, dan sebagainya.

Kami juga perlu menginisialisasi banyak dari hal-hal ini, seperti membuat grid, mengatur ukuran jendela untuk game, dan memastikan mouse terlihat sehingga kita dapat mengklik sel. Tetapi semua hal ini khusus untuk mesin dan tidak terlalu menarik, jadi kita akan langsung melewatinya dan mendapatkan hal-hal yang baik. (Tentu saja, jika Anda mengikuti di XNA, Anda dapat mengunduh kode sumber untuk mendapatkan semua rinciannya.)

Sekarang kita sudah menyiapkan semuanya dan siap untuk pergi, kita seharusnya bisa menjalankan permainan! Tapi tidak terlalu cepat, karena ada masalah: kita tidak bisa melakukan apa-apa karena game selalu berjalan. Pada dasarnya tidak mungkin untuk menggambar bentuk tertentu karena mereka akan pecah saat Anda menggambarnya, jadi kita benar-benar harus dapat menghentikan game. Akan bagus juga kalau kita bisa membereskan kisi-kisi jika itu menjadi berantakan, karena ciptaan kita akan sering tumbuh di luar kendali dan meninggalkan kekacauan di belakang.

Jadi, mari tambahkan beberapa kode untuk menjeda game kapan saja spasi ditekan, dan hapus layar jika spasi ditekan:

Ini juga akan membantu jika kami membuatnya sangat jelas bahwa permainan itu dihentikan sementara, jadi saat kami menulis metode Draw kami, mari tambahkan beberapa kode untuk membuat latar belakang menjadi merah, dan tulis "Dijeda" di latar belakang:

Itu dia! Semuanya sekarang harus bekerja, jadi Anda bisa memberinya pusaran, menggambar beberapa bentuk kehidupan dan melihat apa yang terjadi! Pergi dan jelajahi pola menarik yang dapat Anda buat dengan merujuk ke halaman Wikipedia lagi. Anda juga dapat bermain dengan framerate, ukuran sel dan dimensi grid untuk menyesuaikannya dengan keinginan Anda.


Menambah Perbaikan

Pada titik ini, permainan berfungsi penuh dan tidak perlu malu untuk menyebutnya sehari. Tapi satu gangguan yang mungkin Anda perhatikan adalah bahwa klik mouse Anda tidak selalu terdaftar ketika Anda mencoba memperbarui sel, jadi ketika Anda mengklik dan menyeret mouse Anda di grid itu akan meninggalkan garis putus-putus di belakang daripada padat satu. Ini terjadi karena tingkat di mana sel memperbarui juga tingkat di mana mouse sedang diperiksa, dan itu terlalu lambat. Jadi, kita hanya perlu memisahkan tingkat di mana pembaruan game, dan tingkat di mana membaca masukan.

Mulai dengan menentukan tingkat pembaruan dan framerate secara terpisah di kelas utama:

Sekarang, ketika menginisialisasi game, gunakan framerate (FPS) untuk menentukan seberapa cepat ia akan membaca input dan gambar mouse, yang seharusnya menjadi 60 FPS mulus yang bagus setidaknya:

Kemudian, tambahkan pengatur waktu ke kelas Grid Anda, sehingga hanya akan diperbarui saat diperlukan, terlepas dari framerate:

Sekarang, Anda harus dapat menjalankan game dengan kecepatan apa pun yang Anda inginkan, bahkan pembaruan 5 per detik yang sangat lambat sehingga Anda dapat secara hati-hati melihat simulasi Anda terungkap, sementara masih dapat menarik garis halus yang bagus pada framerate yang solid.


Kesimpulan

Anda sekarang memiliki Game of Life yang halus dan fungsional di tangan Anda, tetapi jika Anda ingin menjelajahinya lebih lanjut, selalu ada lebih banyak tweak yang dapat Anda tambahkan ke dalamnya.Sebagai contoh, grid saat ini mengasumsikan bahwa di luar ujungnya, semuanya mati. Anda bisa memodifikasinya sedemikian rupa sehingga gridnya membungkus, jadi glider akan terbang selamanya! Tidak ada kekurangan variasi pada game populer ini, jadi biarkan imajinasimu menjadi liar.

Terima kasih telah membaca, semoga Anda telah belajar beberapa hal berguna hari ini!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.