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

Mencipta Kehidupan: Permainan Conway Kehidupan 

by
Difficulty:IntermediateLength:LongLanguages:

Malay (Melayu) translation by Meyria (you can also view the original English article)

Kadang-kadang walaupun set aturan asas mudah dapat memberi anda hasil yang sangat menarik. Dalam tutorial ini, kami akan membina enjin teras Conway's Life of the Game dari bawah ke atas.

Nota: Walaupun tutorial ini ditulis menggunakan C# dan XNA, anda sepatutnya dapat menggunakan teknik dan konsep yang sama dalam hampir semua persekitaran pembangunan permainan 2D.


Mukadimah

Permainan Conwey Hidup  adalah sebuah automaton selular yang dirancang pada tahun 1970-an oleh ahli matematik British yang bernama John Conway.

Memandangkan sel-sel grid dua dimensi, dengan beberapa "hidup" atau "hidup" dan lain-lain "mati" atau "mati", dan satu set peraturan yang mentadbir bagaimana mereka hidup atau mati, kita boleh mempunyai "bentuk kehidupan"  terungkap betul-betul di hadapan kita. Oleh itu, dengan hanya melukis beberapa pola ke grid kami, dan kemudian memulakan simulasi, kita dapat melihat bentuk kehidupan asas berkembang, menyebar, mati, dan akhirnya stabil. Muat turun fail sumber akhir, atau semak demo di bawah:

Sekarang, "Permainan Kehidupan" ini bukanlah "permainan" yang ketat - ia lebih banyak mesin, terutamanya kerana tidak ada pemain dan matlamat tidak, ia hanya berubah berdasarkan keadaan awalnya. Walau bagaimanapun, ia sangat menyeronokkan untuk dimainkan, dan terdapat banyak prinsip reka bentuk permainan yang boleh digunakan untuk penciptaannya. Oleh itu, tanpa sebarang masalah lagi, mari bermula!

Untuk tutorial ini, saya pergi ke hadapan dan membina segala-galanya di XNA kerana itulah yang saya paling selesa dengan. (Terdapat panduan untuk memulakan dengan XNA di sini, jika anda berminat.) Walau bagaimanapun, anda harus mengikuti bersama dengan mana-mana persekitaran pembangunan permainan 2D yang anda kenali.


Membuat Sel

Unsur paling asas dalam Game Life of Conway adalah sel-sel, yang merupakan "bentuk hidup" yang membentuk dasar simulasi keseluruhan. Setiap sel boleh berada di salah satu daripada dua negeri: "hidup" atau "mati". Demi konsistensi, kami akan berpegang kepada kedua-dua nama untuk keadaan sel untuk tutorial lain.

Sel tidak bergerak, mereka hanya menjejaskan jiran mereka berdasarkan keadaan semasa mereka.

Kini, dari segi pengaturcaraan fungsi mereka, terdapat tiga tingkah laku yang perlu kita berikan:

  1. Mereka perlu menjejaki kedudukan, batas, dan keadaan mereka supaya mereka boleh diklik dan dilukis dengan betul.
  2. Mereka perlu bertukar-tukar antara hidup dan mati apabila diklik, yang membolehkan pengguna membuat perkara yang menarik.
  3. Mereka perlu ditarik sebagai putih atau hitam jika mereka mati atau hidup.

Semua perkara di atas boleh dicapai dengan mencipta kelas Cell, yang akan mengandungi kod di bawah:


Grid dan Peraturannya

Sekarang bahawa setiap sel akan bertindak dengan betul, kita perlu membuat satu grid yang akan memegang mereka semua, dan melaksanakan logik yang memberitahu setiap orang sama ada ia harus hidup, terus hidup, mati atau tinggal mati (tiada zombie!).

Peraturannya agak mudah:

  1. Mana-mana sel hidup dengan kurang daripada dua jiran hidup mati, seolah-olah disebabkan oleh penduduk yang kurang.
  2. Mana-mana sel hidup dengan dua atau tiga jiran hidup hidup kepada generasi akan datang.
  3. Mana-mana sel hidup dengan lebih daripada tiga jiran hidup mati, seolah-olah oleh sesak.
  4. Mana-mana sel mati dengan betul-betul tiga jiran hidup menjadi sel hidup, seolah-olah melalui penghasilan semula.

Berikut adalah panduan visual cepat untuk peraturan ini dalam imej di bawah. Setiap sel yang diserlahkan oleh anak panah biru akan dipengaruhi oleh peraturan bernombor yang sepadan di atas. Dengan kata lain, sel 1 akan mati, sel 2 akan tetap hidup, sel 3 akan mati, dan sel 4 akan hidup.

