>> ROB BOWDEN: Hei.
Jeg er Rob, og jeg håper din spill for spillet 15 år.
Nå er det fire funksjonene du trenger å gjennomføre i dette programmet - init,
tegne, flytte, og vant.
Så, la oss se på init.
>> Her ser vi den første tingen vi er kommer til å gjøre er å deklarere en variabel
kalt teller.
Det kommer til å bli initialisert å d ganger d minus en.
Husk at d er dimensjonen av vårt styre.
Hvordan init kommer til å fungere er det som skjer å iterere over hele forumet
og vi kommer til å starte øverst til venstre.
>> Og la oss bare si at vi har en 4 av 4 bord.
Så øverst til venstre vi er kommer til å si er 15 år.
Og da vi bare kommer til å telle gjennom styrene, sier 15, 14, 13,
12, 11, 10, 9, 8, 7, 6, 5, 4, og så videre.
Så øverst til venstre, regner vi med å være d ganger d minus en, som i 4 x 4
saken kommer til å være 16 minus 1, som er fullstendig 15.
>> Og nå her er der vi kommer til å iterere over hele forumet.
Og vi kommer til å sette hver posisjon i styret til den nåværende verdien av
vår teller, og da teller går å minske, slik at neste
posisjonen vi nå kommer til å ha telleren være én mindre enn
forrige posisjon.
Så vi i utgangspunktet hadde 15 og decrement teller.
Så da skal vi tildele 14 til neste posisjon, minsk teller,
og vi kommer til å tildelt 13, og så videre.
>> Til slutt må vi håndtere det hjørnet tilfelle hvor, dersom styret har en enda
dimensjon, og deretter bare å gjøre 15, 14, 13, 12, helt ned til 3, 2, 1, ligger
kommer til å forlate oss med et uløselig bord.
Og vi må bytte en og to.
Så, hvis d mod 2 er lik 0, er at hvordan vi kommer til å sjekke
for å se om det er enda.
Hvis d mod 2 er lik 0, så i rad d minus 1, som er den nederste rekke, og
stilling d minus 2 eller kolonne d minus 2, kommer vi til å sette det til to, og
kolonne d minus 3 vi er kommer til å sette til en.
Så det er bare å rygge der 1 og 2 er nå.
>> Til slutt kommer vi til å sette veldig nederst til høyre lik blank, der
blank har blitt hash definert på toppen som 0.
Så, det var strengt tatt ikke nødvendig, siden dette for loop kommer til å ha
angitt nederst til høyre på 0, fordi telleren vil selvsagt komme 0.
Men det er avhengig av at vi vet at blank ble hashet å finne en 0.
Hvis jeg går inn i dette programmet, og senere endre blank øverst til 100, det
skal fortsatt fungere.
>> Så dette er bare å sørge for at nederst til høyre er faktisk lik vår
tom verdi.
Endelig har vi to globale variabler, så blank jeg og blank j, og vi ser
de erklært på toppen.
Og vi kommer til å bruke de to globale variabler å holde styr på
stilling av emnet, slik at vi ikke trenger å se gjennom hele
bord for å finne den tomme hver eneste gang vi prøver å gjøre et trekk.
Så plasseringen av tomt alltid er kommer til å starte nederst til høyre.
Så nederst til høyre er gitt ved indekser d minus 1, d minus en.
Så, det er init.
>> Nå flytter vi på å tegne.
Så, er uavgjort skal være lik hvor vi kommer til å reagere
over hele forumet.
Og vi bare ønsker å skrive ut verdien det er i hver posisjon i styret.
Så her er vi skriver ut verdien som er i hver stilling av brettet.
Og legg merke til at vi gjør -.
Og det er bare å fortelle printf som uavhengig av om det er en ett siffer eller
tosifret tall, vi fortsatt vil ha det til ta opp to kolonner i utskriften,
slik at hvis vi har to tall og én sifrede tall på samme bord, vår
Styret vil fortsatt se fin og firkantet.
>> Så vi ønsker å gjøre det for hver verdi i brettet, med unntak av det tomme.
Så, hvis posisjon i styret er lik den blanke, så vi spesifikt
ønsker å skrive ut bare en understreking for å representere den tomme, i stedet for
uansett verdien av blank faktisk er.
>> Til slutt, vi ønsker å skrive ut ut en ny linje.
Legg merke til at dette er fortsatt inne den ytre for-løkken, men utenfor
den indre for-løkken.
Siden dette ytre Løkken for itera fremfor alle rader, og så dette printf er
kommer til å bare skrive ut en ny linje, så vi gå videre for å skrive ut neste rad.
Og det er det for uavgjort.
>> Så nå la oss gå videre til å flytte.
Nå passerer vi flytte, flis at brukeren er lagt inn i spillet - de
inn flisen de ønsker å flytte - og du skal returnere en bool, så
enten sant eller usant, avhengig av om at farten var faktisk
gyldig - om at flis kan være flyttet inn i det tomme rommet.
>> Så her, erklærer vi en lokal variabel, tile_1 og tile_j, som kommer til å
være lik blank_i og blank_j, bortsett fra at det kommer til å holde orden på
stilling av flisen.
Nå her, kommer vi til å bruke blank_i og blank_j og si alt rett, så
her er det tomt på brettet.
>> Nå er det flis over det tomme?
Er flisen til venstre for den tomme?
Er flisen til høyre for den tomme?
Er flis under den tomme?
Derfor, dersom flisen er i en hvilken som helst av disse posisjoner, så vet vi at flisen
kan flyttes inn i det tomme stedet og blind kan flyttes til der
flis er for tiden.
>> Så her sier vi om bord i posisjon blank_i minus en blank_j.
Så dette er å si er det flis over dagens tomt?
Og hvis så, kommer vi til å huske det vil si plasseringen av flisen.
Flisen er i posisjon blank_i minus 1 og blank_j.
Nå først har vi også denne sjekken akkurat her, er så blank_i
større enn 0.
>> Hvorfor ønsker vi å gjøre det?
Vel, hvis det tomme er i den øverste raden av styret, da vi ikke ønsker å
se over det tomme for flisen siden det ikke er noe ovenfor den øverste
raden av brettet.
Dette er hvordan du kan ende opp med å få noe som en segmentering feil eller
programmet kan bare fungere på uventede måter.
Så, er dette noe som gjør at vi ikke se på steder som ikke er gyldige.
>> Nå skal vi gjøre det samme for alle andre mulige kombinasjoner.
Så her ser vi under den tomme for å se om det er flis.
Og vi må også sørge for at vi er ikke på nederste rad, eller annet vi
bør ikke se etter flis.
Her skal vi se til venstre for det tomt for å se om det er flis.
Og vi bør ikke se til venstre hvis vi er i kolonnen lengst til venstre.
Og her kommer vi til å se til høyre på blank, og vi bør ikke
se til høyre hvis vi er i kolonnen lengst til høyre.
>> Så, hvis ingen av disse tingene var sant, det betyr at flisen var ikke tilstøtende
til den tomme og vi kan returnere false.
Flyttingen var ikke gyldig.
Men, hvis en av dem var sanne, og deretter på dette punktet, vet vi at tile_i og
tile_j er lik stilling av flisen.
Og så kan vi oppdatere styret ved posisjoner tile_i og tile_j.
Vi vet at den nye verdien blir den tomme og at stillingen blank_i
blank_j, som var den opprinnelige blank - vi vet flisen kommer til å
flytte dit.
>> Merker vi trenger faktisk ikke å gjøre en real swap her, siden vi vet at
verdier som må innsettes inn i disse stillingene.
Vi trenger ikke en midlertidig variabel rundt.
>> Til slutt må vi huske at vi har våre globale variabler som er
holde styr på stillingen av emnet.
Så vi ønsker å oppdatere posisjonen det tomt for å være der flisen
opprinnelig var.
Til slutt, vi kommer tilbake sant siden flyttingen var vellykket.
Vi vellykket bytte blank med flis.
>> Greit, så siste vi må sjekke won.
Så vant tilsvar returnerer en bool der sant skal indikere at
Brukeren har vunnet spillet.
Og falsk indikerer at spillet pågår fortsatt.
Brukeren har ikke vunnet.
Så, dette kommer til å være ganske mye det motsatte av init, der init,
husk, vi initial styret til 15, 14, 13, 12, så videre.
Mens vunnet, ønsker vi å sjekke om bord er 1, 2, 3, 4, 5, og så videre.
>> Så vi kommer til å initialisere vår motvirke til en siden det er det toppen
venstre av styret bør være.
Og så skal vi sløyfe over hele forumet.
La oss se bort fra denne tilstanden for en andre.
Og denne tilstanden er bare kommer til å Sjekken er styret på denne stillingen
lik dagens teller?
I så fall inkrementere tellingen slik at neste posisjon vi ser på er en høyere
enn den posisjonen vi er i akkurat nå.
>> Så det er slik vi får øverst til venstre skal være en.
Trinnvis telle til to.
Se på den neste plassen.
Er dette 2?
I så fall inkrementere tellingen til 3.
Neste posisjon, er dette tre?
I så fall inkrementere tellingen til 4, og så videre.
Så hvis det er noen posisjon på bord som ikke er lik vår telling,
så vi ønsker å returnere falsk siden den betyr at det er noen flis som er
ikke er i korrekt stilling.
>> Så her, hva er denne tilstanden gjør?
Vel, husk at den blanke er skulle gå på nederst til høyre.
Og blank verdi kanskje ikke nødvendigvis er lik verdien av
motvirke at kommer til å bli nådd nederst til høyre.
Så vi ønsker spesielt å sjekke om jeg lik lik d minus 1 og j likemenn
lik d minus en - som er å si om vi ser nederst til høyre i
styret - da vi bare ønsker å fortsette.
Vi ønsker å hoppe over denne spesielle iterasjon av for løkke.
>> Og så, hvis vi klarer å komme oss gjennom dette nestet for loop, det betyr at
Det var ingen flis som var i feil posisjon.
Og vi bryte ut av sløyfen og kommer her, hvor vi kan returnere true.
Alle flisene var i de riktige posisjonene og det betyr at brukeren har
vunnet spillet.
Og det er det.
Mitt navn er Rob Bowden, og dette var 15.