1 00:00:00,000 --> 00:00:13,070 2 00:00:13,070 --> 00:00:13,715 >> ROB BOWDEN Cześć. 3 00:00:13,715 --> 00:00:17,800 Jestem Rob, i mam nadzieję, że twój gry do gry 15. 4 00:00:17,800 --> 00:00:22,040 Teraz są cztery funkcje, które trzeba do wdrożenia w tym programie - init 5 00:00:22,040 --> 00:00:24,650 rysować, przesuwać i wygrał. 6 00:00:24,650 --> 00:00:27,230 Więc spójrzmy na init. 7 00:00:27,230 --> 00:00:32,930 >> Tutaj widzimy pierwszą rzeczą jesteśmy zamiar zrobić, to zadeklarować zmienną 8 00:00:32,930 --> 00:00:34,600 zwany licznik. 9 00:00:34,600 --> 00:00:37,620 To będzie być inicjowane do d razy d minus 1. 10 00:00:37,620 --> 00:00:40,200 Pamiętaj, że d jest wymiarem naszej rady. 11 00:00:40,200 --> 00:00:43,840 Jak startowych będzie działać to się dzieje iteracyjne nad całym forum 12 00:00:43,840 --> 00:00:46,050 i mamy zamiar rozpocząć w lewym górnym rogu. 13 00:00:46,050 --> 00:00:48,570 >> I powiedzmy, że posiada 4 przez 4 płytę. 14 00:00:48,570 --> 00:00:51,220 Więc lewy górny jesteśmy powiedzieć 15. 15 00:00:51,220 --> 00:00:53,960 A potem po prostu się liczyć przez rad, mówiąc: 15, 14, 13, 16 00:00:53,960 --> 00:00:58,510 12, 11, 10, 9, 8, 7, 6, 5, 4, i tak dalej. 17 00:00:58,510 --> 00:01:03,780 Tak, na górze po lewej, możemy spodziewać się d razy d minus 1, która w pozycji 4 przez 4 18 00:01:03,780 --> 00:01:08,290 Sprawa będzie 16 minus 1, który jest prawidłowo 15. 19 00:01:08,290 --> 00:01:10,885 >> A teraz tutaj, gdzie my jedziemy iteracyjne nad całym forum. 20 00:01:10,885 --> 00:01:14,720 I mamy zamiar ustawić w każdej pozycji deska do aktualnej wartości 21 00:01:14,720 --> 00:01:19,090 nasz licznik, a następnie licznik będzie aby zmniejszyć tak, że następna 22 00:01:19,090 --> 00:01:22,300 Stanowisko docieramy będzie miał Licznik jest o jeden mniejsza 23 00:01:22,300 --> 00:01:23,690 poprzednie stanowisko. 24 00:01:23,690 --> 00:01:26,970 Więc początkowo miał 15 i zmniejsz licznik. 25 00:01:26,970 --> 00:01:30,065 Tak więc mamy zamiar przypisać 14 do następna pozycja, licznik ubytek, 26 00:01:30,065 --> 00:01:33,710 i będziemy przypisany 13, i tak dalej. 27 00:01:33,710 --> 00:01:37,620 >> Wreszcie, musimy obsłużyć tę ziemię przypadek, w którym, jeśli płyta ma nawet 28 00:01:37,620 --> 00:01:44,450 wymiar, to po prostu robi 15, 14, 13, 12, w dół do 3, 2, 1, jest 29 00:01:44,450 --> 00:01:46,780 zamiar zostawić nas nierozwiązywalny zarządu. 30 00:01:46,780 --> 00:01:49,390 I musimy zamienić 1 i 2. 31 00:01:49,390 --> 00:01:52,930 Tak więc, jeśli d mod 2 jest równa 0, to jak mamy zamiar sprawdzić 32 00:01:52,930 --> 00:01:54,410 aby sprawdzić, czy jest jeszcze. 33 00:01:54,410 --> 00:01:59,810 Jeśli d mod 2 jest równa 0, a następnie w wierszu d minus 1, który jest dolny rząd, i 34 00:01:59,810 --> 00:02:05,430 Stanowisko d minus 2, czy minus kolumna d 2, mamy zamiar ustawić, że do 2, a 35 00:02:05,430 --> 00:02:07,860 Kolumna D minus 3 jesteśmy będzie ustawiony na 1. 36 00:02:07,860 --> 00:02:12,170 Tak, że po prostu odwrócenie gdzie 1 i 2, obecnie są. 37 00:02:12,170 --> 00:02:16,270 >> Wreszcie, mamy zamiar ustawić bardzo na dole po prawej równa puste, gdzie 38 00:02:16,270 --> 00:02:20,700 hash puste został zdefiniowany na szczycie wynosi 0. 39 00:02:20,700 --> 00:02:26,785 Tak, że nie było absolutnie konieczne, ponieważ na pętli będzie miał 40 00:02:26,785 --> 00:02:30,610 ustawić dolny prawy na 0, ponieważ Licznik będzie naturalnie osiągnąć 0. 41 00:02:30,610 --> 00:02:34,610 Ale to zależy od nas, wiedząc, że blank był mieszany znaleźć 0. 42 00:02:34,610 --> 00:02:38,280 Jeśli pójdę do tego programu, a później zmienić puste na górze do 100, to 43 00:02:38,280 --> 00:02:39,770 powinny nadal pracować. 44 00:02:39,770 --> 00:02:43,180 >> Więc to jest po prostu upewnić się, że na dole po prawej jest faktycznie równa nasze 45 00:02:43,180 --> 00:02:44,870 wartości puste. 46 00:02:44,870 --> 00:02:50,270 Wreszcie, mamy dwie zmienne globalne, i tak puste i puste j, i widzimy, 47 00:02:50,270 --> 00:02:53,360 zadeklarowanym na szczycie. 48 00:02:53,360 --> 00:02:56,270 I będziemy używać tych dwóch globalnych zmienne, aby śledzić 49 00:02:56,270 --> 00:02:59,040 Stanowisko puste, tak, że nie mamy trzeba szukać w całym 50 00:02:59,040 --> 00:03:03,890 zarządu, aby znaleźć puste każdego czas staramy się wykonać ruch. 51 00:03:03,890 --> 00:03:08,450 Tak więc położenie półfabrykatu jest zawsze zamierza rozpocząć w prawym dolnym rogu. 52 00:03:08,450 --> 00:03:13,270 Tak, na dole po prawej jest przez Indeksy d minus 1, d minus 1. 53 00:03:13,270 --> 00:03:14,880 Tak, to jest startowych. 54 00:03:14,880 --> 00:03:17,040 >> Teraz przechodzimy do rysowania. 55 00:03:17,040 --> 00:03:19,370 Tak, losowanie będzie podobny gdzie jedziemy do iteracji 56 00:03:19,370 --> 00:03:20,970 nad całym forum. 57 00:03:20,970 --> 00:03:25,400 A my po prostu chcemy wydrukować wartości to w każdej pozycji płyty. 58 00:03:25,400 --> 00:03:29,580 Więc tutaj mamy drukowania wartość, która jest w każdej pozycji płyty. 59 00:03:29,580 --> 00:03:32,280 I zauważyć, że robimy -. 60 00:03:32,280 --> 00:03:37,410 A to tylko mówi, że printf niezależnie od tego, czy jest to jedna cyfra lub 61 00:03:37,410 --> 00:03:42,010 dwucyfrowy numer, wciąż ma się zajmują dwie kolumny w wydruku, 62 00:03:42,010 --> 00:03:46,290 tak, że jeśli mamy dwie cyfry oraz jedna cyfrowe numery z tej samej płyty, nasze 63 00:03:46,290 --> 00:03:49,450 Rada będzie nadal wyglądać dobrze i kwadratowe. 64 00:03:49,450 --> 00:03:54,190 >> Dlatego chcemy, aby to zrobić dla każdej wartości w płycie, z wyjątkiem półfabrykatu. 65 00:03:54,190 --> 00:03:58,260 Tak więc, jeśli pozycja w tablicy jest równa puste, to specjalnie 66 00:03:58,260 --> 00:04:01,730 Aby wydrukować tylko podkreślenia do reprezentowania puste, zamiast 67 00:04:01,730 --> 00:04:05,150 bez względu na wartość puste w rzeczywistości. 68 00:04:05,150 --> 00:04:08,500 >> Wreszcie, chcemy wydrukować z nowej linii. 69 00:04:08,500 --> 00:04:11,970 Zauważ, że jest to jeszcze w środku zewnętrznej pętli, ale poza 70 00:04:11,970 --> 00:04:13,200 wewnętrzna pętla for. 71 00:04:13,200 --> 00:04:17,930 Ponieważ ta zewnętrzna jest iteracji pętli na wszystkich wierszy, a więc jest to printf 72 00:04:17,930 --> 00:04:22,130 będzie po prostu wydrukować nową linię, tak więc przejść wydrukować następny wiersz. 73 00:04:22,130 --> 00:04:23,910 I to jest to na remis. 74 00:04:23,910 --> 00:04:27,770 >> Tak, teraz przejdźmy do poruszania się. 75 00:04:27,770 --> 00:04:32,590 Teraz mijamy ruch, że płytki Użytkownik jest wpisany do gry - są 76 00:04:32,590 --> 00:04:36,360 Wprowadź płytki chcą przenieść - i jesteś ma powrócić bool, więc 77 00:04:36,360 --> 00:04:39,300 true lub false, w zależności od czy ten ruch był rzeczywiście 78 00:04:39,300 --> 00:04:43,360 ważne - czy to może być płytka przeniósł się do pustego miejsca. 79 00:04:43,360 --> 00:04:48,340 >> Więc tutaj deklarujemy zmiennej lokalnej, tile_1 i tile_j, które będą 80 00:04:48,340 --> 00:04:52,150 być podobne do blank_i i blank_j, oprócz tego, że będzie śledzić 81 00:04:52,150 --> 00:04:54,910 Położenie płytki. 82 00:04:54,910 --> 00:05:00,370 Teraz tutaj, będziemy używać blank_i i blank_j i powiedzieć wszystko w porządku, więc 83 00:05:00,370 --> 00:05:01,930 tu jest puste na pokładzie. 84 00:05:01,930 --> 00:05:04,420 >> Teraz jest dachówka powyżej puste? 85 00:05:04,420 --> 00:05:06,210 Płytka jest na lewej stronie wykroju? 86 00:05:06,210 --> 00:05:07,420 Płytka jest na prawo wykroju? 87 00:05:07,420 --> 00:05:08,970 Czy płytki poniżej puste? 88 00:05:08,970 --> 00:05:13,330 Tak więc, jeśli płytka jest w każdym z tych pozycji, to wiemy, że płytki 89 00:05:13,330 --> 00:05:16,390 może być przeniesiony do pustego miejsca i puste mogą być przenoszone do miejsca, gdzie 90 00:05:16,390 --> 00:05:18,240 Dachówka jest obecnie. 91 00:05:18,240 --> 00:05:26,400 >> Więc tutaj mówimy, jeśli wyżywienie w pozycji blank_i minus 1 blank_j. 92 00:05:26,400 --> 00:05:31,120 Więc to mówi jest płytka powyżej obecnego puste? 93 00:05:31,120 --> 00:05:34,350 A jeśli tak, będziemy pamiętać to położenie płytki. 94 00:05:34,350 --> 00:05:37,870 Płytka jest w pozycji blank_i minus 1 i blank_j. 95 00:05:37,870 --> 00:05:40,660 teraz pierwsze, mamy również ten test tutaj, jest tak blank_i 96 00:05:40,660 --> 00:05:41,760 większy niż 0. 97 00:05:41,760 --> 00:05:43,410 >> Dlaczego chcesz to zrobić? 98 00:05:43,410 --> 00:05:47,290 Skoro pustego w górnym rzędzie rady, to nie chcemy, aby 99 00:05:47,290 --> 00:05:51,240 wyżej puste spojrzenie na płytki od nic powyżej górnej 100 00:05:51,240 --> 00:05:52,430 wiersz rady. 101 00:05:52,430 --> 00:05:55,950 Jest to, jak może skończyć się coraz coś jak segmentacji lub usterki 102 00:05:55,950 --> 00:05:59,030 Twój program może po prostu działa w nieoczekiwany sposób. 103 00:05:59,030 --> 00:06:04,310 Tak, to jest upewnienie się, że nie szukać w miejscach, które nie są ważne. 104 00:06:04,310 --> 00:06:08,470 >> Teraz mamy zamiar zrobić to samo dla wszystkie inne możliwe kombinacje. 105 00:06:08,470 --> 00:06:13,250 Więc szukamy poniżej puste aby sprawdzić, czy to jest płytka. 106 00:06:13,250 --> 00:06:16,950 I my również upewnić się, że jesteśmy nie ma na dolnym rzędzie, albo też, że 107 00:06:16,950 --> 00:06:18,910 Nie należy patrzeć na płytki. 108 00:06:18,910 --> 00:06:25,040 Tutaj mamy zamiar spojrzeć na lewo od puste, aby sprawdzić, czy jest płytki. 109 00:06:25,040 --> 00:06:27,860 I nie powinniśmy patrzeć na lewo jeśli jesteśmy w skrajnej lewej kolumnie. 110 00:06:27,860 --> 00:06:30,100 I tutaj będziemy patrzeć prawo puste, i nie powinniśmy 111 00:06:30,100 --> 00:06:33,340 spójrz w prawo, jeśli jesteśmy w prawej kolumnie. 112 00:06:33,340 --> 00:06:37,820 >> Tak więc, jeśli żadna z tych rzeczy są prawdziwe, co oznacza, że ​​nie był w sąsiedztwie płytki 113 00:06:37,820 --> 00:06:39,640 na puste i możemy powrócić fałszywe. 114 00:06:39,640 --> 00:06:41,230 Akcja nie była ważna. 115 00:06:41,230 --> 00:06:47,010 Ale, jeśli jeden z nich to prawda, to co ten punkt, wiemy, że tile_i i 116 00:06:47,010 --> 00:06:50,540 tile_j są równe Położenie płytki. 117 00:06:50,540 --> 00:06:55,210 I tak, możemy aktualizować na pokładzie Pozycje tile_i i tile_j. 118 00:06:55,210 --> 00:06:59,820 Wiemy, nowa wartość będzie puste i że blank_i pozycji 119 00:06:59,820 --> 00:07:02,950 blank_j, który był przy puste - wiemy, dachówka będzie 120 00:07:02,950 --> 00:07:04,030 przenieść tam. 121 00:07:04,030 --> 00:07:07,610 >> Zauważ, że w rzeczywistości nie ma to zrobić prawdziwe Swap tutaj, ponieważ wiemy, 122 00:07:07,610 --> 00:07:09,850 wartości, które muszą być wstawiane w tych pozycjach. 123 00:07:09,850 --> 00:07:13,780 Nie potrzebujemy tymczasowe Zmienna wokół. 124 00:07:13,780 --> 00:07:16,920 >> Wreszcie, musimy pamiętać, że mamy nasze zmienne globalne, które są 125 00:07:16,920 --> 00:07:18,980 śledzenie pozycji z pustą. 126 00:07:18,980 --> 00:07:22,780 Dlatego chcemy, aby zaktualizować pozycję puste, aby być tam, gdzie płytki 127 00:07:22,780 --> 00:07:24,190 pierwotnie był. 128 00:07:24,190 --> 00:07:27,680 Wreszcie wracamy prawda od Akcja zakończyła się powodzeniem. 129 00:07:27,680 --> 00:07:31,110 Udało nam się zamienić puste płyty. 130 00:07:31,110 --> 00:07:34,890 >> W porządku, więc ostatni raz trzeba sprawdzić wygrane. 131 00:07:34,890 --> 00:07:39,900 Tak, wygrałem podobnie zwraca bool, gdzie prawda będzie wskazywać, że 132 00:07:39,900 --> 00:07:41,460 Filmaster wygrał. 133 00:07:41,460 --> 00:07:43,780 I wskazuje, że jest fałszywe Gra jest nadal w toku. 134 00:07:43,780 --> 00:07:46,340 Użytkownik nie zdobył. 135 00:07:46,340 --> 00:07:52,100 Tak, to będzie dość dużo Przeciwieństwem init gdzie startowych, 136 00:07:52,100 --> 00:07:56,920 Pamiętam, że zainicjować płytę do 15, 14, 13, 12, tak dalej. 137 00:07:56,920 --> 00:08:03,000 Natomiast wygrał, chcemy sprawdzić, czy Płyta ma wartość 1, 2, 3, 4, 5, i tak dalej. 138 00:08:03,000 --> 00:08:06,600 >> Tak, mamy zamiar zainicjować nasze licznik na 1 ponieważ to, co góry 139 00:08:06,600 --> 00:08:08,400 lewa zarządu powinno być. 140 00:08:08,400 --> 00:08:10,860 A następnie jedziemy do pętli nad całym forum. 141 00:08:10,860 --> 00:08:13,690 Miejmy zignorować ten warunek na sekundę. 142 00:08:13,690 --> 00:08:18,410 I ten warunek jest po prostu będzie Sprawdzanie jest w tej pozycji zarządu 143 00:08:18,410 --> 00:08:20,790 równą bieżącej liczby? 144 00:08:20,790 --> 00:08:27,040 Jeżeli tak, to zwiększyć liczbę, tak aby następna pozycja przyjrzymy jest wyższa 145 00:08:27,040 --> 00:08:29,690 niż położenie jesteśmy w tej chwili. 146 00:08:29,690 --> 00:08:32,700 >> Tak to jest jak mamy u góry z lewej powinien być 1. 147 00:08:32,700 --> 00:08:33,950 Zwiększyć liczbę do 2. 148 00:08:33,950 --> 00:08:35,010 Spójrz na następną pozycję. 149 00:08:35,010 --> 00:08:35,690 Jest to 2? 150 00:08:35,690 --> 00:08:37,659 Jeśli tak, zwiększamy liczbę do 3. 151 00:08:37,659 --> 00:08:39,179 Następna pozycja, to jest 3? 152 00:08:39,179 --> 00:08:42,440 Jeśli tak, to zwiększyć liczbę 4, i tak dalej. 153 00:08:42,440 --> 00:08:49,190 Tak więc, jeśli istnieje jakakolwiek pozycja na Płyta, która nie równa nasz licznik, 154 00:08:49,190 --> 00:08:52,640 następnie chcemy return false ponieważ oznacza, że ​​nie jest pewne, że jest płytka 155 00:08:52,640 --> 00:08:55,490 nie jest w prawidłowym położeniu. 156 00:08:55,490 --> 00:08:58,810 >> Więc, co robi ten warunek? 157 00:08:58,810 --> 00:09:02,170 Cóż, pamiętaj, że jest pusty jechać w prawym dolnym rogu. 158 00:09:02,170 --> 00:09:06,180 I wartość ślepej nie może zawsze równa wartości 159 00:09:06,180 --> 00:09:11,080 licznik, który ma być osiągnięty w prawym dolnym rogu. 160 00:09:11,080 --> 00:09:15,760 Więc specjalnie chcą sprawdzić, czy i równa jest równa d minus 1 i J równych 161 00:09:15,760 --> 00:09:19,470 równa d minus 1 - który mówi, jeśli Poszukujemy w prawym dolnym rogu 162 00:09:19,470 --> 00:09:22,050 wyżywienie - to po prostu Aby kontynuować. 163 00:09:22,050 --> 00:09:26,200 Chcemy, aby pominąć ten konkretny iteracji pętli for. 164 00:09:26,200 --> 00:09:31,250 >> I tak, jeśli uda nam się przez to zagnieżdżonych pętli, co oznacza, że 165 00:09:31,250 --> 00:09:34,690 nie było płytki, że był w nieprawidłowe położenie. 166 00:09:34,690 --> 00:09:38,900 I wyjdziemy z pętli i przyjść tutaj, gdzie możemy wrócić prawda. 167 00:09:38,900 --> 00:09:41,800 Wszystkie płytki są w odpowiednich pozycjach i oznacza, że ​​użytkownik ma 168 00:09:41,800 --> 00:09:43,230 wygrał. 169 00:09:43,230 --> 00:09:44,460 I to jest to. 170 00:09:44,460 --> 00:09:46,550 Nazywam się Rob Bowden, i to było 15. 171 00:09:46,550 --> 00:09:52,726