1 00:00:00,000 --> 00:00:13,070 2 00:00:13,070 --> 00:00:13,715 >> ROB Bowden: Bok. 3 00:00:13,715 --> 00:00:17,800 Ja sam Rob, a nadam se vaš igra za igru ​​od 15 godina. 4 00:00:17,800 --> 00:00:22,040 Sada, postoje četiri funkcije koje trebate provesti u ovom programu - init, 5 00:00:22,040 --> 00:00:24,650 crtanje, premjestiti, i pobijedio. 6 00:00:24,650 --> 00:00:27,230 Pa, pogledajmo init. 7 00:00:27,230 --> 00:00:32,930 >> Ovdje vidimo prva stvar da smo ću učiniti je proglasiti varijablu 8 00:00:32,930 --> 00:00:34,600 zove brojač. 9 00:00:34,600 --> 00:00:37,620 To se događa da se ponište na d puta d minus 1. 10 00:00:37,620 --> 00:00:40,200 Ne zaboravite da je d dimenzija našeg odbora. 11 00:00:40,200 --> 00:00:43,840 Kako init ide na posao je da će to ponoviti nad cijelim forumom 12 00:00:43,840 --> 00:00:46,050 i mi idemo za početak u gornjem lijevom kutu. 13 00:00:46,050 --> 00:00:48,570 >> I neka je samo reći da smo imaju 4 strane 4 ploču. 14 00:00:48,570 --> 00:00:51,220 Dakle, gore lijevo smo htio reći je 15. 15 00:00:51,220 --> 00:00:53,960 I onda mi samo idemo brojati kroz zajednice, rekavši 15, 14, 13, 16 00:00:53,960 --> 00:00:58,510 12, 11, 10, 9, 8, 7, 6, 5, 4, i tako dalje. 17 00:00:58,510 --> 00:01:03,780 Dakle, gore lijevo, možemo očekivati ​​da će biti d puta d minus 1, koji se u 4 po 4 18 00:01:03,780 --> 00:01:08,290 Slučaj će biti 16 minus 1, što je točno 15. 19 00:01:08,290 --> 00:01:10,885 >> A sada ovdje gdje ćemo ponoviti nad cijelim forumom. 20 00:01:10,885 --> 00:01:14,720 I mi ćemo se postaviti svaku poziciju u odbora na trenutnu vrijednost 21 00:01:14,720 --> 00:01:19,090 naš brojač, a zatim brojač ide opadanje se, tako da se sljedeći 22 00:01:19,090 --> 00:01:22,300 Položaj stignemo će imati Brojač biti jedan manje od 23 00:01:22,300 --> 00:01:23,690 prethodni položaj. 24 00:01:23,690 --> 00:01:26,970 Tako smo u početku imali 15 i opadanje brojač. 25 00:01:26,970 --> 00:01:30,065 Pa onda ćemo dodijeliti 14 do Sljedeći položaj, opadanje brojač, 26 00:01:30,065 --> 00:01:33,710 i idemo dodjeljuje 13, i tako dalje. 27 00:01:33,710 --> 00:01:37,620 >> Na kraju, moramo se nositi taj kutak slučaj u kojem, ako odbor ima još 28 00:01:37,620 --> 00:01:44,450 dimenzija, onda samo radi 15, 14, 13, 12, pa sve do 3, 2, 1, je 29 00:01:44,450 --> 00:01:46,780 Hoće li nas ostaviti s nerješiv odbora. 30 00:01:46,780 --> 00:01:49,390 I moramo zamijeniti jedan i dva. 31 00:01:49,390 --> 00:01:52,930 Dakle, ako je d mod 2 = 0, to je kako ćemo provjeriti 32 00:01:52,930 --> 00:01:54,410 da vidi da li je to uopće. 33 00:01:54,410 --> 00:01:59,810 Ako d mod 2 jednaka 0, tada je u redu d minusu 1, što je donji red, a 34 00:01:59,810 --> 00:02:05,430 Položaj d minus 2, ili stupac d minus 2, idemo postaviti da do 2, a 35 00:02:05,430 --> 00:02:07,860 stupac d minus 3 smo će postaviti na 1. 36 00:02:07,860 --> 00:02:12,170 Dakle, to je samo unazad gdje 1 i 2 su trenutno. 37 00:02:12,170 --> 00:02:16,270 >> Konačno, mi ćemo postaviti vrlo dolje desno jednak prazno, gdje 38 00:02:16,270 --> 00:02:20,700 prazan je hash definirana na vrhu kao 0. 39 00:02:20,700 --> 00:02:26,785 Dakle, to nije bilo nužno potrebno, jer je to za petlje će imati 40 00:02:26,785 --> 00:02:30,610 postaviti donju pravo na 0, budući Brojač će, naravno, doći do 0. 41 00:02:30,610 --> 00:02:34,610 No, to ovisi o nama, znajući da prazan je raspršen pronaći 0. 42 00:02:34,610 --> 00:02:38,280 Ako odem u ovaj program, a kasnije promijeniti prazno na vrhu do 100, što 43 00:02:38,280 --> 00:02:39,770 treba dalje raditi. 44 00:02:39,770 --> 00:02:43,180 >> Dakle, ovo je samo da osiguraju da dolje desno je zapravo jednaka našim 45 00:02:43,180 --> 00:02:44,870 prazna vrijednost. 46 00:02:44,870 --> 00:02:50,270 Konačno, imamo dvije globalne varijable, tako prazan sam i prazan j, i vidimo 47 00:02:50,270 --> 00:02:53,360 one proglasio na vrhu. 48 00:02:53,360 --> 00:02:56,270 I mi ćemo koristiti ta dva globalna varijable za praćenje 49 00:02:56,270 --> 00:02:59,040 Položaj prazan, tako da mi ne morati tražiti kroz cijeli 50 00:02:59,040 --> 00:03:03,890 odbora pronaći prazan svaki Vrijeme je da pokušate napraviti potez. 51 00:03:03,890 --> 00:03:08,450 Tako da položaj prazno uvijek će početi u donjem desnom kutu. 52 00:03:08,450 --> 00:03:13,270 Dakle, dolje desno je dao indeksi d minus 1, d minus 1. 53 00:03:13,270 --> 00:03:14,880 Dakle, to je init. 54 00:03:14,880 --> 00:03:17,040 >> Sada smo prešli na crtanje. 55 00:03:17,040 --> 00:03:19,370 Dakle, ždrijeb će biti slična gdje ćemo ponoviti 56 00:03:19,370 --> 00:03:20,970 nad cijelim forumom. 57 00:03:20,970 --> 00:03:25,400 A mi samo želimo ispisati vrijednost to je u svakom položaju ploče. 58 00:03:25,400 --> 00:03:29,580 Pa evo, mi smo tiskanje vrijednost koja je u svakom položaju ploče. 59 00:03:29,580 --> 00:03:32,280 I primjetite da radimo -. 60 00:03:32,280 --> 00:03:37,410 I to samo govori da je printf bez obzira na to je li to jedna znamenka ili 61 00:03:37,410 --> 00:03:42,010 dvoznamenkastog broja, i dalje ćemo ga žele zauzimaju dva stupca u ispisati, 62 00:03:42,010 --> 00:03:46,290 tako da, ako imamo dvije znamenke i jedan znamenke brojeve u istom brodu, naš 63 00:03:46,290 --> 00:03:49,450 Odbor će i dalje izgledaju lijepo i trg. 64 00:03:49,450 --> 00:03:54,190 >> Dakle, želimo učiniti da za svaku vrijednost u brodu, osim za slijepu probu. 65 00:03:54,190 --> 00:03:58,260 Dakle, ako je položaj u odboru jednaka prazno, onda smo posebno 66 00:03:58,260 --> 00:04:01,730 želite ispisati samo donjom za zastupanje prazno, umjesto da 67 00:04:01,730 --> 00:04:05,150 bez obzira na vrijednost prazan zapravo jest. 68 00:04:05,150 --> 00:04:08,500 >> Na kraju, želimo ispisati iz nove linije. 69 00:04:08,500 --> 00:04:11,970 Uočite da je ovo još uvijek unutar vanjski za petlje, ali izvan 70 00:04:11,970 --> 00:04:13,200 unutarnje for petlje. 71 00:04:13,200 --> 00:04:17,930 Budući da je ova vanjska for petlja se iterating nad svim redovima, pa je stoga ovaj printf je 72 00:04:17,930 --> 00:04:22,130 ide to samo ispisati novu liniju, pa smo prijeći na ispis sljedećeg retka. 73 00:04:22,130 --> 00:04:23,910 I da je za izvlačenje. 74 00:04:23,910 --> 00:04:27,770 >> Dakle, sada idemo dalje kretati. 75 00:04:27,770 --> 00:04:32,590 Sada, prolazimo potez, crijep koji Korisnik je ušao u igru ​​- oni 76 00:04:32,590 --> 00:04:36,360 unesite pločica žele preseliti - i ti si trebao vratiti bool, pa 77 00:04:36,360 --> 00:04:39,300 bilo istinito ili lažno, ovisno o je li taj potez bio je zapravo 78 00:04:39,300 --> 00:04:43,360 vrijedi - da li to može biti crijep preselio se u prazan prostor. 79 00:04:43,360 --> 00:04:48,340 >> Pa evo, izjavljujemo lokalnu varijablu, tile_1 i tile_j, koji će 80 00:04:48,340 --> 00:04:52,150 biti sličan blank_i i blank_j, osim što će pratiti 81 00:04:52,150 --> 00:04:54,910 Položaj pločica. 82 00:04:54,910 --> 00:05:00,370 Sada ovdje, idemo koristiti blank_i i blank_j i reći sve u redu, pa 83 00:05:00,370 --> 00:05:01,930 evo prazno na ploči. 84 00:05:01,930 --> 00:05:04,420 >> Sada je pločica iznad prazno? 85 00:05:04,420 --> 00:05:06,210 Je pločica s lijeve prazno? 86 00:05:06,210 --> 00:05:07,420 Je pločica s desne prazno? 87 00:05:07,420 --> 00:05:08,970 Je pločica ispod prazno? 88 00:05:08,970 --> 00:05:13,330 Dakle, ako je pločica u tim pozicijama, onda znamo da je pločica 89 00:05:13,330 --> 00:05:16,390 može biti premještena u prazno mjesto i prazan može biti premještena na mjesto gdje 90 00:05:16,390 --> 00:05:18,240 Pločica je trenutno. 91 00:05:18,240 --> 00:05:26,400 >> Pa evo, recimo, ako odbor na poziciji blank_i minus 1 blank_j. 92 00:05:26,400 --> 00:05:31,120 Dakle, ovo govori je crijep iznad trenutne prazan? 93 00:05:31,120 --> 00:05:34,350 I ako je tako, idemo se sjetiti da je položaj pločica. 94 00:05:34,350 --> 00:05:37,870 Pločica je u položaju blank_i minus 1 i blank_j. 95 00:05:37,870 --> 00:05:40,660 Sada prvi put, imamo i tu provjeru upravo ovdje, tako da je blank_i 96 00:05:40,660 --> 00:05:41,760 veći od 0. 97 00:05:41,760 --> 00:05:43,410 >> Zašto želimo to učiniti? 98 00:05:43,410 --> 00:05:47,290 Pa, ako je prazan je u gornjem redu Uprave, onda mi ne želimo 99 00:05:47,290 --> 00:05:51,240 izgleda gore prazan pločice od ne postoji ništa iznad vrha 100 00:05:51,240 --> 00:05:52,430 red na brodu. 101 00:05:52,430 --> 00:05:55,950 To je, kako se moglo završiti dobivanje nešto poput segmentacije krivnjom ili 102 00:05:55,950 --> 00:05:59,030 Vaš program može raditi samo na neočekivane načine. 103 00:05:59,030 --> 00:06:04,310 Dakle, to je pazeći da mi ne gledati u mjestima koja nisu valjana. 104 00:06:04,310 --> 00:06:08,470 >> Sada ćemo napraviti istu stvar za sve ostale moguće kombinacije. 105 00:06:08,470 --> 00:06:13,250 Pa evo, mi smo u potrazi nastavku prazna da vidi da li je to pločica. 106 00:06:13,250 --> 00:06:16,950 A imamo i kako bi bili sigurni da smo Ne u donjem redu, inače smo 107 00:06:16,950 --> 00:06:18,910 Ne treba tražiti pločice. 108 00:06:18,910 --> 00:06:25,040 Ovdje ćemo pogledati na lijevoj prazno da vidi da li je to pločica. 109 00:06:25,040 --> 00:06:27,860 I ne bismo trebali gledati na lijevoj ako smo u lijevom stupcu. 110 00:06:27,860 --> 00:06:30,100 I ovdje ćemo gledati Pravo na prazno, a mi ne bi trebali 111 00:06:30,100 --> 00:06:33,340 pogled na desno, ako smo u krajnjem desnom stupcu. 112 00:06:33,340 --> 00:06:37,820 >> Dakle, ako se nitko od tih stvari su istinite, to znači da pločica nije bio u susjedstvu 113 00:06:37,820 --> 00:06:39,640 na prazan i možemo se vratiti false. 114 00:06:39,640 --> 00:06:41,230 Taj potez nije bio valjan. 115 00:06:41,230 --> 00:06:47,010 No, ako je jedan od onih koji su istina, onda na ova točka, mi znamo da tile_i i 116 00:06:47,010 --> 00:06:50,540 tile_j jednake Položaj pločica. 117 00:06:50,540 --> 00:06:55,210 I tako, možemo ažurirati odbora na pozicije tile_i i tile_j. 118 00:06:55,210 --> 00:06:59,820 Znamo nova vrijednost će biti prazan i da je položaj blank_i 119 00:06:59,820 --> 00:07:02,950 blank_j, koji je bio izvorni prazno - mi znamo pločica će 120 00:07:02,950 --> 00:07:04,030 premjestiti tamo. 121 00:07:04,030 --> 00:07:07,610 >> Obavijest mi zapravo ne morate učiniti stvarna zamjena ovdje, jer mi znamo 122 00:07:07,610 --> 00:07:09,850 Vrijednosti koje treba umetnuti u tim položajima. 123 00:07:09,850 --> 00:07:13,780 Ne trebamo privremena varijabla oko. 124 00:07:13,780 --> 00:07:16,920 >> Na kraju, moramo se sjetiti da smo imamo globalnih varijabli koje su 125 00:07:16,920 --> 00:07:18,980 praćenje položaja u prazno. 126 00:07:18,980 --> 00:07:22,780 Na taj način želimo ažurirati položaj prazne biti tamo gdje pločica 127 00:07:22,780 --> 00:07:24,190 izvorno bio. 128 00:07:24,190 --> 00:07:27,680 Na kraju, možemo se vratiti točno jer potez bio uspješan. 129 00:07:27,680 --> 00:07:31,110 Mi smo uspješno zamijeniti prazan s pločica. 130 00:07:31,110 --> 00:07:34,890 >> U redu, tako da smo prošli potrebno provjeriti wona. 131 00:07:34,890 --> 00:07:39,900 Dakle, osvojio sličan vraća bool gdje Istina će se upućuju na to da 132 00:07:39,900 --> 00:07:41,460 Korisnik je pobijedio u igri. 133 00:07:41,460 --> 00:07:43,780 I netočno je ukazuje na to da igra još uvijek traje. 134 00:07:43,780 --> 00:07:46,340 Korisnik nije osvojio. 135 00:07:46,340 --> 00:07:52,100 Dakle, to će biti prilično suprotno od init, gdje init, 136 00:07:52,100 --> 00:07:56,920 zapamtite, možemo započeti ploču 15, 14, 13, 12, pa dalje. 137 00:07:56,920 --> 00:08:03,000 Dok je osvojio, želimo provjeriti je li Ploča je 1, 2, 3, 4, 5, i tako dalje. 138 00:08:03,000 --> 00:08:06,600 >> Dakle, mi ćemo započeti naš brojač na 1 jer to je ono što je vrh 139 00:08:06,600 --> 00:08:08,400 lijevi dio se mora biti. 140 00:08:08,400 --> 00:08:10,860 A onda idemo na petlji nad cijelim forumom. 141 00:08:10,860 --> 00:08:13,690 Idemo ignorirati ovaj uvjet na sekundu. 142 00:08:13,690 --> 00:08:18,410 I to stanje samo ide na Provjera je odbor u ovom položaju 143 00:08:18,410 --> 00:08:20,790 jednaka aktualnim točkama? 144 00:08:20,790 --> 00:08:27,040 Ako je tako, povećajte broj, tako da Sljedeći položaj gledamo je jedan viši 145 00:08:27,040 --> 00:08:29,690 od položaja smo upravo sada. 146 00:08:29,690 --> 00:08:32,700 >> Dakle to je kako smo dobili gore lijevo bi trebao biti 1. 147 00:08:32,700 --> 00:08:33,950 Povećajte brojati do dva. 148 00:08:33,950 --> 00:08:35,010 Pogledajte sljedeće mjesto. 149 00:08:35,010 --> 00:08:35,690 Je li to 2? 150 00:08:35,690 --> 00:08:37,659 Ako je tako, povećajte brojati do tri. 151 00:08:37,659 --> 00:08:39,179 Sljedeća položaj, je li to 3? 152 00:08:39,179 --> 00:08:42,440 Ako je tako, povećajte broj do 4, i tako dalje. 153 00:08:42,440 --> 00:08:49,190 Dakle, ako ima bilo koji položaj na ploči koja nije jednaka našu računati, 154 00:08:49,190 --> 00:08:52,640 onda želimo vratiti false budući da znači postoji neki crijep koji je 155 00:08:52,640 --> 00:08:55,490 nije u ispravnom položaju. 156 00:08:55,490 --> 00:08:58,810 >> Pa evo, što se ovo stanje radi? 157 00:08:58,810 --> 00:09:02,170 Pa, ne zaboravite da je prazna trebala ići u donjem desnom kutu. 158 00:09:02,170 --> 00:09:06,180 I Prazno je vrijednost ne bi mogli mora biti jednaka vrijednosti 159 00:09:06,180 --> 00:09:11,080 counter da će biti postignut u donjem desnom kutu. 160 00:09:11,080 --> 00:09:15,760 Stoga smo posebno provjeriti da li sam jednaka jednaka d minus 1 i J dosegne 161 00:09:15,760 --> 00:09:19,470 jednaka d minus jedan - što govori da smo potrazi u donjem desnom kutu 162 00:09:19,470 --> 00:09:22,050 ploča - onda mi samo želite nastaviti. 163 00:09:22,050 --> 00:09:26,200 Želimo da preskočite ovaj iteracija za petlju. 164 00:09:26,200 --> 00:09:31,250 >> I tako, ako uspijemo dobiti kroz ovaj ugniježđeni for petlje, to znači da 165 00:09:31,250 --> 00:09:34,690 nema pločica koja je u netočni položaj. 166 00:09:34,690 --> 00:09:38,900 I lomimo iz petlje i dolaze Ovdje, gdje se možemo vratiti istinito. 167 00:09:38,900 --> 00:09:41,800 Sve pločice su u ispravnom položaju a to znači da korisnik ima 168 00:09:41,800 --> 00:09:43,230 pobijedio. 169 00:09:43,230 --> 00:09:44,460 I to je to. 170 00:09:44,460 --> 00:09:46,550 Moje ime je Rob Bowden, a to je 15. 171 00:09:46,550 --> 00:09:52,726