Oleh itu, apabila simulasi permainan menjalankan kemas kini pada selang masa malar, grid akan memeriksa setiap peraturan ini untuk semua sel dalam grid. Itu boleh dicapai dengan meletakkan kod berikut dalam kelas baru yang saya panggil Grid:

Satu-satunya perkara yang kita hilang dari sini adalah kaedah GetLivingNeighbors sihir, yang hanya mengira berapa jiran sel semasa kini sedang hidup. Jadi, mari tambah kaedah ini untuk kelas Grid kami:

Perhatikan bahawa dalam kod di atas, penyataan pertama jika setiap pasangan hanya memeriksa bahawa kami tidak berada di tepi grid. Jika kami tidak mempunyai pemeriksaan ini, kami akan masuk ke dalam beberapa Pengecualian daripada melebihi batas array. Juga, kerana ini akan mengira tidak pernah bertambah apabila kita memeriksa tepi tepi, ini bermakna permainan "mengandaikan" tepi mati, jadi ia setara dengan sempadan tetap putih, sel mati di sekitar tingkap permainan kami.


Mengemas kini Grid dalam Tempoh Masa Diskret

Setakat ini, semua logik yang kami telah dilaksanakan adalah baik, tetapi ia tidak akan berkelakuan dengan baik jika kami tidak berhati-hati untuk memastikan simulasi kami berjalan dalam langkah masa diskret. Ini hanya cara yang baik untuk mengatakan bahawa semua sel kita akan dikemas kini pada masa yang sama, demi konsistensi. Sekiranya kita tidak melaksanakannya, kita akan mendapat tingkah laku yang pelik kerana pesanan di mana sel-sel diperiksa adalah perkara penting, jadi peraturan yang ketat yang kita tetapkan akan hancur dan kekacauan kecil akan berlaku.

Sebagai contoh, gelung kami di atas memeriksa semua sel dari kiri ke kanan, jadi jika sel di sebelah kiri kami hanya memeriksa hidup, ini akan mengubah kiraan sel di tengah kita kini menyemak dan mungkin menjadikannya hidup . Tetapi, jika kami memeriksa dari kanan ke kiri, sel di sebelah kanan mungkin mati, dan sel di sebelah kiri tidak lagi hidup, jadi sel tengah kami akan tetap mati. Ini tidak baik kerana ia tidak konsisten! Kita sepatutnya dapat memeriksa sel-sel dalam apa-apa perintah rawak yang kita mahu (seperti lingkaran!) Dan langkah seterusnya mestilah sama.

Nasib baik, ini sangat mudah untuk dilaksanakan dalam kod. Apa yang kita perlukan adalah mempunyai grid kedua sel dalam ingatan untuk keadaan seterusnya sistem kami. Setiap kali kita menentukan keadaan seterusnya sel, kita menyimpannya dalam grid kedua untuk keadaan sistem keseluruhan seterusnya. Kemudian, apabila kami menemui keadaan seterusnya setiap sel, kami menggunakannya pada masa yang sama. Jadi, kita boleh menambah array 2D daripada booleans nextCellStates sebagai pembolehubah peribadi, dan kemudian tambah kaedah ini kepada kelas Grid:

Akhir sekali, jangan lupa untuk membetulkan kaedah Kemas Kini anda di atas supaya ia menyerahkan hasilnya kepada keadaan seterusnya dan bukannya semasa, kemudian panggil SetNextState pada akhir kaedah Kemas kini, selepas selesai selesai.


Melukis Grid

Sekarang kita telah menyelesaikan bahagian-bahagian yang lebih rumit daripada logik grid, kita perlu dapat menariknya ke skrin. Grid akan menarik setiap sel dengan memanggil satu kaedah menarik mereka satu demi satu, supaya semua sel hidup akan menjadi hitam, dan yang mati akan menjadi putih.

Grid sebenar tidak perlu menarik apa-apa, tetapi jauh lebih jelas dari perspektif pengguna jika kita menambah beberapa garisan grid. Ini membolehkan pengguna lebih mudah melihat sempadan sel, dan juga menyampaikan skala rasa, jadi mari buat kaedah Draw seperti berikut:

Ambil perhatian bahawa dalam kod di atas, kami mengambil piksel tunggal dan meregangkannya untuk membuat garis yang sangat panjang dan nipis. Enjin permainan tertentu anda mungkin menyediakan kaedah DrawLine yang mudah di mana anda boleh menentukan dua mata dan mempunyai garis dengan menarik antara mereka, yang akan menjadikannya lebih mudah daripada yang di atas.


Menambah Logik Permainan Tahap Tinggi

