>> ROB BOWDEN: Hej.
Jag är Rob, och jag hoppas att din spel för omgång 15.
Nu finns det fyra funktioner du behöver att genomföra i det här programmet - init,
rita, flytta, och vann.
Så, låt oss titta på init.
>> Här ser vi det första vi är ska göra är att deklarera en variabel
kallas disk.
Det kommer att initieras till d gånger d minus 1.
Notera att d är dimensionen i vår styrelse.
Hur init kommer att fungera är att det kommer att iterera över hela forumet
och vi kommer att starta längst upp till vänster.
>> Och låt oss bara säga att vi har en 4 av 4 ombord.
Så upp till vänster vi är kommer att säga är 15.
Och då vi ska bara räkna genom styrelser, säger 15, 14, 13,
12, 11, 10, 9, 8, 7, 6, 5, 4, och så vidare.
Så upp till vänster, räknar vi med att d gånger d minus 1, vilket på fyra av fyra
fall kommer att bli 16 minus 1, som är korrekt 15.
>> Och nu här är där vi ska iterera över hela forumet.
Och vi kommer att ställa in varje position i styrelsen att nuvärdet av
vår disk, och sedan räknaren går att dekrementera, så att nästa
läge når vi kommer att ha räknare vara ett mindre än
den tidigare positionen.
Så vi hade från början 15 och dekrementera disk.
Så då ska vi ge 14 till nästa position, minskningsräknare,
och vi kommer att tilldelas 13, och så vidare.
>> Slutligen måste vi hantera det hörnet fall, om styrelsen har en jämn
dimension, sedan bara göra 15, 14, 13, 12, hela vägen ner till 3, 2, 1, är
kommer att lämna oss med ett olösligt styrelse.
Och vi måste byta 1 och 2.
Så, om d mod 2 är lika med 0, det är hur vi ska kontrollera
för att se om det är till och med.
Om d mod 2 är lika med 0, sedan på rad d minus 1, som är den nedre raden, och
läge d minus 2 eller kolumn d minus 2, vi kommer att ställa det till 2, och
kolumn d minus 3 är vi kommer att ställa till 1.
Så det är bara att vända om den 1 och 2 är närvarande.
>> Slutligen kommer vi att ställa in mycket längst ned till höger lika med tom, där
tom har hash definierats på toppen som 0.
Så, det var det absolut nödvändigt, eftersom detta för slinga kommer att ha
ställa det nedre högra till 0, eftersom räknare kommer naturligtvis att 0.
Men det bygger på att vi vet att blank ades hashas för att hitta ett 0.
Om jag går in i det här programmet och senare ändra blank upptill till 100, det
bör fortfarande fungera.
>> Så det här är bara att se till att längst ned till höger är faktiskt lika med vår
tomt värde.
Slutligen har vi två globala variabler, så tom i och tom j, och vi ser
de som deklarerats i toppen.
Och vi kommer att använda dessa två globala variabler för att hålla reda på
ställning av ämnet, så att vi inte måste titta igenom hela
ombord för att hitta den tomma varenda gång vi försöker att göra ett drag.
Så placeringen av ämnet alltid är kommer att börja längst ner till höger.
Så det nedre högra ges av index d minus 1, d minus 1.
Så, det är init.
>> Nu går vi vidare för att rita.
Så, är oavgjort kommer att vara liknande där vi kommer att iterera
över hela forumet.
Och vi vill bara skriva ut värdet det är i varje position i styrelsen.
Så här, vi skriver ut det värde som är i varje position i styrelsen.
Och märker att vi gör -.
Och det är bara att berätta printf som oavsett om det är en en siffra eller
tvåsiffrigt nummer, ändå vill vi det till ta upp två kolumner i utskriften,
så att om vi har två siffror och en siffriga tal i samma styrelse, vår
Styrelsen kommer fortfarande att se bra och torg.
>> Så vi vill göra det för varje värde i styrelsen, utom blank.
Så, om läget i styrelsen är lika den tomma, då vi specifikt
vill skriva ut bara ett understreck att representera den tomma, i stället för
oberoende av värdet av tom faktiskt är.
>> Slutligen vill vi skriva ut en ny linje.
Lägg märke till att detta fortfarande är inne den yttre for-slingan, men utanför
det inre för loopen.
Eftersom detta yttre för loop iteration över alla rader, och så denna printf är
kommer att bara skriva ut en ny linje, så vi gå vidare för att skriva ut på nästa varv.
Och det är det för oavgjort.
>> Så, nu ska vi gå vidare för att flytta.
Nu passerar vi flytta, kakel som användaren in i spelet - de
in i kakel de vill flytta - och du ska returnera en bool, så
antingen sant eller falskt, beroende på om att flytta var faktiskt
giltigt - oavsett om det kakel kan vara flyttade in i det tomma utrymmet.
>> Så här deklarerar vi en lokal variabel, tile_1 och tile_j, som kommer att
likna blank_i och blank_j, förutom att det kommer att hålla reda på
positionen av plattan.
Nu här kommer vi att använda blank_i och blank_j och säga okej, så
Här är det tomt på bordet.
>> Nu är det kakel ovanför den tom?
Är plattan till vänster om den är tom?
Är plattan till höger om den är tom?
Är det kakel nedanför tom?
Så, om brickan är i någon av de som positioner, då vet vi att plattan
kan förflyttas in i det tomma plats och ämnet kan förflyttas till den plats där den
kakel för närvarande är.
>> Så här säger vi om ombord vid position blank_i minus en blank_j.
Så här säger är kakel över det aktuella ämnet?
Och i så fall kommer vi att minnas som är positionen för plattan.
Brickan är på plats blank_i minus 1 och blank_j.
Nu först har vi också denna kontroll just här, är så blank_i
som är större än 0.
>> Varför vill vi göra det?
Tja, om ämnet är i den översta raden i styrelsen, då vi inte vill
titta över det tomma plattan sedan det inte finns någonting ovanför toppen
raden i styrelsen.
Detta är hur du kan sluta få något som en segmentering fel eller
ditt program kan bara arbeta på oväntade sätt.
Så, är det att se till att vi inte titta på platser som inte är giltiga.
>> Nu ska vi göra samma sak för alla andra möjliga kombinationer.
Så här, vi tittar under den tomma för att se om det är kakel.
Och vi måste också se till att vi är inte på den nedersta raden, eller annat vi
bör inte leta efter kakel.
Här kommer vi att se till vänster om ämnet för att se om det är kakel.
Och vi ska inte se till vänster Om vi ​​är i kolumnen längst till vänster.
Och här ska vi se till höger på tomt, och vi bör inte
se till höger om vi i kolumnen längst till höger.
>> Så, om inget av dessa saker var sant, det betyder brickan var inte angränsande
till den tomma och kan vi returnera false.
Flytten var inte giltigt.
Men, om en av de var sant, sedan vid denna punkt, vi vet att tile_i och
tile_j är lika med den positionen av plattan.
Och så kan vi uppdatera styrelsen på positioner tile_i och tile_j.
Vi vet att det nya värdet blir den tomma och att positionen blank_i
blank_j, vilket var den ursprungliga tom - vi vet att kakel kommer att
flytta dit.
>> Lägg märke till att vi egentligen inte behöver göra en riktig swap här, eftersom vi vet att
värden som måste införas i dessa positioner.
Vi behöver inte en tillfällig variabel runt.
>> Slutligen måste vi komma ihåg att vi har våra globala variabler som är
hålla reda på positionen av ämnet.
Så vi vill att uppdatera läget för ämnet för att vara där kakel
ursprungligen var.
Slutligen återvänder vi sant eftersom flytten var framgångsrik.
Vi lyckas byta tomt med kakel.
>> Okej, så vi äntligen måste kontrollera vann.
Så vann på samma sätt returnerar en bool där sann kommer att indikera att
användaren har vunnit spelet.
Och falskt indikerar att spelet fortfarande pågår.
Användaren har inte vunnit.
Så, detta kommer att bli ganska mycket motsatsen till init, där init,
kom ihåg, vi initiera styrelsen till 15, 14, 13, 12, osv.
Av följande skäl vunnit, vi vill kontrollera om ombord är en, två, tre, fyra, fem, och så vidare.
>> Så kommer vi att initiera vår motverka till 1, eftersom det är vad toppen
vänster i styrelsen ska vara.
Och då ska vi slinga över hela forumet.
Låt oss bortse från detta villkor för en sekund.
Och detta tillstånd bara kommer att kontrollen är styrelsen i detta läge
lika med de nuvarande räkningar?
Om så är fallet, inkrementera räkningen så att nästa position vi tittar på är en högre
än det läge vi befinner oss i just nu.
>> Så det är hur vi får överst till vänster bör vara ett.
Inkrementera räknevärdet till 2.
Titta på nästa position.
Är det 2?
Om så är fallet, inkrementera räknevärdet till 3.
Nästa läge är det 3?
Om så är fallet, öka räkningen till 4, och så vidare.
Så, om det finns någon plats på bräda som inte är lika vår räkning,
då vill vi att returnera false, eftersom det innebär att det finns någon bricka som är
inte är i rätt position.
>> Så här, vad är detta tillstånd gör?
Tja, kom ihåg att det tomma är tänkt att gå längst ner till höger.
Och det tomma värde kanske inte nödvändigtvis vara lika med värdet av den
motverka som kommer att nås längst ner till höger.
Så vi specifikt vill kontrollera om jag lika lika d minus 1 och j jämlikar
är lika med d minus 1 - som säger att vi tittar längst ner till höger i
styrelsen - då vi bara vill fortsätta.
Vi vill hoppa över denna iteration av for-slingan.
>> Och så, om vi lyckas få igenom detta kapslade för slinga, gör att det
det fanns ingen bricka som var i fel läge.
Och vi bryta sig ur loopen och komma Här, där vi kan återvända sant.
Alla brickor var i rätt läge och detta innebär att användaren har
vann matchen.
Och det är det.
Mitt namn är Rob Bowden, och det var 15.