ROB Bowden: Hi. Aku Rob, dan saya berharap Anda game untuk permainan 15. Sekarang, ada empat fungsi yang Anda butuhkan untuk melaksanakan program ini - init, menggambar, bergerak, dan menang. Jadi, mari kita lihat init. Di sini, kita melihat hal pertama yang kita akan lakukan adalah mendeklarasikan variabel disebut counter. Ini akan diinisialisasi untuk d kali d dikurangi 1. Ingat bahwa d adalah dimensi papan kami. Bagaimana init akan bekerja itu akan untuk iterate atas seluruh papan dan kita akan mulai di bagian kiri atas. Dan mari kita katakan saja kita memiliki 4 oleh 4 papan. Jadi kiri atas kami akan katakan adalah 15. Dan kemudian kita hanya akan menghitung melalui papan, mengatakan 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, dan seterusnya. Jadi kiri atas, kami berharap untuk menjadi d kali d dikurangi 1, yang dalam 4 oleh 4 kasus akan menjadi 16 dikurangi 1, yang benar 15. Dan sekarang di sinilah kita akan iterate atas seluruh papan. Dan kita akan mengatur posisi masing-masing di dewan dengan nilai saat ini counter kami, dan kemudian counter akan untuk pengurangan, sehingga selanjutnya Posisi kita mencapai akan memiliki kontra menjadi salah satu kurang dari posisi sebelumnya. Jadi kami awalnya memiliki 15 dan pengurangan counter. Jadi kita akan menetapkan 14 ke Posisi berikutnya, pengurangan counter, dan kita akan ditugaskan 13, dan seterusnya. Akhirnya, kita perlu untuk menangani sudut yang kasus di mana, jika dewan memiliki bahkan dimensi, maka hanya melakukan 15, 14, 13, 12, semua jalan ke 3, 2, 1, adalah akan meninggalkan kami dengan papan terpecahkan. Dan kita harus swap 1 dan 2. Jadi, jika d mod 2 sama dengan 0, itu bagaimana kita akan memeriksa untuk melihat apakah itu bahkan. Jika d mod 2 sama dengan 0, maka berturut-turut d dikurangi 1, yang merupakan baris bawah, dan posisi d minus 2, atau kolom d dikurangi 2, kita akan menetapkan bahwa untuk 2, dan kolom d minus 3 kami akan diatur ke 1. Jadi itu hanya membalikkan mana 1 dan 2 saat ini berada. Akhirnya, kita akan mengatur sangat kanan bawah sama dengan kosong, di mana kosong telah hash didefinisikan telah di bagian atas sebagai 0. Jadi, itu tidak benar-benar diperlukan, karena ini untuk loop akan memiliki mengatur kanan bawah ke 0, karena kontra secara alami akan mencapai 0. Tapi itu bergantung pada kita mengetahui bahwa blanko hash untuk menemukan 0. Jika saya pergi ke program ini dan kemudian mengubah kosong di bagian atas untuk 100, itu masih harus bekerja. Jadi ini hanya memastikan bahwa kanan bawah sebenarnya sama dengan kami nilai kosong. Akhirnya, kita memiliki dua variabel global, jadi kosong i dan j kosong, dan kita lihat yang dinyatakan di atas. Dan kita akan menggunakan dua dunia variabel untuk melacak posisi kosong, sehingga kita tidak perlu untuk melihat melalui seluruh yang board untuk menemukan kosong setiap satu kali kita mencoba untuk bergerak. Jadi posisi kosong selalu adalah akan mulai di bagian kanan bawah. Jadi kanan bawah diberikan oleh indeks d dikurangi 1, d dikurangi 1. Jadi, itu init. Sekarang kita beralih ke menggambar. Jadi, hasil imbang akan menjadi serupa di mana kita akan iterate atas seluruh papan. Dan kami hanya ingin mencetak nilai yang ada di setiap posisi papan. Jadi di sini, kita mencetak nilai yang di setiap posisi papan. Dan melihat bahwa yang kita lakukan -. Dan itu hanya mengatakan bahwa printf terlepas dari apakah itu adalah satu digit atau nomor dua digit, kita masih ingin mengambil dua kolom di print out, sehingga jika kita memiliki dua digit dan satu digit angka di papan yang sama, kami Dewan akan tetap terlihat bagus dan persegi. Jadi kami ingin melakukan itu untuk setiap nilai di papan, kecuali kosong. Jadi, jika posisi di papan sama kosong, maka kami secara khusus ingin mencetak hanya garis bawah untuk mewakili kosong, bukannya apapun nilai kosong sebenarnya. Akhirnya, kita ingin mencetak sebuah baris baru. Perhatikan bahwa ini masih dalam luar untuk loop, tetapi di luar batin untuk loop. Karena outer ini untuk loop iterasi atas semua baris, dan sebagainya printf ini akan hanya mencetak baris baru, jadi kami melanjutkan untuk mencetak baris berikutnya. Dan itu saja untuk menarik. Jadi, sekarang mari kita lanjutkan untuk bergerak. Sekarang, kami melewati langkah, genteng bahwa pengguna dimasukkan dalam permainan - mereka masukkan ubin mereka ingin pindah - dan Anda seharusnya mengembalikan bool, jadi benar atau salah, tergantung pada apakah tindakan itu benar-benar valid - apakah genteng yang dapat pindah ke ruang kosong. Jadi di sini, kita mendeklarasikan variabel lokal, tile_1 dan tile_j, yang akan mirip dengan blank_i dan blank_j, kecuali itu akan melacak posisi ubin. Sekarang di sini, kita akan menggunakan blank_i dan blank_j dan berkata baik-baik saja, jadi inilah kosong di papan tulis. Sekarang, adalah genteng di atas kosong? Apakah ubin di sebelah kiri kosong? Apakah ubin di sebelah kanan kosong? Apakah ubin di bawah kosong? Jadi, jika ubin ini di salah satu dari mereka posisi, maka kita tahu bahwa ubin dapat dipindahkan ke tempat yang kosong dan kosong dapat dipindahkan ke mana ubin saat ini. Jadi di sini, kita katakan jika papan di posisi blank_i dikurangi 1 blank_j. Jadi ini katakan adalah ubin di atas kosong saat ini? Dan jika demikian, kita akan ingat itu adalah posisi dari ubin. Ubin berada di posisi blank_i dikurangi 1 dan blank_j. sekarang pertama, kami juga memiliki cek ini di sini, jadi blank_i adalah lebih besar dari 0. Mengapa kita ingin melakukan itu? Nah, jika kosong adalah di baris atas dewan, maka kita tidak ingin lihat di atas sisipan untuk ubin sejak tidak ada di atas atas deretan papan. Ini adalah bagaimana Anda mungkin akhirnya mendapatkan sesuatu seperti kesalahan segmentasi atau program Anda hanya bisa bekerja dalam cara yang tak terduga. Jadi, ini adalah memastikan bahwa kita tidak lihat di tempat-tempat yang tidak valid. Sekarang kita akan melakukan hal yang sama untuk semua kombinasi lain yang mungkin. Jadi di sini, kami sedang mencari di bawah kosong untuk melihat apakah itu ubin. Dan kami juga harus memastikan kami tidak di baris paling bawah, atau kita tidak harus mencari ubin. Di sini, kita akan melihat ke kiri kosong untuk melihat apakah itu ubin. Dan kita tidak harus melihat ke kiri jika kita berada di kolom paling kiri. Dan di sini kita akan melihat ke kanan kosong, dan kita tidak boleh melihat ke kanan jika kita di kolom paling kanan. Jadi, jika tidak ada hal-hal yang benar, itu berarti ubin tidak berdekatan ke kosong dan kita bisa kembali palsu. Langkah itu tidak valid. Tapi, jika salah satu dari mereka itu benar, maka pada titik ini, kita tahu bahwa tile_i dan tile_j adalah sama dengan posisi ubin. Jadi, kita dapat memperbarui papan di posisi tile_i dan tile_j. Kita tahu nilai baru akan kosong dan bahwa blank_i posisi blank_j, yang asli kosong - kita tahu ubin akan pindah ke sana. Perhatikan kita tidak benar-benar harus melakukan swap yang nyata di sini, karena kita tahu nilai-nilai yang perlu dimasukkan ke posisi tersebut. Kita tidak perlu sementara variabel sekitar. Akhirnya, kita harus ingat bahwa kita memiliki variabel global kami yang melacak posisi dari kosong. Jadi kita ingin memperbarui posisi kosong untuk berada di tempat ubin awalnya. Akhirnya, kita kembali benar karena langkah itu berhasil. Kami berhasil swap kosong dengan ubin. Baiklah, kita jadi terakhir perlu memeriksa won. Jadi, menang sama mengembalikan bool mana benar akan menunjukkan bahwa pengguna telah memenangkan pertandingan. Dan palsu menunjukkan bahwa game ini masih berlangsung. Pengguna belum menang. Jadi, ini akan menjadi cukup banyak kebalikan dari init, di mana init, ingat, kita menginisialisasi papan 15, 14, 13, 12, seterusnya. Sedangkan menang, kita ingin memeriksa apakah papan 1, 2, 3, 4, 5, dan seterusnya. Jadi, kita akan menginisialisasi kami counter untuk 1 karena itu adalah apa atas kiri dewan harus. Dan kemudian kita akan lingkaran atas seluruh papan. Mari kita mengabaikan kondisi ini untuk kedua. Dan kondisi ini hanya akan cek adalah papan pada posisi ini sama dengan jumlah saat ini? Jika demikian, kenaikan jumlah sehingga Posisi berikutnya kita melihat satu lebih tinggi dari posisi kita berada di sekarang. Jadi itulah bagaimana kita mendapatkan kiri atas harus 1. Kenaikan hitungan ke 2. Lihatlah posisi berikutnya. Apakah ini 2? Jika demikian, kenaikan hitungan ke 3. Posisi berikutnya, adalah 3 ini? Jika demikian, kenaikan menghitung sampai 4, dan seterusnya. Jadi, jika ada posisi apapun pada papan yang tidak sama jumlah kami, maka kita ingin kembali palsu karena itu berarti ada beberapa ubin yang tidak dalam posisi yang benar. Jadi di sini, apa yang kondisi ini lakukan? Nah, ingat bahwa kosong adalah seharusnya pergi di kanan bawah. Dan nilai kosong yang tidak mungkin tentu sama dengan nilai counter yang akan dicapai di bagian kanan bawah. Jadi kami secara khusus ingin memeriksa apakah i sama sama d dikurangi 1 dan j equals sama d dikurangi 1 - yang mengatakan jika kita cari di bagian kanan bawah papan - maka kita hanya ingin melanjutkan. Kami ingin melewatkan ini khusus iterasi untuk loop. Jadi, jika kita berhasil melewati ini bersarang untuk loop, yang berarti bahwa tidak ada ubin yang berada di posisi yang salah. Dan kami keluar dari loop dan datang di sini, di mana kita bisa kembali benar. Semua ubin berada di posisi yang benar dan itu berarti pengguna memiliki memenangkan pertandingan. Dan itu saja. Nama saya Rob Bowden, dan ini adalah 15.