1 00:00:00,000 --> 00:00:13,070 2 00:00:13,070 --> 00:00:13,715 >> ROB BOWDEN: Hei. 3 00:00:13,715 --> 00:00:17,800 Jeg er Rob, og jeg håper din spill for spillet 15 år. 4 00:00:17,800 --> 00:00:22,040 Nå er det fire funksjonene du trenger å gjennomføre i dette programmet - init, 5 00:00:22,040 --> 00:00:24,650 tegne, flytte, og vant. 6 00:00:24,650 --> 00:00:27,230 Så, la oss se på init. 7 00:00:27,230 --> 00:00:32,930 >> Her ser vi den første tingen vi er kommer til å gjøre er å deklarere en variabel 8 00:00:32,930 --> 00:00:34,600 kalt teller. 9 00:00:34,600 --> 00:00:37,620 Det kommer til å bli initialisert å d ganger d minus en. 10 00:00:37,620 --> 00:00:40,200 Husk at d er dimensjonen av vårt styre. 11 00:00:40,200 --> 00:00:43,840 Hvordan init kommer til å fungere er det som skjer å iterere over hele forumet 12 00:00:43,840 --> 00:00:46,050 og vi kommer til å starte øverst til venstre. 13 00:00:46,050 --> 00:00:48,570 >> Og la oss bare si at vi har en 4 av 4 bord. 14 00:00:48,570 --> 00:00:51,220 Så øverst til venstre vi er kommer til å si er 15 år. 15 00:00:51,220 --> 00:00:53,960 Og da vi bare kommer til å telle gjennom styrene, sier 15, 14, 13, 16 00:00:53,960 --> 00:00:58,510 12, 11, 10, 9, 8, 7, 6, 5, 4, og så videre. 17 00:00:58,510 --> 00:01:03,780 Så øverst til venstre, regner vi med å være d ganger d minus en, som i 4 x 4 18 00:01:03,780 --> 00:01:08,290 saken kommer til å være 16 minus 1, som er fullstendig 15. 19 00:01:08,290 --> 00:01:10,885 >> Og nå her er der vi kommer til å iterere over hele forumet. 20 00:01:10,885 --> 00:01:14,720 Og vi kommer til å sette hver posisjon i styret til den nåværende verdien av 21 00:01:14,720 --> 00:01:19,090 vår teller, og da teller går å minske, slik at neste 22 00:01:19,090 --> 00:01:22,300 posisjonen vi nå kommer til å ha telleren være én mindre enn 23 00:01:22,300 --> 00:01:23,690 forrige posisjon. 24 00:01:23,690 --> 00:01:26,970 Så vi i utgangspunktet hadde 15 og decrement teller. 25 00:01:26,970 --> 00:01:30,065 Så da skal vi tildele 14 til neste posisjon, minsk teller, 26 00:01:30,065 --> 00:01:33,710 og vi kommer til å tildelt 13, og så videre. 27 00:01:33,710 --> 00:01:37,620 >> Til slutt må vi håndtere det hjørnet tilfelle hvor, dersom styret har en enda 28 00:01:37,620 --> 00:01:44,450 dimensjon, og deretter bare å gjøre 15, 14, 13, 12, helt ned til 3, 2, 1, ligger 29 00:01:44,450 --> 00:01:46,780 kommer til å forlate oss med et uløselig bord. 30 00:01:46,780 --> 00:01:49,390 Og vi må bytte en og to. 31 00:01:49,390 --> 00:01:52,930 Så, hvis d mod 2 er lik 0, er at hvordan vi kommer til å sjekke 32 00:01:52,930 --> 00:01:54,410 for å se om det er enda. 33 00:01:54,410 --> 00:01:59,810 Hvis d mod 2 er lik 0, så i rad d minus 1, som er den nederste rekke, og 34 00:01:59,810 --> 00:02:05,430 stilling d minus 2 eller kolonne d minus 2, kommer vi til å sette det til to, og 35 00:02:05,430 --> 00:02:07,860 kolonne d minus 3 vi er kommer til å sette til en. 36 00:02:07,860 --> 00:02:12,170 Så det er bare å rygge der 1 og 2 er nå. 37 00:02:12,170 --> 00:02:16,270 >> Til slutt kommer vi til å sette veldig nederst til høyre lik blank, der 38 00:02:16,270 --> 00:02:20,700 blank har blitt hash definert på toppen som 0. 39 00:02:20,700 --> 00:02:26,785 Så, det var strengt tatt ikke nødvendig, siden dette for loop kommer til å ha 40 00:02:26,785 --> 00:02:30,610 angitt nederst til høyre på 0, fordi telleren vil selvsagt komme 0. 41 00:02:30,610 --> 00:02:34,610 Men det er avhengig av at vi vet at blank ble hashet å finne en 0. 42 00:02:34,610 --> 00:02:38,280 Hvis jeg går inn i dette programmet, og senere endre blank øverst til 100, det 43 00:02:38,280 --> 00:02:39,770 skal fortsatt fungere. 44 00:02:39,770 --> 00:02:43,180 >> Så dette er bare å sørge for at nederst til høyre er faktisk lik vår 45 00:02:43,180 --> 00:02:44,870 tom verdi. 46 00:02:44,870 --> 00:02:50,270 Endelig har vi to globale variabler, så blank jeg og blank j, og vi ser 47 00:02:50,270 --> 00:02:53,360 de erklært på toppen. 48 00:02:53,360 --> 00:02:56,270 Og vi kommer til å bruke de to globale variabler å holde styr på 49 00:02:56,270 --> 00:02:59,040 stilling av emnet, slik at vi ikke trenger å se gjennom hele 50 00:02:59,040 --> 00:03:03,890 bord for å finne den tomme hver eneste gang vi prøver å gjøre et trekk. 51 00:03:03,890 --> 00:03:08,450 Så plasseringen av tomt alltid er kommer til å starte nederst til høyre. 52 00:03:08,450 --> 00:03:13,270 Så nederst til høyre er gitt ved indekser d minus 1, d minus en. 53 00:03:13,270 --> 00:03:14,880 Så, det er init. 54 00:03:14,880 --> 00:03:17,040 >> Nå flytter vi på å tegne. 55 00:03:17,040 --> 00:03:19,370 Så, er uavgjort skal være lik hvor vi kommer til å reagere 56 00:03:19,370 --> 00:03:20,970 over hele forumet. 57 00:03:20,970 --> 00:03:25,400 Og vi bare ønsker å skrive ut verdien det er i hver posisjon i styret. 58 00:03:25,400 --> 00:03:29,580 Så her er vi skriver ut verdien som er i hver stilling av brettet. 59 00:03:29,580 --> 00:03:32,280 Og legg merke til at vi gjør -. 60 00:03:32,280 --> 00:03:37,410 Og det er bare å fortelle printf som uavhengig av om det er en ett siffer eller 61 00:03:37,410 --> 00:03:42,010 tosifret tall, vi fortsatt vil ha det til ta opp to kolonner i utskriften, 62 00:03:42,010 --> 00:03:46,290 slik at hvis vi har to tall og én sifrede tall på samme bord, vår 63 00:03:46,290 --> 00:03:49,450 Styret vil fortsatt se fin og firkantet. 64 00:03:49,450 --> 00:03:54,190 >> Så vi ønsker å gjøre det for hver verdi i brettet, med unntak av det tomme. 65 00:03:54,190 --> 00:03:58,260 Så, hvis posisjon i styret er lik den blanke, så vi spesifikt 66 00:03:58,260 --> 00:04:01,730 ønsker å skrive ut bare en understreking for å representere den tomme, i stedet for 67 00:04:01,730 --> 00:04:05,150 uansett verdien av blank faktisk er. 68 00:04:05,150 --> 00:04:08,500 >> Til slutt, vi ønsker å skrive ut ut en ny linje. 69 00:04:08,500 --> 00:04:11,970 Legg merke til at dette er fortsatt inne den ytre for-løkken, men utenfor 70 00:04:11,970 --> 00:04:13,200 den indre for-løkken. 71 00:04:13,200 --> 00:04:17,930 Siden dette ytre Løkken for itera fremfor alle rader, og så dette printf er 72 00:04:17,930 --> 00:04:22,130 kommer til å bare skrive ut en ny linje, så vi gå videre for å skrive ut neste rad. 73 00:04:22,130 --> 00:04:23,910 Og det er det for uavgjort. 74 00:04:23,910 --> 00:04:27,770 >> Så nå la oss gå videre til å flytte. 75 00:04:27,770 --> 00:04:32,590 Nå passerer vi flytte, flis at brukeren er lagt inn i spillet - de 76 00:04:32,590 --> 00:04:36,360 inn flisen de ønsker å flytte - og du skal returnere en bool, så 77 00:04:36,360 --> 00:04:39,300 enten sant eller usant, avhengig av om at farten var faktisk 78 00:04:39,300 --> 00:04:43,360 gyldig - om at flis kan være flyttet inn i det tomme rommet. 79 00:04:43,360 --> 00:04:48,340 >> Så her, erklærer vi en lokal variabel, tile_1 og tile_j, som kommer til å 80 00:04:48,340 --> 00:04:52,150 være lik blank_i og blank_j, bortsett fra at det kommer til å holde orden på 81 00:04:52,150 --> 00:04:54,910 stilling av flisen. 82 00:04:54,910 --> 00:05:00,370 Nå her, kommer vi til å bruke blank_i og blank_j og si alt rett, så 83 00:05:00,370 --> 00:05:01,930 her er det tomt på brettet. 84 00:05:01,930 --> 00:05:04,420 >> Nå er det flis over det tomme? 85 00:05:04,420 --> 00:05:06,210 Er flisen til venstre for den tomme? 86 00:05:06,210 --> 00:05:07,420 Er flisen til høyre for den tomme? 87 00:05:07,420 --> 00:05:08,970 Er flis under den tomme? 88 00:05:08,970 --> 00:05:13,330 Derfor, dersom flisen er i en hvilken som helst av disse posisjoner, så vet vi at flisen 89 00:05:13,330 --> 00:05:16,390 kan flyttes inn i det tomme stedet og blind kan flyttes til der 90 00:05:16,390 --> 00:05:18,240 flis er for tiden. 91 00:05:18,240 --> 00:05:26,400 >> Så her sier vi om bord i posisjon blank_i minus en blank_j. 92 00:05:26,400 --> 00:05:31,120 Så dette er å si er det flis over dagens tomt? 93 00:05:31,120 --> 00:05:34,350 Og hvis så, kommer vi til å huske det vil si plasseringen av flisen. 94 00:05:34,350 --> 00:05:37,870 Flisen er i posisjon blank_i minus 1 og blank_j. 95 00:05:37,870 --> 00:05:40,660 Nå først har vi også denne sjekken akkurat her, er så blank_i 96 00:05:40,660 --> 00:05:41,760 større enn 0. 97 00:05:41,760 --> 00:05:43,410 >> Hvorfor ønsker vi å gjøre det? 98 00:05:43,410 --> 00:05:47,290 Vel, hvis det tomme er i den øverste raden av styret, da vi ikke ønsker å 99 00:05:47,290 --> 00:05:51,240 se over det tomme for flisen siden det ikke er noe ovenfor den øverste 100 00:05:51,240 --> 00:05:52,430 raden av brettet. 101 00:05:52,430 --> 00:05:55,950 Dette er hvordan du kan ende opp med å få noe som en segmentering feil eller 102 00:05:55,950 --> 00:05:59,030 programmet kan bare fungere på uventede måter. 103 00:05:59,030 --> 00:06:04,310 Så, er dette noe som gjør at vi ikke se på steder som ikke er gyldige. 104 00:06:04,310 --> 00:06:08,470 >> Nå skal vi gjøre det samme for alle andre mulige kombinasjoner. 105 00:06:08,470 --> 00:06:13,250 Så her ser vi under den tomme for å se om det er flis. 106 00:06:13,250 --> 00:06:16,950 Og vi må også sørge for at vi er ikke på nederste rad, eller annet vi 107 00:06:16,950 --> 00:06:18,910 bør ikke se etter flis. 108 00:06:18,910 --> 00:06:25,040 Her skal vi se til venstre for det tomt for å se om det er flis. 109 00:06:25,040 --> 00:06:27,860 Og vi bør ikke se til venstre hvis vi er i kolonnen lengst til venstre. 110 00:06:27,860 --> 00:06:30,100 Og her kommer vi til å se til høyre på blank, og vi bør ikke 111 00:06:30,100 --> 00:06:33,340 se til høyre hvis vi er i kolonnen lengst til høyre. 112 00:06:33,340 --> 00:06:37,820 >> Så, hvis ingen av disse tingene var sant, det betyr at flisen var ikke tilstøtende 113 00:06:37,820 --> 00:06:39,640 til den tomme og vi kan returnere false. 114 00:06:39,640 --> 00:06:41,230 Flyttingen var ikke gyldig. 115 00:06:41,230 --> 00:06:47,010 Men, hvis en av dem var sanne, og deretter på dette punktet, vet vi at tile_i og 116 00:06:47,010 --> 00:06:50,540 tile_j er lik stilling av flisen. 117 00:06:50,540 --> 00:06:55,210 Og så kan vi oppdatere styret ved posisjoner tile_i og tile_j. 118 00:06:55,210 --> 00:06:59,820 Vi vet at den nye verdien blir den tomme og at stillingen blank_i 119 00:06:59,820 --> 00:07:02,950 blank_j, som var den opprinnelige blank - vi vet flisen kommer til å 120 00:07:02,950 --> 00:07:04,030 flytte dit. 121 00:07:04,030 --> 00:07:07,610 >> Merker vi trenger faktisk ikke å gjøre en real swap her, siden vi vet at 122 00:07:07,610 --> 00:07:09,850 verdier som må innsettes inn i disse stillingene. 123 00:07:09,850 --> 00:07:13,780 Vi trenger ikke en midlertidig variabel rundt. 124 00:07:13,780 --> 00:07:16,920 >> Til slutt må vi huske at vi har våre globale variabler som er 125 00:07:16,920 --> 00:07:18,980 holde styr på stillingen av emnet. 126 00:07:18,980 --> 00:07:22,780 Så vi ønsker å oppdatere posisjonen det tomt for å være der flisen 127 00:07:22,780 --> 00:07:24,190 opprinnelig var. 128 00:07:24,190 --> 00:07:27,680 Til slutt, vi kommer tilbake sant siden flyttingen var vellykket. 129 00:07:27,680 --> 00:07:31,110 Vi vellykket bytte blank med flis. 130 00:07:31,110 --> 00:07:34,890 >> Greit, så siste vi må sjekke won. 131 00:07:34,890 --> 00:07:39,900 Så vant tilsvar returnerer en bool der sant skal indikere at 132 00:07:39,900 --> 00:07:41,460 Brukeren har vunnet spillet. 133 00:07:41,460 --> 00:07:43,780 Og falsk indikerer at spillet pågår fortsatt. 134 00:07:43,780 --> 00:07:46,340 Brukeren har ikke vunnet. 135 00:07:46,340 --> 00:07:52,100 Så, dette kommer til å være ganske mye det motsatte av init, der init, 136 00:07:52,100 --> 00:07:56,920 husk, vi initial styret til 15, 14, 13, 12, så videre. 137 00:07:56,920 --> 00:08:03,000 Mens vunnet, ønsker vi å sjekke om bord er 1, 2, 3, 4, 5, og så videre. 138 00:08:03,000 --> 00:08:06,600 >> Så vi kommer til å initialisere vår motvirke til en siden det er det toppen 139 00:08:06,600 --> 00:08:08,400 venstre av styret bør være. 140 00:08:08,400 --> 00:08:10,860 Og så skal vi sløyfe over hele forumet. 141 00:08:10,860 --> 00:08:13,690 La oss se bort fra denne tilstanden for en andre. 142 00:08:13,690 --> 00:08:18,410 Og denne tilstanden er bare kommer til å Sjekken er styret på denne stillingen 143 00:08:18,410 --> 00:08:20,790 lik dagens teller? 144 00:08:20,790 --> 00:08:27,040 I så fall inkrementere tellingen slik at neste posisjon vi ser på er en høyere 145 00:08:27,040 --> 00:08:29,690 enn den posisjonen vi er i akkurat nå. 146 00:08:29,690 --> 00:08:32,700 >> Så det er slik vi får øverst til venstre skal være en. 147 00:08:32,700 --> 00:08:33,950 Trinnvis telle til to. 148 00:08:33,950 --> 00:08:35,010 Se på den neste plassen. 149 00:08:35,010 --> 00:08:35,690 Er dette 2? 150 00:08:35,690 --> 00:08:37,659 I så fall inkrementere tellingen til 3. 151 00:08:37,659 --> 00:08:39,179 Neste posisjon, er dette tre? 152 00:08:39,179 --> 00:08:42,440 I så fall inkrementere tellingen til 4, og så videre. 153 00:08:42,440 --> 00:08:49,190 Så hvis det er noen posisjon på bord som ikke er lik vår telling, 154 00:08:49,190 --> 00:08:52,640 så vi ønsker å returnere falsk siden den betyr at det er noen flis som er 155 00:08:52,640 --> 00:08:55,490 ikke er i korrekt stilling. 156 00:08:55,490 --> 00:08:58,810 >> Så her, hva er denne tilstanden gjør? 157 00:08:58,810 --> 00:09:02,170 Vel, husk at den blanke er skulle gå på nederst til høyre. 158 00:09:02,170 --> 00:09:06,180 Og blank verdi kanskje ikke nødvendigvis er lik verdien av 159 00:09:06,180 --> 00:09:11,080 motvirke at kommer til å bli nådd nederst til høyre. 160 00:09:11,080 --> 00:09:15,760 Så vi ønsker spesielt å sjekke om jeg lik lik d minus 1 og j likemenn 161 00:09:15,760 --> 00:09:19,470 lik d minus en - som er å si om vi ser nederst til høyre i 162 00:09:19,470 --> 00:09:22,050 styret - da vi bare ønsker å fortsette. 163 00:09:22,050 --> 00:09:26,200 Vi ønsker å hoppe over denne spesielle iterasjon av for løkke. 164 00:09:26,200 --> 00:09:31,250 >> Og så, hvis vi klarer å komme oss gjennom dette nestet for loop, det betyr at 165 00:09:31,250 --> 00:09:34,690 Det var ingen flis som var i feil posisjon. 166 00:09:34,690 --> 00:09:38,900 Og vi bryte ut av sløyfen og kommer her, hvor vi kan returnere true. 167 00:09:38,900 --> 00:09:41,800 Alle flisene var i de riktige posisjonene og det betyr at brukeren har 168 00:09:41,800 --> 00:09:43,230 vunnet spillet. 169 00:09:43,230 --> 00:09:44,460 Og det er det. 170 00:09:44,460 --> 00:09:46,550 Mitt navn er Rob Bowden, og dette var 15. 171 00:09:46,550 --> 00:09:52,726