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 Jag är Rob, och jag hoppas att din spel för omgång 15. 4 00:00:17,800 --> 00:00:22,040 Nu finns det fyra funktioner du behöver att genomföra i det här programmet - init, 5 00:00:22,040 --> 00:00:24,650 rita, flytta, och vann. 6 00:00:24,650 --> 00:00:27,230 Så, låt oss titta på init. 7 00:00:27,230 --> 00:00:32,930 >> Här ser vi det första vi är ska göra är att deklarera en variabel 8 00:00:32,930 --> 00:00:34,600 kallas disk. 9 00:00:34,600 --> 00:00:37,620 Det kommer att initieras till d gånger d minus 1. 10 00:00:37,620 --> 00:00:40,200 Notera att d är dimensionen i vår styrelse. 11 00:00:40,200 --> 00:00:43,840 Hur init kommer att fungera är att det kommer att iterera över hela forumet 12 00:00:43,840 --> 00:00:46,050 och vi kommer att starta längst upp till vänster. 13 00:00:46,050 --> 00:00:48,570 >> Och låt oss bara säga att vi har en 4 av 4 ombord. 14 00:00:48,570 --> 00:00:51,220 Så upp till vänster vi är kommer att säga är 15. 15 00:00:51,220 --> 00:00:53,960 Och då vi ska bara räkna genom styrelser, säger 15, 14, 13, 16 00:00:53,960 --> 00:00:58,510 12, 11, 10, 9, 8, 7, 6, 5, 4, och så vidare. 17 00:00:58,510 --> 00:01:03,780 Så upp till vänster, räknar vi med att d gånger d minus 1, vilket på fyra av fyra 18 00:01:03,780 --> 00:01:08,290 fall kommer att bli 16 minus 1, som är korrekt 15. 19 00:01:08,290 --> 00:01:10,885 >> Och nu här är där vi ska iterera över hela forumet. 20 00:01:10,885 --> 00:01:14,720 Och vi kommer att ställa in varje position i styrelsen att nuvärdet av 21 00:01:14,720 --> 00:01:19,090 vår disk, och sedan räknaren går att dekrementera, så att nästa 22 00:01:19,090 --> 00:01:22,300 läge når vi kommer att ha räknare vara ett mindre än 23 00:01:22,300 --> 00:01:23,690 den tidigare positionen. 24 00:01:23,690 --> 00:01:26,970 Så vi hade från början 15 och dekrementera disk. 25 00:01:26,970 --> 00:01:30,065 Så då ska vi ge 14 till nästa position, minskningsräknare, 26 00:01:30,065 --> 00:01:33,710 och vi kommer att tilldelas 13, och så vidare. 27 00:01:33,710 --> 00:01:37,620 >> Slutligen måste vi hantera det hörnet fall, om styrelsen har en jämn 28 00:01:37,620 --> 00:01:44,450 dimension, sedan bara göra 15, 14, 13, 12, hela vägen ner till 3, 2, 1, är 29 00:01:44,450 --> 00:01:46,780 kommer att lämna oss med ett olösligt styrelse. 30 00:01:46,780 --> 00:01:49,390 Och vi måste byta 1 och 2. 31 00:01:49,390 --> 00:01:52,930 Så, om d mod 2 är lika med 0, det är hur vi ska kontrollera 32 00:01:52,930 --> 00:01:54,410 för att se om det är till och med. 33 00:01:54,410 --> 00:01:59,810 Om d mod 2 är lika med 0, sedan på rad d minus 1, som är den nedre raden, och 34 00:01:59,810 --> 00:02:05,430 läge d minus 2 eller kolumn d minus 2, vi kommer att ställa det till 2, och 35 00:02:05,430 --> 00:02:07,860 kolumn d minus 3 är vi kommer att ställa till 1. 36 00:02:07,860 --> 00:02:12,170 Så det är bara att vända om den 1 och 2 är närvarande. 37 00:02:12,170 --> 00:02:16,270 >> Slutligen kommer vi att ställa in mycket längst ned till höger lika med tom, där 38 00:02:16,270 --> 00:02:20,700 tom har hash definierats på toppen som 0. 39 00:02:20,700 --> 00:02:26,785 Så, det var det absolut nödvändigt, eftersom detta för slinga kommer att ha 40 00:02:26,785 --> 00:02:30,610 ställa det nedre högra till 0, eftersom räknare kommer naturligtvis att 0. 41 00:02:30,610 --> 00:02:34,610 Men det bygger på att vi vet att blank ades hashas för att hitta ett 0. 42 00:02:34,610 --> 00:02:38,280 Om jag går in i det här programmet och senare ändra blank upptill till 100, det 43 00:02:38,280 --> 00:02:39,770 bör fortfarande fungera. 44 00:02:39,770 --> 00:02:43,180 >> Så det här är bara att se till att längst ned till höger är faktiskt lika med vår 45 00:02:43,180 --> 00:02:44,870 tomt värde. 46 00:02:44,870 --> 00:02:50,270 Slutligen har vi två globala variabler, så tom i och tom j, och vi ser 47 00:02:50,270 --> 00:02:53,360 de som deklarerats i toppen. 48 00:02:53,360 --> 00:02:56,270 Och vi kommer att använda dessa två globala variabler för att hålla reda på 49 00:02:56,270 --> 00:02:59,040 ställning av ämnet, så att vi inte måste titta igenom hela 50 00:02:59,040 --> 00:03:03,890 ombord för att hitta den tomma varenda gång vi försöker att göra ett drag. 51 00:03:03,890 --> 00:03:08,450 Så placeringen av ämnet alltid är kommer att börja längst ner till höger. 52 00:03:08,450 --> 00:03:13,270 Så det nedre högra ges av index d minus 1, d minus 1. 53 00:03:13,270 --> 00:03:14,880 Så, det är init. 54 00:03:14,880 --> 00:03:17,040 >> Nu går vi vidare för att rita. 55 00:03:17,040 --> 00:03:19,370 Så, är oavgjort kommer att vara liknande där vi kommer att iterera 56 00:03:19,370 --> 00:03:20,970 över hela forumet. 57 00:03:20,970 --> 00:03:25,400 Och vi vill bara skriva ut värdet det är i varje position i styrelsen. 58 00:03:25,400 --> 00:03:29,580 Så här, vi skriver ut det värde som är i varje position i styrelsen. 59 00:03:29,580 --> 00:03:32,280 Och märker att vi gör -. 60 00:03:32,280 --> 00:03:37,410 Och det är bara att berätta printf som oavsett om det är en en siffra eller 61 00:03:37,410 --> 00:03:42,010 tvåsiffrigt nummer, ändå vill vi det till ta upp två kolumner i utskriften, 62 00:03:42,010 --> 00:03:46,290 så att om vi har två siffror och en siffriga tal i samma styrelse, vår 63 00:03:46,290 --> 00:03:49,450 Styrelsen kommer fortfarande att se bra och torg. 64 00:03:49,450 --> 00:03:54,190 >> Så vi vill göra det för varje värde i styrelsen, utom blank. 65 00:03:54,190 --> 00:03:58,260 Så, om läget i styrelsen är lika den tomma, då vi specifikt 66 00:03:58,260 --> 00:04:01,730 vill skriva ut bara ett understreck att representera den tomma, i stället för 67 00:04:01,730 --> 00:04:05,150 oberoende av värdet av tom faktiskt är. 68 00:04:05,150 --> 00:04:08,500 >> Slutligen vill vi skriva ut en ny linje. 69 00:04:08,500 --> 00:04:11,970 Lägg märke till att detta fortfarande är inne den yttre for-slingan, men utanför 70 00:04:11,970 --> 00:04:13,200 det inre för loopen. 71 00:04:13,200 --> 00:04:17,930 Eftersom detta yttre för loop iteration över alla rader, och så denna printf är 72 00:04:17,930 --> 00:04:22,130 kommer att bara skriva ut en ny linje, så vi gå vidare för att skriva ut på nästa varv. 73 00:04:22,130 --> 00:04:23,910 Och det är det för oavgjort. 74 00:04:23,910 --> 00:04:27,770 >> Så, nu ska vi gå vidare för att flytta. 75 00:04:27,770 --> 00:04:32,590 Nu passerar vi flytta, kakel som användaren in i spelet - de 76 00:04:32,590 --> 00:04:36,360 in i kakel de vill flytta - och du ska returnera en bool, så 77 00:04:36,360 --> 00:04:39,300 antingen sant eller falskt, beroende på om att flytta var faktiskt 78 00:04:39,300 --> 00:04:43,360 giltigt - oavsett om det kakel kan vara flyttade in i det tomma utrymmet. 79 00:04:43,360 --> 00:04:48,340 >> Så här deklarerar vi en lokal variabel, tile_1 och tile_j, som kommer att 80 00:04:48,340 --> 00:04:52,150 likna blank_i och blank_j, förutom att det kommer att hålla reda på 81 00:04:52,150 --> 00:04:54,910 positionen av plattan. 82 00:04:54,910 --> 00:05:00,370 Nu här kommer vi att använda blank_i och blank_j och säga okej, så 83 00:05:00,370 --> 00:05:01,930 Här är det tomt på bordet. 84 00:05:01,930 --> 00:05:04,420 >> Nu är det kakel ovanför den tom? 85 00:05:04,420 --> 00:05:06,210 Är plattan till vänster om den är tom? 86 00:05:06,210 --> 00:05:07,420 Är plattan till höger om den är tom? 87 00:05:07,420 --> 00:05:08,970 Är det kakel nedanför tom? 88 00:05:08,970 --> 00:05:13,330 Så, om brickan är i någon av de som positioner, då vet vi att plattan 89 00:05:13,330 --> 00:05:16,390 kan förflyttas in i det tomma plats och ämnet kan förflyttas till den plats där den 90 00:05:16,390 --> 00:05:18,240 kakel för närvarande är. 91 00:05:18,240 --> 00:05:26,400 >> Så här säger vi om ombord vid position blank_i minus en blank_j. 92 00:05:26,400 --> 00:05:31,120 Så här säger är kakel över det aktuella ämnet? 93 00:05:31,120 --> 00:05:34,350 Och i så fall kommer vi att minnas som är positionen för plattan. 94 00:05:34,350 --> 00:05:37,870 Brickan är på plats blank_i minus 1 och blank_j. 95 00:05:37,870 --> 00:05:40,660 Nu först har vi också denna kontroll just här, är så blank_i 96 00:05:40,660 --> 00:05:41,760 som är större än 0. 97 00:05:41,760 --> 00:05:43,410 >> Varför vill vi göra det? 98 00:05:43,410 --> 00:05:47,290 Tja, om ämnet är i den översta raden i styrelsen, då vi inte vill 99 00:05:47,290 --> 00:05:51,240 titta över det tomma plattan sedan det inte finns någonting ovanför toppen 100 00:05:51,240 --> 00:05:52,430 raden i styrelsen. 101 00:05:52,430 --> 00:05:55,950 Detta är hur du kan sluta få något som en segmentering fel eller 102 00:05:55,950 --> 00:05:59,030 ditt program kan bara arbeta på oväntade sätt. 103 00:05:59,030 --> 00:06:04,310 Så, är det att se till att vi inte titta på platser som inte är giltiga. 104 00:06:04,310 --> 00:06:08,470 >> Nu ska vi göra samma sak för alla andra möjliga kombinationer. 105 00:06:08,470 --> 00:06:13,250 Så här, vi tittar under den tomma för att se om det är kakel. 106 00:06:13,250 --> 00:06:16,950 Och vi måste också se till att vi är inte på den nedersta raden, eller annat vi 107 00:06:16,950 --> 00:06:18,910 bör inte leta efter kakel. 108 00:06:18,910 --> 00:06:25,040 Här kommer vi att se till vänster om ämnet för att se om det är kakel. 109 00:06:25,040 --> 00:06:27,860 Och vi ska inte se till vänster Om vi ​​är i kolumnen längst till vänster. 110 00:06:27,860 --> 00:06:30,100 Och här ska vi se till höger på tomt, och vi bör inte 111 00:06:30,100 --> 00:06:33,340 se till höger om vi i kolumnen längst till höger. 112 00:06:33,340 --> 00:06:37,820 >> Så, om inget av dessa saker var sant, det betyder brickan var inte angränsande 113 00:06:37,820 --> 00:06:39,640 till den tomma och kan vi returnera false. 114 00:06:39,640 --> 00:06:41,230 Flytten var inte giltigt. 115 00:06:41,230 --> 00:06:47,010 Men, om en av de var sant, sedan vid denna punkt, vi vet att tile_i och 116 00:06:47,010 --> 00:06:50,540 tile_j är lika med den positionen av plattan. 117 00:06:50,540 --> 00:06:55,210 Och så kan vi uppdatera styrelsen på positioner tile_i och tile_j. 118 00:06:55,210 --> 00:06:59,820 Vi vet att det nya värdet blir den tomma och att positionen blank_i 119 00:06:59,820 --> 00:07:02,950 blank_j, vilket var den ursprungliga tom - vi vet att kakel kommer att 120 00:07:02,950 --> 00:07:04,030 flytta dit. 121 00:07:04,030 --> 00:07:07,610 >> Lägg märke till att vi egentligen inte behöver göra en riktig swap här, eftersom vi vet att 122 00:07:07,610 --> 00:07:09,850 värden som måste införas i dessa positioner. 123 00:07:09,850 --> 00:07:13,780 Vi behöver inte en tillfällig variabel runt. 124 00:07:13,780 --> 00:07:16,920 >> Slutligen måste vi komma ihåg att vi har våra globala variabler som är 125 00:07:16,920 --> 00:07:18,980 hålla reda på positionen av ämnet. 126 00:07:18,980 --> 00:07:22,780 Så vi vill att uppdatera läget för ämnet för att vara där kakel 127 00:07:22,780 --> 00:07:24,190 ursprungligen var. 128 00:07:24,190 --> 00:07:27,680 Slutligen återvänder vi sant eftersom flytten var framgångsrik. 129 00:07:27,680 --> 00:07:31,110 Vi lyckas byta tomt med kakel. 130 00:07:31,110 --> 00:07:34,890 >> Okej, så vi äntligen måste kontrollera vann. 131 00:07:34,890 --> 00:07:39,900 Så vann på samma sätt returnerar en bool där sann kommer att indikera att 132 00:07:39,900 --> 00:07:41,460 användaren har vunnit spelet. 133 00:07:41,460 --> 00:07:43,780 Och falskt indikerar att spelet fortfarande pågår. 134 00:07:43,780 --> 00:07:46,340 Användaren har inte vunnit. 135 00:07:46,340 --> 00:07:52,100 Så, detta kommer att bli ganska mycket motsatsen till init, där init, 136 00:07:52,100 --> 00:07:56,920 kom ihåg, vi initiera styrelsen till 15, 14, 13, 12, osv. 137 00:07:56,920 --> 00:08:03,000 Av följande skäl vunnit, vi vill kontrollera om ombord är en, två, tre, fyra, fem, och så vidare. 138 00:08:03,000 --> 00:08:06,600 >> Så kommer vi att initiera vår motverka till 1, eftersom det är vad toppen 139 00:08:06,600 --> 00:08:08,400 vänster i styrelsen ska vara. 140 00:08:08,400 --> 00:08:10,860 Och då ska vi slinga över hela forumet. 141 00:08:10,860 --> 00:08:13,690 Låt oss bortse från detta villkor för en sekund. 142 00:08:13,690 --> 00:08:18,410 Och detta tillstånd bara kommer att kontrollen är styrelsen i detta läge 143 00:08:18,410 --> 00:08:20,790 lika med de nuvarande räkningar? 144 00:08:20,790 --> 00:08:27,040 Om så är fallet, inkrementera räkningen så att nästa position vi tittar på är en högre 145 00:08:27,040 --> 00:08:29,690 än det läge vi befinner oss i just nu. 146 00:08:29,690 --> 00:08:32,700 >> Så det är hur vi får överst till vänster bör vara ett. 147 00:08:32,700 --> 00:08:33,950 Inkrementera räknevärdet till 2. 148 00:08:33,950 --> 00:08:35,010 Titta på nästa position. 149 00:08:35,010 --> 00:08:35,690 Är det 2? 150 00:08:35,690 --> 00:08:37,659 Om så är fallet, inkrementera räknevärdet till 3. 151 00:08:37,659 --> 00:08:39,179 Nästa läge är det 3? 152 00:08:39,179 --> 00:08:42,440 Om så är fallet, öka räkningen till 4, och så vidare. 153 00:08:42,440 --> 00:08:49,190 Så, om det finns någon plats på bräda som inte är lika vår räkning, 154 00:08:49,190 --> 00:08:52,640 då vill vi att returnera false, eftersom det innebär att det finns någon bricka som är 155 00:08:52,640 --> 00:08:55,490 inte är i rätt position. 156 00:08:55,490 --> 00:08:58,810 >> Så här, vad är detta tillstånd gör? 157 00:08:58,810 --> 00:09:02,170 Tja, kom ihåg att det tomma är tänkt att gå längst ner till höger. 158 00:09:02,170 --> 00:09:06,180 Och det tomma värde kanske inte nödvändigtvis vara lika med värdet av den 159 00:09:06,180 --> 00:09:11,080 motverka som kommer att nås längst ner till höger. 160 00:09:11,080 --> 00:09:15,760 Så vi specifikt vill kontrollera om jag lika lika d minus 1 och j jämlikar 161 00:09:15,760 --> 00:09:19,470 är lika med d minus 1 - som säger att vi tittar längst ner till höger i 162 00:09:19,470 --> 00:09:22,050 styrelsen - då vi bara vill fortsätta. 163 00:09:22,050 --> 00:09:26,200 Vi vill hoppa över denna iteration av for-slingan. 164 00:09:26,200 --> 00:09:31,250 >> Och så, om vi lyckas få igenom detta kapslade för slinga, gör att det 165 00:09:31,250 --> 00:09:34,690 det fanns ingen bricka som var i fel läge. 166 00:09:34,690 --> 00:09:38,900 Och vi bryta sig ur loopen och komma Här, där vi kan återvända sant. 167 00:09:38,900 --> 00:09:41,800 Alla brickor var i rätt läge och detta innebär att användaren har 168 00:09:41,800 --> 00:09:43,230 vann matchen. 169 00:09:43,230 --> 00:09:44,460 Och det är det. 170 00:09:44,460 --> 00:09:46,550 Mitt namn är Rob Bowden, och det var 15. 171 00:09:46,550 --> 00:09:52,726