1 00:00:00,000 --> 00:00:13,070 2 00:00:13,070 --> 00:00:13,715 >> ROB BOWDEN: Hej. 3 00:00:13,715 --> 00:00:17,800 Jeg er Rob, og jeg håber, din spil for spil på 15. 4 00:00:17,800 --> 00:00:22,040 Nu er der fire funktioner, du har brug at gennemføre i dette program - init, 5 00:00:22,040 --> 00:00:24,650 tegne, flytte, og vundet. 6 00:00:24,650 --> 00:00:27,230 Så lad os se på init. 7 00:00:27,230 --> 00:00:32,930 >> Her ser vi den første ting, vi er kommer til at gøre, er at erklære en variabel 8 00:00:32,930 --> 00:00:34,600 kaldet tæller. 9 00:00:34,600 --> 00:00:37,620 Det kommer til at blive initialiseret til d gange d minus 1. 10 00:00:37,620 --> 00:00:40,200 Husk, at d er dimensionen af vores bestyrelse. 11 00:00:40,200 --> 00:00:43,840 Hvordan init kommer til at arbejde, er det går at gentage over den samlede bestyrelse 12 00:00:43,840 --> 00:00:46,050 og vi kommer til at starte øverst til venstre. 13 00:00:46,050 --> 00:00:48,570 >> Og lad os bare sige, at vi har en 4 med 4 bord. 14 00:00:48,570 --> 00:00:51,220 Så øverst til venstre vi er kommer til at sige, er 15. 15 00:00:51,220 --> 00:00:53,960 Og så vil vi bare at tælle gennem bestyrelser, sagde 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, forventer vi at være d gange d minus 1, som i 4 af 4 18 00:01:03,780 --> 00:01:08,290 tilfælde vil være 16 minus 1, som er korrekt 15. 19 00:01:08,290 --> 00:01:10,885 >> Og nu her er hvor vi kommer til at gentage over den samlede bestyrelse. 20 00:01:10,885 --> 00:01:14,720 Og vi kommer til at sætte hver position i bestyrelsen til den aktuelle værdi af 21 00:01:14,720 --> 00:01:19,090 vores tæller, og tælleren vil at formindske, så den næste 22 00:01:19,090 --> 00:01:22,300 position vi når kommer til at have counter være en mindre end 23 00:01:22,300 --> 00:01:23,690 den forrige plads. 24 00:01:23,690 --> 00:01:26,970 Så vi havde oprindeligt 15 og formindske tæller. 25 00:01:26,970 --> 00:01:30,065 Så vi kommer til at tildele 14 til den næste position, dekrement tæller, 26 00:01:30,065 --> 00:01:33,710 og vi kommer til at tildelte 13, og så videre. 27 00:01:33,710 --> 00:01:37,620 >> Endelig er vi nødt til at håndtere det hjørne tilfælde, hvor hvis bestyrelsen har en endnu 28 00:01:37,620 --> 00:01:44,450 dimension, så bare gør 15, 14, 13, 12, hele vejen ned til 3, 2, 1, er 29 00:01:44,450 --> 00:01:46,780 kommer til at efterlade os med en uløselig bord. 30 00:01:46,780 --> 00:01:49,390 Og vi er nødt til at skifte 1 og 2. 31 00:01:49,390 --> 00:01:52,930 Så hvis d mod 2 er lig med 0, det er hvordan vi kommer til at kontrollere 32 00:01:52,930 --> 00:01:54,410 for at se, om det overhovedet er. 33 00:01:54,410 --> 00:01:59,810 Hvis d mod 2 er lig med 0, så i række d minus 1, som er den nederste række, og 34 00:01:59,810 --> 00:02:05,430 position d minus 2 eller kolonne d minus 2, vi kommer til at sætte det til 2, og 35 00:02:05,430 --> 00:02:07,860 kolonne d minus 3 er vi kommer til at sat til 1. 36 00:02:07,860 --> 00:02:12,170 Så det er bare at vende hvor 1 og 2 er i øjeblikket. 37 00:02:12,170 --> 00:02:16,270 >> Endelig vil vi sætte meget nederste højre svarende til tomme, hvor 38 00:02:16,270 --> 00:02:20,700 tomme er blevet hash defineret ved toppen 0. 39 00:02:20,700 --> 00:02:26,785 Så det ikke var strengt nødvendigt, da denne for-løkke vil have 40 00:02:26,785 --> 00:02:30,610 indstille nederst til højre til 0, idet counter vil naturligvis nå 0. 41 00:02:30,610 --> 00:02:34,610 Men der er afhængig af os at vide, at blank blev hashed at finde en 0. 42 00:02:34,610 --> 00:02:38,280 Hvis jeg går ind i dette program og senere ændre tomt øverst til 100, det 43 00:02:38,280 --> 00:02:39,770 skal stadig arbejde. 44 00:02:39,770 --> 00:02:43,180 >> Så dette er blot at sikre, at nederst til højre er faktisk lig med vores 45 00:02:43,180 --> 00:02:44,870 blindværdi. 46 00:02:44,870 --> 00:02:50,270 Endelig har vi to globale variabler, så blank i og blank j, og vi ser 47 00:02:50,270 --> 00:02:53,360 der er erklæret i toppen. 48 00:02:53,360 --> 00:02:56,270 Og vi kommer til at bruge de to globale variabler til at holde styr på det 49 00:02:56,270 --> 00:02:59,040 position blank, så vi ikke nødt til at se gennem hele 50 00:02:59,040 --> 00:03:03,890 bord for at finde den tomme hver eneste gang vi forsøger at foretage et træk. 51 00:03:03,890 --> 00:03:08,450 Så position af emnet altid er kommer til at starte i bunden til højre. 52 00:03:08,450 --> 00:03:13,270 Så nederst til højre er givet ved indekser d minus 1, d minus 1. 53 00:03:13,270 --> 00:03:14,880 Så det er init. 54 00:03:14,880 --> 00:03:17,040 >> Nu bevæger vi os på at tegne. 55 00:03:17,040 --> 00:03:19,370 Så er uafgjort vil være ens hvor vi kommer til at gentage 56 00:03:19,370 --> 00:03:20,970 over hele linjen. 57 00:03:20,970 --> 00:03:25,400 Og vi ønsker blot at udskrive værdien der er i den enkelte stilling af brættet. 58 00:03:25,400 --> 00:03:29,580 Så her er vi udskriver den værdi, der er i hver position af brættet. 59 00:03:29,580 --> 00:03:32,280 Og bemærk, at vi gør -. 60 00:03:32,280 --> 00:03:37,410 Og det er bare at fortælle printf der uanset om det er en et ciffer eller 61 00:03:37,410 --> 00:03:42,010 to-cifrede nummer, vi stadig ønsker det tage op to kolonner i udskriften, 62 00:03:42,010 --> 00:03:46,290 så hvis vi har to tal og ét cifrede numre i samme bord, vores 63 00:03:46,290 --> 00:03:49,450 bestyrelse vil stadig se pæn og firkantet. 64 00:03:49,450 --> 00:03:54,190 >> Så vi ønsker at gøre det for hver værdi i bestyrelsen, bortset fra blank. 65 00:03:54,190 --> 00:03:58,260 Så hvis position i bestyrelsen lig den tomme, så vi specifikt 66 00:03:58,260 --> 00:04:01,730 ønsker at udskrive blot en understregning at repræsentere den tomme, i stedet for 67 00:04:01,730 --> 00:04:05,150 uanset værdien af blank faktisk er. 68 00:04:05,150 --> 00:04:08,500 >> Endelig ønsker vi at udskrive en ny linje. 69 00:04:08,500 --> 00:04:11,970 Bemærk at dette er stadig inde den ydre for-løkke, men uden 70 00:04:11,970 --> 00:04:13,200 den indre for-løkke. 71 00:04:13,200 --> 00:04:17,930 Da dette ydre for-løkke er iteration løbet af alle rækker, og så dette printf er 72 00:04:17,930 --> 00:04:22,130 vil bare udskrive en ny linje, så vi gå videre til at udskrive den næste række. 73 00:04:22,130 --> 00:04:23,910 Og det er det for uafgjort. 74 00:04:23,910 --> 00:04:27,770 >> Så lad os nu gå videre til at flytte. 75 00:04:27,770 --> 00:04:32,590 Nu passerer vi flytte flisen at Brugeren er indtastet i spillet - de 76 00:04:32,590 --> 00:04:36,360 indtaste den flise, de ønsker at flytte - og du skulle returnere en bool, så 77 00:04:36,360 --> 00:04:39,300 enten sand eller falsk, afhængigt af om at flytte var faktisk 78 00:04:39,300 --> 00:04:43,360 gyldig - om denne flise kan være flyttede ind i tomme rum. 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 at 80 00:04:48,340 --> 00:04:52,150 svare til blank_i og blank_j, bortset fra at det kommer til at holde styr på 81 00:04:52,150 --> 00:04:54,910 stilling af flisen. 82 00:04:54,910 --> 00:05:00,370 Nu her, vi kommer til at bruge blank_i og blank_j og sige okay, så 83 00:05:00,370 --> 00:05:01,930 her er den blank på tavlen. 84 00:05:01,930 --> 00:05:04,420 >> Nu er flisen over den tomme? 85 00:05:04,420 --> 00:05:06,210 Er flisen til venstre for emnet? 86 00:05:06,210 --> 00:05:07,420 Er flisen til højre for emnet? 87 00:05:07,420 --> 00:05:08,970 Er flisen under den blanke? 88 00:05:08,970 --> 00:05:13,330 Så hvis flisen er i enhver af de positioner, så vi ved, at flisen 89 00:05:13,330 --> 00:05:16,390 kan bevæges i det tomme stedet og emnet kan bevæges til hvor 90 00:05:16,390 --> 00:05:18,240 flise i øjeblikket er. 91 00:05:18,240 --> 00:05:26,400 >> Så her, siger vi, hvis bord position blank_i minus 1 blank_j. 92 00:05:26,400 --> 00:05:31,120 Så dette siger er flisen over den aktuelle blank? 93 00:05:31,120 --> 00:05:34,350 Og hvis ja, vi kommer til at huske dette er tilfældet af flisen. 94 00:05:34,350 --> 00:05:37,870 Flisen er i position blank_i minus 1 og blank_j. 95 00:05:37,870 --> 00:05:40,660 nu først, har vi også denne kontrol lige her, så blank_i er 96 00:05:40,660 --> 00:05:41,760 større end 0. 97 00:05:41,760 --> 00:05:43,410 >> Hvorfor ønsker vi at gøre det? 98 00:05:43,410 --> 00:05:47,290 Tja, hvis emnet er i den øverste række af bestyrelsen, så ønsker vi ikke at 99 00:05:47,290 --> 00:05:51,240 kigge over dummyen flisen siden der er intet over toppen 100 00:05:51,240 --> 00:05:52,430 rækken af ​​bestyrelsen. 101 00:05:52,430 --> 00:05:55,950 Dette er, hvordan du måske ende med at få noget som en segmentering fejl eller 102 00:05:55,950 --> 00:05:59,030 Deres program kan bare arbejde på uventede måder. 103 00:05:59,030 --> 00:06:04,310 Så er denne at sikre, at vi ikke kigge på steder, der ikke er gyldige. 104 00:06:04,310 --> 00:06:08,470 >> Nu skal vi til at gøre det samme for alle andre mulige kombinationer. 105 00:06:08,470 --> 00:06:13,250 Så her ser vi under den blanke at se, om det er den flise. 106 00:06:13,250 --> 00:06:16,950 Og vi også nødt til at sikre, at vi er ikke på den nederste række, eller andet, vi 107 00:06:16,950 --> 00:06:18,910 skal ikke lede efter flisen. 108 00:06:18,910 --> 00:06:25,040 Her, vi kommer til at se til venstre for den blank for at se om det er flisen. 109 00:06:25,040 --> 00:06:27,860 Og vi skal ikke se til venstre hvis vi er i kolonnen til venstre. 110 00:06:27,860 --> 00:06:30,100 Og her vil vi se på højre i den tomme, og vi bør ikke 111 00:06:30,100 --> 00:06:33,340 se til højre, hvis vi er i kolonnen længst til højre. 112 00:06:33,340 --> 00:06:37,820 >> Så hvis ingen af ​​disse ting var sandt, det betyder, at flisen ikke var tilstødende 113 00:06:37,820 --> 00:06:39,640 til den tomme, og vi kan vende tilbage falsk. 114 00:06:39,640 --> 00:06:41,230 Flytningen var ikke gyldig. 115 00:06:41,230 --> 00:06:47,010 Men hvis en af ​​dem var sande, så på dette punkt, ved vi, at tile_i og 116 00:06:47,010 --> 00:06:50,540 tile_j er lig med stilling af flisen. 117 00:06:50,540 --> 00:06:55,210 Og så kan vi opdatere bestyrelsen på positioner tile_i og tile_j. 118 00:06:55,210 --> 00:06:59,820 Vi kender den nye værdi vil blive tom og at positionen blank_i 119 00:06:59,820 --> 00:07:02,950 blank_j, som oprindeligt var blank - vi kender flisen kommer til at 120 00:07:02,950 --> 00:07:04,030 flytte dertil. 121 00:07:04,030 --> 00:07:07,610 >> Bemærk vi behøver faktisk ikke at gøre en real swap her, da vi kender 122 00:07:07,610 --> 00:07:09,850 værdier, der skal indsættes i disse stillinger. 123 00:07:09,850 --> 00:07:13,780 Vi har ikke brug for en midlertidig variabel omkring. 124 00:07:13,780 --> 00:07:16,920 >> Endelig er vi nødt til at huske, at vi har vores globale variabler, der 125 00:07:16,920 --> 00:07:18,980 holde styr på positionen af emnet. 126 00:07:18,980 --> 00:07:22,780 Så vi ønsker at opdatere position den tomme at være, hvor flisen 127 00:07:22,780 --> 00:07:24,190 oprindeligt var. 128 00:07:24,190 --> 00:07:27,680 Endelig vil vi returnere sandt, da flytningen var vellykket. 129 00:07:27,680 --> 00:07:31,110 Vi har med held skifte blank med flisen. 130 00:07:31,110 --> 00:07:34,890 >> Okay, så sidste vi nødt til at tjekke vundet. 131 00:07:34,890 --> 00:07:39,900 Så vandt ligeledes returnerer en bool, hvor sand vil indikere, at 132 00:07:39,900 --> 00:07:41,460 brugeren har vundet spillet. 133 00:07:41,460 --> 00:07:43,780 Og falsk indikerer, at spillet er stadig i gang. 134 00:07:43,780 --> 00:07:46,340 Brugeren har ikke vundet. 135 00:07:46,340 --> 00:07:52,100 Så er denne kommer til at være temmelig meget det modsatte af init, hvor init, 136 00:07:52,100 --> 00:07:56,920 Husk, vi initialisere bestyrelsen til 15, 14, 13, 12, så videre. 137 00:07:56,920 --> 00:08:03,000 Betragtninger vundet, vi ønsker at kontrollere, om bord er 1, 2, 3, 4, 5, og så videre. 138 00:08:03,000 --> 00:08:06,600 >> Så vi kommer til at initialisere vores imødegå til 1, da det er hvad den øverste 139 00:08:06,600 --> 00:08:08,400 venstre side af brættet skal være. 140 00:08:08,400 --> 00:08:10,860 Og så vil vi løkke over hele linjen. 141 00:08:10,860 --> 00:08:13,690 Lad os se bort fra denne betingelse for en anden. 142 00:08:13,690 --> 00:08:18,410 Og denne betingelse er bare at check er bestyrelsen på denne position 143 00:08:18,410 --> 00:08:20,790 svarende til de nuværende tæller? 144 00:08:20,790 --> 00:08:27,040 Hvis ja, øg tælle så næste position vi se på, er en højere 145 00:08:27,040 --> 00:08:29,690 end den position, vi er i lige nu. 146 00:08:29,690 --> 00:08:32,700 >> Så det er, hvordan vi får øverst til venstre bør være 1. 147 00:08:32,700 --> 00:08:33,950 Øg tælle til 2.. 148 00:08:33,950 --> 00:08:35,010 Kig på den næste position. 149 00:08:35,010 --> 00:08:35,690 Er det 2? 150 00:08:35,690 --> 00:08:37,659 Hvis ja, øg tælle til 3.. 151 00:08:37,659 --> 00:08:39,179 Næste position, er dette 3? 152 00:08:39,179 --> 00:08:42,440 Hvis ja, øg tæller til 4, og så videre. 153 00:08:42,440 --> 00:08:49,190 Så hvis der er nogen position på bord, der ikke er lig vores optælling, 154 00:08:49,190 --> 00:08:52,640 så vi ønsker at vende tilbage falsk, da der betyder, at der er nogle flise, der er 155 00:08:52,640 --> 00:08:55,490 ikke i den korrekte position. 156 00:08:55,490 --> 00:08:58,810 >> Så her, hvad er denne betingelse gør? 157 00:08:58,810 --> 00:09:02,170 Nå, huske på, at emnet er formodes at gå på nederst til højre. 158 00:09:02,170 --> 00:09:06,180 Og den tomme værdi måske ikke nødvendigvis være lig med værdien af ​​den 159 00:09:06,180 --> 00:09:11,080 imødegå, at der vil blive nået nederst til højre. 160 00:09:11,080 --> 00:09:15,760 Så vi specifikt ønsker at kontrollere, hvis jeg lig lig d minus 1 og j ligemænd 161 00:09:15,760 --> 00:09:19,470 lig d minus 1 - som siger, hvis vi kigger på nederst til højre på 162 00:09:19,470 --> 00:09:22,050 bestyrelsen - så vi bare ønsker at fortsætte. 163 00:09:22,050 --> 00:09:26,200 Vi ønsker at springe denne særlige iteration af for-løkken. 164 00:09:26,200 --> 00:09:31,250 >> Og så, hvis vi formår at komme igennem dette indlejret for løkke, der betyder, at 165 00:09:31,250 --> 00:09:34,690 der var ingen flise, der var i den forkerte position. 166 00:09:34,690 --> 00:09:38,900 Og vi bryde ud af løkken og komme her, hvor vi kan returnere sandt. 167 00:09:38,900 --> 00:09:41,800 Alle fliser var i den korrekte position og det betyder, at brugeren har 168 00:09:41,800 --> 00:09:43,230 vandt spillet. 169 00:09:43,230 --> 00:09:44,460 Og det er det. 170 00:09:44,460 --> 00:09:46,550 Mit navn er Rob Bowden, og det var 15 år. 171 00:09:46,550 --> 00:09:52,726