1 00:00:00,000 --> 00:00:13,070 2 00:00:13,070 --> 00:00:13,715 >> ROB BOWDEN: Привет. 3 00:00:13,715 --> 00:00:17,800 Я Роб, і я сподіваюся, що ваші ігри для гри 15. 4 00:00:17,800 --> 00:00:22,040 Зараз є чотири функції, які ви повинні для реалізації в цій програмі - ініціалізації, 5 00:00:22,040 --> 00:00:24,650 малювати, переміщати, і виграв. 6 00:00:24,650 --> 00:00:27,230 Отже, давайте подивимося на ініціалізації. 7 00:00:27,230 --> 00:00:32,930 >> Тут ми бачимо, перше, що ми знаходимося збираюся зробити, це оголосити змінну 8 00:00:32,930 --> 00:00:34,600 називається лічильник. 9 00:00:34,600 --> 00:00:37,620 Це збирається бути ініціалізовані в м раз г мінус 1. 10 00:00:37,620 --> 00:00:40,200 Пам'ятайте, що г-розмірність нашій дошці. 11 00:00:40,200 --> 00:00:43,840 Як ініціалізації працюватиме це відбувається для перебору всієї конференції 12 00:00:43,840 --> 00:00:46,050 і ми збираємося почати в лівому верхньому кутку. 13 00:00:46,050 --> 00:00:48,570 >> І давайте просто сказати, що ми є 4 по 4 дошки. 14 00:00:48,570 --> 00:00:51,220 Таким чином, верхній лівий ми збираюся сказати, 15. 15 00:00:51,220 --> 00:00:53,960 А потім ми просто будемо вважати через дошки, кажучи 15, 14, 13, 16 00:00:53,960 --> 00:00:58,510 12, 11, 10, 9, 8, 7, 6, 5, 4, і так далі. 17 00:00:58,510 --> 00:01:03,780 Таким чином, верхній лівий, ми очікуємо, що г раз г мінус 1, який в 4 на 4 18 00:01:03,780 --> 00:01:08,290 справа буде 16 мінус 1, що правильно 15. 19 00:01:08,290 --> 00:01:10,885 >> А тепер ось де ми збираємося перебору всієї конференції. 20 00:01:10,885 --> 00:01:14,720 І ми збираємося встановити кожну позицію в дошка для поточного значення 21 00:01:14,720 --> 00:01:19,090 наш лічильник, а потім проти збирається для зменшення, так що наступний 22 00:01:19,090 --> 00:01:22,300 положення ми досягаємо матиме лічильник на один менше, ніж 23 00:01:22,300 --> 00:01:23,690 попереднє положення. 24 00:01:23,690 --> 00:01:26,970 Таким чином, ми спочатку були 15 і зменшити лічильник. 25 00:01:26,970 --> 00:01:30,065 Отже, що ми збираємося призначити 14 до Наступне місце, декремент лічильника, 26 00:01:30,065 --> 00:01:33,710 і ми збираємося призначений 13, і так далі. 27 00:01:33,710 --> 00:01:37,620 >> Нарешті, ми повинні впоратися з цим кут випадок, коли, якщо на платі є ще 28 00:01:37,620 --> 00:01:44,450 вимір, то просто роблю 15, 14, 13, 12, все, аж до 3, 2, 1, є 29 00:01:44,450 --> 00:01:46,780 збираєтеся залишити нас з нерозв'язна дошка. 30 00:01:46,780 --> 00:01:49,390 І у нас є, щоб поміняти 1 і 2. 31 00:01:49,390 --> 00:01:52,930 Так що, якщо г по модулю 2 дорівнює 0, це як ми збираємося перевірити 32 00:01:52,930 --> 00:01:54,410 щоб побачити, якщо це навіть. 33 00:01:54,410 --> 00:01:59,810 Якщо г по модулю 2 дорівнює 0, то в рядку г мінус 1, що нижній ряд, і 34 00:01:59,810 --> 00:02:05,430 позиція пана мінус 2, або стовпець г мінус 2, ми збираємося встановити, що в 2, і 35 00:02:05,430 --> 00:02:07,860 Колонка D мінус 3 ми збирається встановити в 1. 36 00:02:07,860 --> 00:02:12,170 Так що просто заднім ходом, де 1 і 2 в даний час. 37 00:02:12,170 --> 00:02:16,270 >> Нарешті, ми збираємося встановити дуже внизу праворуч дорівнює порожній, де 38 00:02:16,270 --> 00:02:20,700 порожній був хеш визначені вгорі як 0. 39 00:02:20,700 --> 00:02:26,785 Так, що не є абсолютно необхідним, так як це цикл матиме 40 00:02:26,785 --> 00:02:30,610 встановити нижню право на 0, так як Лічильник, природно, досягти 0. 41 00:02:30,610 --> 00:02:34,610 Але це залежить від нас, знаючи, що порожній був хешірованного знайти 0. 42 00:02:34,610 --> 00:02:38,280 Якщо я йду в цю програму, а потім змінити порожній рядок у верхній до 100, це 43 00:02:38,280 --> 00:02:39,770 ще повинен працювати. 44 00:02:39,770 --> 00:02:43,180 >> Так що це тільки переконавшись, що внизу праворуч насправді дорівнює нашої 45 00:02:43,180 --> 00:02:44,870 порожнє значення. 46 00:02:44,870 --> 00:02:50,270 Нарешті, у нас є дві глобальні змінні, так порожній я і порожній J, і ми бачимо, 47 00:02:50,270 --> 00:02:53,360 тих, які оголошені на самому верху. 48 00:02:53,360 --> 00:02:56,270 І ми збираємося використовувати ці два глобальних змінні для відстеження 49 00:02:56,270 --> 00:02:59,040 Положення заготовки, так що ми не потрібно дивитися через весь 50 00:02:59,040 --> 00:03:03,890 дошка знайти заготовки кожен разу ми намагаємося зробити хід. 51 00:03:03,890 --> 00:03:08,450 Таким чином, положення заготовки завжди збирається почати в правому нижньому кутку. 52 00:03:08,450 --> 00:03:13,270 Таким чином, нижній правий дається індекси г мінус 1, д мінус 1. 53 00:03:13,270 --> 00:03:14,880 Отже, ось ініціалізації. 54 00:03:14,880 --> 00:03:17,040 >> Тепер ми перейдемо до малювати. 55 00:03:17,040 --> 00:03:19,370 Так, нічия буде схожий куди ми йдемо для ітерації 56 00:03:19,370 --> 00:03:20,970 над форумом. 57 00:03:20,970 --> 00:03:25,400 І ми просто хочемо, щоб надрукувати значення ось в кожному положенні дошки. 58 00:03:25,400 --> 00:03:29,580 Так от, ми друку значенням, в кожному положенні дошки. 59 00:03:29,580 --> 00:03:32,280 І зауважте, що ми робимо -. 60 00:03:32,280 --> 00:03:37,410 І це тільки говорить Printf, що незалежно від того, якщо це одна цифра або 61 00:03:37,410 --> 00:03:42,010 двозначне число, ми все ще хочемо, щоб він зайняти до двох стовпців в роздруківці, 62 00:03:42,010 --> 00:03:46,290 так що якщо у нас є два цифру і один значних чисел в одній платі, наш 63 00:03:46,290 --> 00:03:49,450 Рада буде як і раніше виглядати красиво і квадрат. 64 00:03:49,450 --> 00:03:54,190 >> Таким чином, ми хочемо зробити, що для кожного значення в раді, для заготівлі винятком. 65 00:03:54,190 --> 00:03:58,260 Так що, якщо положення в раді одно заготовки, то ми спеціально 66 00:03:58,260 --> 00:04:01,730 хочете роздрукувати тільки підкреслення представляти порожнім, замість того, щоб 67 00:04:01,730 --> 00:04:05,150 незалежно від значення порожній насправді. 68 00:04:05,150 --> 00:04:08,500 >> Нарешті, ми хочемо надрукувати з нової лінії. 69 00:04:08,500 --> 00:04:11,970 Зверніть увагу, що це як і раніше всередині Зовнішній цикл, але за межами 70 00:04:11,970 --> 00:04:13,200 внутрішній цикл. 71 00:04:13,200 --> 00:04:17,930 Оскільки цей зовнішній для циклу ітерації по всіх рядках, і таким чином це Е є 72 00:04:17,930 --> 00:04:22,130 збирається просто надрукувати нову лінію, тому ми перейти до роздрукувати наступний рядок. 73 00:04:22,130 --> 00:04:23,910 І це все за нічию. 74 00:04:23,910 --> 00:04:27,770 >> Отже, тепер давайте перейдемо рухатися. 75 00:04:27,770 --> 00:04:32,590 Перейдемо тепер крок, плитку, що користувач увійшов в гру - вони 76 00:04:32,590 --> 00:04:36,360 введіть плитку вони хочуть рухатися - і ти повинен повертати логічне значення, так 77 00:04:36,360 --> 00:04:39,300 істинним або хибним, залежно від чи був цей крок насправді 78 00:04:39,300 --> 00:04:43,360 дійсно - чи може, що плитка буде переїхав в порожній простір. 79 00:04:43,360 --> 00:04:48,340 >> Так от, ми оголосити локальну змінну, tile_1 і tile_j, які збираються 80 00:04:48,340 --> 00:04:52,150 бути схожий на blank_i і blank_j, за винятком того, що відбувається, щоб відстежувати 81 00:04:52,150 --> 00:04:54,910 Положення плитки. 82 00:04:54,910 --> 00:05:00,370 Тепер ось, ми збираємося використовувати blank_i і blank_j і сказати все гаразд, так 83 00:05:00,370 --> 00:05:01,930 ось порожній на дошці. 84 00:05:01,930 --> 00:05:04,420 >> Тепер, є вище заготовки плитка? 85 00:05:04,420 --> 00:05:06,210 Є плитка зліва від заготовки? 86 00:05:06,210 --> 00:05:07,420 Є плитка праворуч від заготовки? 87 00:05:07,420 --> 00:05:08,970 Чи є плитка нижче заготовки? 88 00:05:08,970 --> 00:05:13,330 Так, якщо плитка знаходиться в одному з тих, позиції, то ми знаємо, що плитка 89 00:05:13,330 --> 00:05:16,390 можуть бути переміщені в порожньому місці і порожній можуть бути переміщені в якому 90 00:05:16,390 --> 00:05:18,240 плитка в даний час. 91 00:05:18,240 --> 00:05:26,400 >> Так от, ми говоримо, якщо плата в положенні blank_i мінус 1 blank_j. 92 00:05:26,400 --> 00:05:31,120 Так що це говорить є плитка вище поточної заготовки? 93 00:05:31,120 --> 00:05:34,350 І якщо це так, ми збираємося, щоб пам'ятати що це позиція плитки. 94 00:05:34,350 --> 00:05:37,870 Плитка знаходиться в положенні blank_i мінус 1 і blank_j. 95 00:05:37,870 --> 00:05:40,660 Тепер спочатку, у нас також є цю перевірку прямо тут, так blank_i є 96 00:05:40,660 --> 00:05:41,760 більше 0. 97 00:05:41,760 --> 00:05:43,410 >> Чому ми хочемо, щоб це зробити? 98 00:05:43,410 --> 00:05:47,290 Ну, якщо заготовка знаходиться у верхньому ряду правління, то ми не хочемо, щоб 99 00:05:47,290 --> 00:05:51,240 дивіться вище заготовки для плитки з немає нічого вище верхньої 100 00:05:51,240 --> 00:05:52,430 ряд дошки. 101 00:05:52,430 --> 00:05:55,950 Це, як ви могли б у кінцевому підсумку отримати щось на зразок помилки сегментації або 102 00:05:55,950 --> 00:05:59,030 ваша програма може спрацювати найнесподіванішим чином. 103 00:05:59,030 --> 00:06:04,310 Так, цього переконавшись, що ми не робимо шукати в місцях, які не дійсні. 104 00:06:04,310 --> 00:06:08,470 >> Тепер ми збираємося зробити те ж саме для всі інші можливі комбінації. 105 00:06:08,470 --> 00:06:13,250 Так от, ми з нетерпінням нижче заготовки щоб побачити, якщо це плитка. 106 00:06:13,250 --> 00:06:16,950 І ми також повинні переконатися, що ми не в нижньому ряду, інакше ми 107 00:06:16,950 --> 00:06:18,910 не слід шукати плитки. 108 00:06:18,910 --> 00:06:25,040 Тут ми будемо дивитися зліва від заготовки, щоб переконатися, що це плитка. 109 00:06:25,040 --> 00:06:27,860 І ми не повинні дивитися наліво якщо ми в крайньому лівому стовпчику. 110 00:06:27,860 --> 00:06:30,100 І тут ми будемо дивитися, щоб Право заготовки, і ми не повинні 111 00:06:30,100 --> 00:06:33,340 подивіться направо, якщо ми в правій колонці. 112 00:06:33,340 --> 00:06:37,820 >> Так що, якщо жодна з цих речей не було правдою, це означає, що плитка не був смеж 113 00:06:37,820 --> 00:06:39,640 до заготівлі, і ми можемо повернутися помилковим. 114 00:06:39,640 --> 00:06:41,230 Цей крок не був дійсний. 115 00:06:41,230 --> 00:06:47,010 Але, якщо один з тих, було правдою, то, по крайней ця точка, ми знаємо, що tile_i і 116 00:06:47,010 --> 00:06:50,540 tile_j рівні Положення плитки. 117 00:06:50,540 --> 00:06:55,210 І так, ми можемо оновити дошку в позиції tile_i і tile_j. 118 00:06:55,210 --> 00:06:59,820 Ми знаємо, що нове значення буде порожнім і що положення blank_i 119 00:06:59,820 --> 00:07:02,950 blank_j, який був оригінальним порожній - ми знаємо, що плитка буде 120 00:07:02,950 --> 00:07:04,030 переїхати туди. 121 00:07:04,030 --> 00:07:07,610 >> Зверніть увагу, ми насправді не потрібно робити реальна заміна тут, так як ми знаємо, 122 00:07:07,610 --> 00:07:09,850 значення, які повинні бути вставлені в цих позиціях. 123 00:07:09,850 --> 00:07:13,780 Нам не потрібно тимчасове Мінлива навколо. 124 00:07:13,780 --> 00:07:16,920 >> Нарешті, ми повинні пам'ятати, що ми є наші глобальні змінні, які 125 00:07:16,920 --> 00:07:18,980 відстеження позиції заготовки. 126 00:07:18,980 --> 00:07:22,780 Тому ми хочемо, щоб оновити положення заготовки бути там, де плитка 127 00:07:22,780 --> 00:07:24,190 спочатку був. 128 00:07:24,190 --> 00:07:27,680 Нарешті, ми повертаємося вірно, так як цей крок був успішним. 129 00:07:27,680 --> 00:07:31,110 Ми успішно поміняти порожній з плиткою. 130 00:07:31,110 --> 00:07:34,890 >> Гаразд, в минулому ми потрібно перевірити вон. 131 00:07:34,890 --> 00:07:39,900 Так, виграв же повертає логічне значення, де правда збирається показують, що 132 00:07:39,900 --> 00:07:41,460 Користувач виграли гру. 133 00:07:41,460 --> 00:07:43,780 І брехня вказує, що гра продовжується до цих пір. 134 00:07:43,780 --> 00:07:46,340 Цей користувач ще не виграв. 135 00:07:46,340 --> 00:07:52,100 Таким чином, це буде в значній мірі протилежність ініціалізації, де ініціалізації, 136 00:07:52,100 --> 00:07:56,920 пам'ятайте, ми ініціалізувати дошка до 15, 14, 13, 12, так далі. 137 00:07:56,920 --> 00:08:03,000 У той час як виграв, ми хочемо перевірити, якщо Плата 1, 2, 3, 4, 5, і так далі. 138 00:08:03,000 --> 00:08:06,600 >> Так, ми збираємося, щоб ініціалізувати наш протистояти до 1 так як це те, що верхня 139 00:08:06,600 --> 00:08:08,400 Зліва від дошки має бути. 140 00:08:08,400 --> 00:08:10,860 А потім ми збираємося петлі над форумом. 141 00:08:10,860 --> 00:08:13,690 Давайте проігноруємо це умова ні на секунду. 142 00:08:13,690 --> 00:08:18,410 І це умова тільки збирається перевірка рада в цьому положенні 143 00:08:18,410 --> 00:08:20,790 рівними поточних статтях? 144 00:08:20,790 --> 00:08:27,040 Якщо це так, збільшити лічильник так, щоб Наступне місце ми дивимося на один вище 145 00:08:27,040 --> 00:08:29,690 ніж становище ми знаходимося на даний момент. 146 00:08:29,690 --> 00:08:32,700 >> Так от, як ми отримуємо угорі ліворуч повинна бути 1. 147 00:08:32,700 --> 00:08:33,950 Збільшують кількість до 2. 148 00:08:33,950 --> 00:08:35,010 Подивіться на наступну позицію. 149 00:08:35,010 --> 00:08:35,690 Це 2? 150 00:08:35,690 --> 00:08:37,659 Якщо це так, збільшити лічильник 3. 151 00:08:37,659 --> 00:08:39,179 Наступна позиція, це 3? 152 00:08:39,179 --> 00:08:42,440 Якщо це так, збільшити лічильник 4, і так далі. 153 00:08:42,440 --> 00:08:49,190 Так, якщо є позиція з плата, яка не дорівнює наш рахунок, 154 00:08:49,190 --> 00:08:52,640 Потім ми хочемо повернутися помилковим, так як це означає, що є деякі плитки, що є 155 00:08:52,640 --> 00:08:55,490 не в правильному положенні. 156 00:08:55,490 --> 00:08:58,810 >> Так от, що ж це умова робить? 157 00:08:58,810 --> 00:09:02,170 Ну, пам'ятаєте, що заготовка повинен йти в правому нижньому кутку. 158 00:09:02,170 --> 00:09:06,180 І значення порожньою не могли б обов'язково дорівнювати вартості 159 00:09:06,180 --> 00:09:11,080 заперечують, що збирається бути досягнуто у правому нижньому куті. 160 00:09:11,080 --> 00:09:15,760 Таким чином, ми спеціально хочете перевірити, якщо я дорівнює дорівнює г мінус 1 і J рівних 161 00:09:15,760 --> 00:09:19,470 дорівнює д мінус 1 - який говорить, якщо ми дивіться на правому нижньому кутку 162 00:09:19,470 --> 00:09:22,050 рада - тоді ми просто хочете продовжити. 163 00:09:22,050 --> 00:09:26,200 Ми хочемо, щоб пропустити цей конкретний ітерація для петлі. 164 00:09:26,200 --> 00:09:31,250 >> Так от, якщо нам вдасться пройти через це вкладеними цикл, що означає, що 165 00:09:31,250 --> 00:09:34,690 не було плитка, яка була в неправильне положення. 166 00:09:34,690 --> 00:09:38,900 І ми вирватися з петлі і прийти тут, де ми можемо повернутися вірно. 167 00:09:38,900 --> 00:09:41,800 Всі плитки були в правильній позиції і це означає, що користувач має 168 00:09:41,800 --> 00:09:43,230 виграв гру. 169 00:09:43,230 --> 00:09:44,460 І це все. 170 00:09:44,460 --> 00:09:46,550 Мене звуть Боб Боуден, і це було 15. 171 00:09:46,550 --> 00:09:52,726