>> 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.