Pada ketika ini, kami mendapat semua bahagian asas yang kami perlukan untuk membuat permainan berjalan, kami hanya perlu membawanya bersama. Jadi, untuk permulaan, dalam kelas utama permainan anda (yang memulakan segala-galanya), kita perlu menambah beberapa pemalar seperti dimensi grid dan framerate (seberapa cepat ia akan mengemaskini), dan semua perkara lain yang kita perlukan imej piksel tunggal, saiz skrin, dan sebagainya.

Kami juga perlu memulakan banyak perkara ini, seperti membuat grid, menetapkan saiz tetingkap untuk permainan, dan pastikan tetikus kelihatan supaya kita dapat mengklik pada sel. Tetapi semua perkara ini adalah enjin yang khusus dan tidak begitu menarik, jadi kami akan melangkau ke sana dan mendapatkan barangan yang baik. (Sudah tentu, jika anda mengikuti bersama di XNA, anda boleh memuat turun kod sumber untuk mendapatkan semua butiran.)

Sekarang bahawa kita mempunyai segala yang ditetapkan dan bersedia untuk pergi, kita sepatutnya dapat menjalankan permainan! Tetapi tidak begitu cepat, kerana ada masalah: kita tidak boleh melakukan apa-apa kerana permainan sentiasa berjalan. Pada dasarnya, mustahil untuk menarik bentuk tertentu kerana mereka akan terputus semasa anda menarik mereka, jadi kita benar-benar perlu dapat menjeda permainan. Ia juga bagus jika kita boleh membersihkan grid jika ia menjadi kacau, kerana ciptaan kita selalunya akan tumbuh dari kawalan dan meninggalkan kekacauan di belakang.

Jadi, mari tambahkan beberapa kod untuk menjeda permainan setiap kali bar ruang ditekan, dan kosongkan skrin jika backspace ditekan:

Ia juga akan membantu jika kami membuatnya sangat jelas bahawa permainan itu dijeda, oleh kerana kami menulis kaedah Draw kami, mari tambahkan beberapa kod untuk membuat latar belakang menjadi merah, dan tulis 'Dijeda' di latar belakang:

Itu sahaja! Segala-galanya kini harus berfungsi, sehingga anda dapat memberikannya, menggambar beberapa bentuk kehidupan dan melihat apa yang terjadi! Pergi dan terokai corak menarik yang anda boleh buat dengan merujuk kepada halaman Wikipedia lagi. Anda juga boleh bermain dengan framerate, saiz sel dan dimensi grid untuk menyesuaikannya mengikut keinginan anda.


Menambah Penambahbaikan

Pada ketika ini, permainan ini berfungsi sepenuhnya dan tidak ada rasa malu dalam memanggilnya sehari. Tetapi satu kejutan yang mungkin anda perhatikan ialah klik tetikus anda tidak selalu mendaftar apabila anda cuba mengemas kini sel, jadi apabila anda mengklik dan menyeret tetikus anda melintasi grid, ia akan meninggalkan garis putus-putus di belakang daripada pepejal satu. Ini berlaku kerana kadar di mana sel-sel mengemas kini juga kadar di mana tetikus sedang diperiksa, dan ia terlalu perlahan. Oleh itu, kita hanya perlu menanggalkan kadar di mana kemas kini permainan, dan kadar di mana bacaan input.

Mula dengan menentukan kadar kemas kini dan framerate secara berasingan di kelas utama:

Sekarang, apabila memulakan permainan, gunakan framerate (FPS) untuk menentukan berapa cepat ia akan membaca input dan lukisan tetikus, yang seharusnya menjadi 60 FPS licin yang bagus sekurang-kurangnya:

Kemudian, tambahkan pemasa ke kelas Grid anda, supaya ia hanya akan mengemaskini apabila perlu, secara berasingan daripada framerate:

Sekarang, anda harus dapat menjalankan permainan pada kelajuan apa sahaja yang anda mahukan, walaupun 5 kemas kini yang sangat perlahan setiap saat supaya anda dapat melihat dengan teliti simulasi anda, sementara masih dapat menarik garis-garis halus yang bagus pada framerate yang padat.


Kesimpulan

Anda kini mempunyai Game Life Hidup yang lancar dan berfungsi di tangan anda, tetapi sekiranya anda ingin meneroka lebih lanjut, sentiasa terdapat lebih banyak tweak yang anda boleh tambah kepadanya. Sebagai contoh, grid kini mengandaikan bahawa di luar tepinya, semuanya sudah mati. Anda boleh memodifikasikannya supaya grid itu dibalut, jadi luncur terbang akan terbang selama-lamanya! Tidak ada kekurangan variasi pada permainan popular ini, jadi biarkan imaginasi anda berjalan liar.

Terima kasih kerana membaca, saya harap anda telah mempelajari beberapa perkara yang 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.