1 00:00:00,000 --> 00:00:13,070 2 00:00:13,070 --> 00:00:13,715 >> ROB BOWDEN: Szia. 3 00:00:13,715 --> 00:00:17,800 Én Rob, és remélem, a játék játék 15. 4 00:00:17,800 --> 00:00:22,040 Most, négy funkció szükséges hogy végre ebben a programban - init, 5 00:00:22,040 --> 00:00:24,650 rajzolni, mozog, és nyert. 6 00:00:24,650 --> 00:00:27,230 Nos, nézzük meg init. 7 00:00:27,230 --> 00:00:32,930 >> Itt látjuk az első dolog, vagyunk fog tenni, hogy egy változót 8 00:00:32,930 --> 00:00:34,600 nevű számlálót. 9 00:00:34,600 --> 00:00:37,620 Meg fog inicializálni a d-szer d mínusz 1. 10 00:00:37,620 --> 00:00:40,200 Ne feledje, hogy d dimenzió a mi fórumon. 11 00:00:40,200 --> 00:00:43,840 Hogy init működni fog ez a helyzet kell végighaladni az egész fórumon 12 00:00:43,840 --> 00:00:46,050 és fogunk kezdeni a bal felső sarokban. 13 00:00:46,050 --> 00:00:48,570 >> És mondjuk, hogy Van 4 4 fórumon. 14 00:00:48,570 --> 00:00:51,220 Tehát a bal felső vagyunk fog mondani 15. 15 00:00:51,220 --> 00:00:53,960 És akkor mi csak áldozol a táblák, mondván 15, 14, 13, 16 00:00:53,960 --> 00:00:58,510 12, 11, 10, 9, 8, 7, 6, 5, 4, és így tovább. 17 00:00:58,510 --> 00:01:03,780 Tehát a bal felső sarokban, azt várjuk, hogy d-szer d mínusz 1, amely a 4-4- 18 00:01:03,780 --> 00:01:08,290 ha lesz 16 mínusz 1, ami 15 helyesen. 19 00:01:08,290 --> 00:01:10,885 >> És most itt van, ahol fogunk végighaladni az egész fórumon. 20 00:01:10,885 --> 00:01:14,720 És meg fogjuk állítani minden pozíciót a fórumon, hogy az aktuális értéket 21 00:01:14,720 --> 00:01:19,090 a számláló, majd a számláló megy hogy csökkentse, hogy a következő 22 00:01:19,090 --> 00:01:22,300 pozíciót érünk megy, hogy számláló eggyel kevesebb, mint a 23 00:01:22,300 --> 00:01:23,690 a korábbi álláspontját. 24 00:01:23,690 --> 00:01:26,970 Így eleinte a 15. és csökkentse számláló. 25 00:01:26,970 --> 00:01:30,065 Akkor megyünk hozzá a 14. a következő pozícióra, csökkentő számláló, 26 00:01:30,065 --> 00:01:33,710 és mi lesz a célhoz kötött 13, és így tovább. 27 00:01:33,710 --> 00:01:37,620 >> Végül, meg kell kezelni a sarokban esetben, amikor, ha a testület még 28 00:01:37,620 --> 00:01:44,450 méret, akkor csak ennek 15, 14, 13, 12, egészen a 3, 2, 1, az 29 00:01:44,450 --> 00:01:46,780 fog hagyni minket megoldhatatlan fórumon. 30 00:01:46,780 --> 00:01:49,390 És meg kell cserélni az 1. és a 2.. 31 00:01:49,390 --> 00:01:52,930 Tehát, ha d mod 2 értéke 0, ez hogyan fogjuk ellenőrizni 32 00:01:52,930 --> 00:01:54,410 , hogy ha ez még. 33 00:01:54,410 --> 00:01:59,810 Ha d mod 2 értéke 0, majd sorban d mínusz 1, amely az alsó sorban, és 34 00:01:59,810 --> 00:02:05,430 pozíció d mínusz 2, vagy a D oszlopban mínusz 2, fogunk beállítani, hogy a 2. és 35 00:02:05,430 --> 00:02:07,860 oszlop d mínusz 3 vagyunk fogja meg 1-re. 36 00:02:07,860 --> 00:02:12,170 Szóval, ez csak megfordult, ahol a Az 1. és a 2. jelenleg. 37 00:02:12,170 --> 00:02:16,270 >> Végül, mi fogja meg az igen jobb alsó egyenlő üresen, ahol a 38 00:02:16,270 --> 00:02:20,700 üres lett hash meghatározott a csúcson, mint 0-ra. 39 00:02:20,700 --> 00:02:26,785 Szóval, ez nem volt feltétlenül szükséges, mivel ez a ciklus megy, hogy 40 00:02:26,785 --> 00:02:30,610 állítsa be a jobb alsó 0, mivel számláló természetesen eléri a 0-ra. 41 00:02:30,610 --> 00:02:34,610 De támaszkodik ránk, tudván, hogy üres volt kivonatolt találni a 0-ra. 42 00:02:34,610 --> 00:02:38,280 Ha megy a program, majd üres változtatni a tetején, hogy a 100, akkor 43 00:02:38,280 --> 00:02:39,770 még mindig működik. 44 00:02:39,770 --> 00:02:43,180 >> Tehát ez csak ügyelve arra, hogy a jobb alsó tulajdonképpen megegyezik a 45 00:02:43,180 --> 00:02:44,870 üres érték. 46 00:02:44,870 --> 00:02:50,270 Végül, van két globális változót, így üres i és üres j, és látjuk, 47 00:02:50,270 --> 00:02:53,360 a nyilatkozatban a tetején. 48 00:02:53,360 --> 00:02:56,270 És fogjuk használni a két globális változók nyomon követni a 49 00:02:56,270 --> 00:02:59,040 helyzetét üres, hogy mi nem meg kell nézni az egész 50 00:02:59,040 --> 00:03:03,890 fórumon, hogy megtalálja a üres minden egyes alkalommal igyekszünk, hogy a lépés. 51 00:03:03,890 --> 00:03:08,450 Tehát a helyzet az üres mindig van fog kezdeni a jobb alsó sarokban. 52 00:03:08,450 --> 00:03:13,270 Tehát a jobb alsó adják d indexek mínusz 1, mínusz 1 d. 53 00:03:13,270 --> 00:03:14,880 Szóval, ez init. 54 00:03:14,880 --> 00:03:17,040 >> Most lépni rajzolni. 55 00:03:17,040 --> 00:03:19,370 Tehát, döntetlen lesz hasonló , hova megyünk iterációkhoz 56 00:03:19,370 --> 00:03:20,970 az egész fórumon. 57 00:03:20,970 --> 00:03:25,400 És mi csak szeretnénk nyomtatni az érték ez minden helyzetben a fórumon. 58 00:03:25,400 --> 00:03:29,580 Tehát itt, mi a nyomtatást az értéket, ami minden helyzetben a fórumon. 59 00:03:29,580 --> 00:03:32,280 És észre, hogy amit csinálunk -. 60 00:03:32,280 --> 00:03:37,410 És ez még csak mondja printf hogy függetlenül attól, hogy ha ez egy számjegy vagy 61 00:03:37,410 --> 00:03:42,010 kétjegyű szám, még mindig szeretné, hogy vegye fel két oszlopot a nyomtatást, 62 00:03:42,010 --> 00:03:46,290 hogy ha van két számot és egy számjegyű számok ugyanazt a fórumon, a 63 00:03:46,290 --> 00:03:49,450 ellátás továbbra is néz ki, és szögletes. 64 00:03:49,450 --> 00:03:54,190 >> Ezért akarom, hogy minden érték a fórumon, kivéve a vak. 65 00:03:54,190 --> 00:03:58,260 Tehát, ha a helyzet a fórumon egyenlő az üres, akkor kifejezetten 66 00:03:58,260 --> 00:04:01,730 szeretnénk kinyomtatni, csak egy aláhúzás hogy képviselje az üres, ahelyett 67 00:04:01,730 --> 00:04:05,150 függetlenül az érték a üres valójában. 68 00:04:05,150 --> 00:04:08,500 >> Végül szeretnénk nyomtatni egy új sort. 69 00:04:08,500 --> 00:04:11,970 Vegyük észre, hogy ez még mindig benne A külső a hurok, de azon kívül 70 00:04:11,970 --> 00:04:13,200 a belső for ciklus. 71 00:04:13,200 --> 00:04:17,930 Mivel ez a külső for ciklus iterációjával egész sor, és így ez a printf is 72 00:04:17,930 --> 00:04:22,130 fog csak nyomtatni egy új sor, ezért lépni, hogy nyomtassa ki a következő sorra. 73 00:04:22,130 --> 00:04:23,910 És ez a döntetlen. 74 00:04:23,910 --> 00:04:27,770 >> Szóval, most térjünk rá mozogni. 75 00:04:27,770 --> 00:04:32,590 Most át mozog, a cserép, hogy a felhasználó be a játékban -, hogy 76 00:04:32,590 --> 00:04:36,360 adja meg a cserép akarnak mozogni - és kéne vissza bool, így 77 00:04:36,360 --> 00:04:39,300 igaz vagy hamis, attól függően, hogy ez a lépés valójában 78 00:04:39,300 --> 00:04:43,360 érvényes -, hogy ez a cserép lehet beköltözött az üres hely. 79 00:04:43,360 --> 00:04:48,340 >> Tehát itt, kinyilvánítjuk a helyi változó, tile_1 és tile_j, ami fog 80 00:04:48,340 --> 00:04:52,150 hasonló a blank_i és blank_j, kivéve, hogy fogja nyomon követni a 81 00:04:52,150 --> 00:04:54,910 helyzete a csempe. 82 00:04:54,910 --> 00:05:00,370 Most itt fogunk használni blank_i és blank_j és azt mondják minden rendben, így 83 00:05:00,370 --> 00:05:01,930 itt az üres a táblán. 84 00:05:01,930 --> 00:05:04,420 >> Most, a cserép fölött üres? 85 00:05:04,420 --> 00:05:06,210 A csempe, hogy a bal oldalon az üres? 86 00:05:06,210 --> 00:05:07,420 A cserép jobbra az üres? 87 00:05:07,420 --> 00:05:08,970 A cserép alatti üres? 88 00:05:08,970 --> 00:05:13,330 Tehát, ha a cserép bármely olyan pozíciókat, akkor tudjuk, hogy a cserép 89 00:05:13,330 --> 00:05:16,390 lehet mozgatni a fehér folt, és Az üres lehet mozgatni, ahol a 90 00:05:16,390 --> 00:05:18,240 cserép jelenleg. 91 00:05:18,240 --> 00:05:26,400 >> Tehát itt, azt mondják, ha fórumon pozícióban blank_i mínusz 1 blank_j. 92 00:05:26,400 --> 00:05:31,120 Tehát ez azt mondja, a cserép meghaladja a jelenlegi üres? 93 00:05:31,120 --> 00:05:34,350 És ha igen, megyünk emlékezni ez a helyzet a csempe. 94 00:05:34,350 --> 00:05:37,870 A cserép a helyén van blank_i mínusz 1 és blank_j. 95 00:05:37,870 --> 00:05:40,660 Most először, mi is ezt a csekket itt, így blank_i is 96 00:05:40,660 --> 00:05:41,760 0-nál nagyobb. 97 00:05:41,760 --> 00:05:43,410 >> Miért akarunk csinálni? 98 00:05:43,410 --> 00:05:47,290 Nos, ha az üres van a felső sorban A testület, akkor nem akar 99 00:05:47,290 --> 00:05:51,240 meg fölött üres a cserép óta nincs semmi teteje fölé 100 00:05:51,240 --> 00:05:52,430 sorban a fórumon. 101 00:05:52,430 --> 00:05:55,950 Így lehet, hogy a végén kapok olyasmi, mint egy szegmentációs hiba vagy 102 00:05:55,950 --> 00:05:59,030 A program is csak a munka váratlan módon. 103 00:05:59,030 --> 00:06:04,310 Szóval, ez is ügyelve arra, hogy mi nem meg olyan helyeken, amelyek nem érvényesek. 104 00:06:04,310 --> 00:06:08,470 >> Most megyünk, hogy nem ugyanaz a dolog a minden más lehetséges kombináció. 105 00:06:08,470 --> 00:06:13,250 Tehát itt, keresünk alatti üres , hogy ha ez a csempe. 106 00:06:13,250 --> 00:06:16,950 És azt is, hogy megbizonyosodjon arról, mi nem az alsó sorban, vagy mást is 107 00:06:16,950 --> 00:06:18,910 nem kell keresni a csempe. 108 00:06:18,910 --> 00:06:25,040 Itt fogunk nézni balra Az üres, hogy ha ez a csempe. 109 00:06:25,040 --> 00:06:27,860 És ne nézz balra ha mi vagyunk a bal szélső oszlopban. 110 00:06:27,860 --> 00:06:30,100 És itt fogunk nézni, hogy a jobbra az üres, és nem szabad 111 00:06:30,100 --> 00:06:33,340 látod a jobb, ha vagyunk a jobb szélső oszlopban. 112 00:06:33,340 --> 00:06:37,820 >> Tehát, ha ezek egyike sem igaz, azt jelenti, hogy a lap nem szomszédos 113 00:06:37,820 --> 00:06:39,640 az üres, és mi is vissza hamis. 114 00:06:39,640 --> 00:06:41,230 A lépés nem volt érvényes. 115 00:06:41,230 --> 00:06:47,010 De ha egy ilyen igaz lenne, akkor a Ezen a ponton, tudjuk, hogy tile_i és 116 00:06:47,010 --> 00:06:50,540 tile_j megegyeznek a helyzete a csempe. 117 00:06:50,540 --> 00:06:55,210 És így, tudjuk frissíteni a fedélzeten pozíciók tile_i és tile_j. 118 00:06:55,210 --> 00:06:59,820 Tudjuk, hogy az új érték lesz az üres és hogy a helyzet blank_i 119 00:06:59,820 --> 00:07:02,950 blank_j volt, ami az eredeti üres - tudjuk, hogy a lapka fog 120 00:07:02,950 --> 00:07:04,030 mozog ott. 121 00:07:04,030 --> 00:07:07,610 >> Figyeljük meg, hogy valójában nem kell csinálni egy valódi csere itt, hiszen tudjuk, hogy a 122 00:07:07,610 --> 00:07:09,850 értékek, amelyeket meg kell beilleszteni be azokat a pozíciókat. 123 00:07:09,850 --> 00:07:13,780 Nem kell egy ideiglenes változó körül. 124 00:07:13,780 --> 00:07:16,920 >> Végül, meg kell emlékezni, hogy mi van a globális változók, amelyek 125 00:07:16,920 --> 00:07:18,980 nyomon követése a helyzet Az üres. 126 00:07:18,980 --> 00:07:22,780 Ezért szeretnénk, hogy a pozíció az az üres lenni, ahol a csempe 127 00:07:22,780 --> 00:07:24,190 eredetileg volt. 128 00:07:24,190 --> 00:07:27,680 Végül térjünk vissza igaz, mert a lépés sikeres volt. 129 00:07:27,680 --> 00:07:31,110 Sikeresen cserélni a üres a csempe. 130 00:07:31,110 --> 00:07:34,890 >> Rendben, az utolsó is ellenőrizni kell won. 131 00:07:34,890 --> 00:07:39,900 Így nyert hasonlóan vissza bool, ahol igaz lesz, jelezve, hogy a 132 00:07:39,900 --> 00:07:41,460 felhasználó megnyerte a játékot. 133 00:07:41,460 --> 00:07:43,780 És hamis azt jelzi, hogy A játék még mindig tart. 134 00:07:43,780 --> 00:07:46,340 A felhasználó még nem nyert. 135 00:07:46,340 --> 00:07:52,100 Szóval, ez lesz nagyjából az ellenkezője init, ahol init, 136 00:07:52,100 --> 00:07:56,920 emlékszem, hogy inicializálja a fórumon 15, 14, 13, 12, stb. 137 00:07:56,920 --> 00:08:03,000 Mivel nyert, azt akarjuk, hogy ellenőrizze, hogy a tábla értéke 1, 2, 3, 4, 5, és így tovább. 138 00:08:03,000 --> 00:08:06,600 >> Így fogjuk inicializálni a számláló 1, mert ez az, amit a felső 139 00:08:06,600 --> 00:08:08,400 balra a táblán kell lennie. 140 00:08:08,400 --> 00:08:10,860 És akkor fogunk hurok az egész fórumon. 141 00:08:10,860 --> 00:08:13,690 Nézzük figyelmen kívül hagyja ezt a feltételt egy pillanatra. 142 00:08:13,690 --> 00:08:18,410 És ez a feltétel csak megy, ellenőrizze a testület ebben a helyzetben 143 00:08:18,410 --> 00:08:20,790 egyenlő az aktuális számít? 144 00:08:20,790 --> 00:08:27,040 Ha igen, akkor lépteti a számlálót, így a következő pozícióra nézzük egy nagyobb 145 00:08:27,040 --> 00:08:29,690 mint a pozíció vagyunk most. 146 00:08:29,690 --> 00:08:32,700 >> Szóval így megkapjuk a a bal felső sarokban kell 1. 147 00:08:32,700 --> 00:08:33,950 Lépteti a számlálót 2. 148 00:08:33,950 --> 00:08:35,010 Nézd meg a következő pozícióba. 149 00:08:35,010 --> 00:08:35,690 Ez 2-ben? 150 00:08:35,690 --> 00:08:37,659 Ha igen, akkor lépteti a számlálót 3. 151 00:08:37,659 --> 00:08:39,179 Ezután pozíció, ez a 3? 152 00:08:39,179 --> 00:08:42,440 Ha igen, akkor lépteti a számlálót 4, és így tovább. 153 00:08:42,440 --> 00:08:49,190 Tehát, ha van olyan helyzetben a fórumon, hogy nem egyezik meg a gróf, 154 00:08:49,190 --> 00:08:52,640 akkor szeretnénk return false mivel ez azt jelenti, van néhány cserép, ami 155 00:08:52,640 --> 00:08:55,490 nem a megfelelő helyzetben. 156 00:08:55,490 --> 00:08:58,810 >> Tehát itt, mi ez a feltétel csinálsz? 157 00:08:58,810 --> 00:09:02,170 Nos, ne feledje, hogy a vak volna menni a jobb alsó sarokban. 158 00:09:02,170 --> 00:09:06,180 És az üres értékét talán nem feltétlenül azonos az értéke 159 00:09:06,180 --> 00:09:11,080 ellen, hogy fog elérni A jobb alsó sarokban. 160 00:09:11,080 --> 00:09:15,760 Ezért kifejezetten szeretné ellenőrizni, ha értéke egyenlő d mínusz 1 és j egyenlő 161 00:09:15,760 --> 00:09:19,470 d értéke mínusz 1 -, amely azt mondja, ha keresik a jobb alsó 162 00:09:19,470 --> 00:09:22,050 A fórumon -, akkor már csak szeretnénk folytatni. 163 00:09:22,050 --> 00:09:26,200 Azt akarjuk, hogy hagyja ki ezt a különleges iteráció a for ciklus. 164 00:09:26,200 --> 00:09:31,250 >> És így, ha sikerül átvészelni ezt egymásba ágyazott for ciklus, ami azt jelenti, hogy 165 00:09:31,250 --> 00:09:34,690 nem volt cserép volt a A helytelen álláspont. 166 00:09:34,690 --> 00:09:38,900 És kitörni a hurok, és gyere Itt, ahol is vissza igaz. 167 00:09:38,900 --> 00:09:41,800 Minden csempe volt a megfelelő pozícióban és ez azt jelenti a felhasználó 168 00:09:41,800 --> 00:09:43,230 megnyerte a játékot. 169 00:09:43,230 --> 00:09:44,460 És ennyi. 170 00:09:44,460 --> 00:09:46,550 A nevem Rob Bowden, és ez a 15 volt. 171 00:09:46,550 --> 00:09:52,726