>> ROB BOWDEN: Привет.
Я Роб, і я сподіваюся, що ваші ігри для гри 15.
Зараз є чотири функції, які ви повинні для реалізації в цій програмі - ініціалізації,
малювати, переміщати, і виграв.
Отже, давайте подивимося на ініціалізації.
>> Тут ми бачимо, перше, що ми знаходимося збираюся зробити, це оголосити змінну
називається лічильник.
Це збирається бути ініціалізовані в м раз г мінус 1.
Пам'ятайте, що г-розмірність нашій дошці.
Як ініціалізації працюватиме це відбувається для перебору всієї конференції
і ми збираємося почати в лівому верхньому кутку.
>> І давайте просто сказати, що ми є 4 по 4 дошки.
Таким чином, верхній лівий ми збираюся сказати, 15.
А потім ми просто будемо вважати через дошки, кажучи 15, 14, 13,
12, 11, 10, 9, 8, 7, 6, 5, 4, і так далі.
Таким чином, верхній лівий, ми очікуємо, що г раз г мінус 1, який в 4 на 4
справа буде 16 мінус 1, що правильно 15.
>> А тепер ось де ми збираємося перебору всієї конференції.
І ми збираємося встановити кожну позицію в дошка для поточного значення
наш лічильник, а потім проти збирається для зменшення, так що наступний
положення ми досягаємо матиме лічильник на один менше, ніж
попереднє положення.
Таким чином, ми спочатку були 15 і зменшити лічильник.
Отже, що ми збираємося призначити 14 до Наступне місце, декремент лічильника,
і ми збираємося призначений 13, і так далі.
>> Нарешті, ми повинні впоратися з цим кут випадок, коли, якщо на платі є ще
вимір, то просто роблю 15, 14, 13, 12, все, аж до 3, 2, 1, є
збираєтеся залишити нас з нерозв'язна дошка.
І у нас є, щоб поміняти 1 і 2.
Так що, якщо г по модулю 2 дорівнює 0, це як ми збираємося перевірити
щоб побачити, якщо це навіть.
Якщо г по модулю 2 дорівнює 0, то в рядку г мінус 1, що нижній ряд, і
позиція пана мінус 2, або стовпець г мінус 2, ми збираємося встановити, що в 2, і
Колонка D мінус 3 ми збирається встановити в 1.
Так що просто заднім ходом, де 1 і 2 в даний час.
>> Нарешті, ми збираємося встановити дуже внизу праворуч дорівнює порожній, де
порожній був хеш визначені вгорі як 0.
Так, що не є абсолютно необхідним, так як це цикл матиме
встановити нижню право на 0, так як Лічильник, природно, досягти 0.
Але це залежить від нас, знаючи, що порожній був хешірованного знайти 0.
Якщо я йду в цю програму, а потім змінити порожній рядок у верхній до 100, це
ще повинен працювати.
>> Так що це тільки переконавшись, що внизу праворуч насправді дорівнює нашої
порожнє значення.
Нарешті, у нас є дві глобальні змінні, так порожній я і порожній J, і ми бачимо,
тих, які оголошені на самому верху.
І ми збираємося використовувати ці два глобальних змінні для відстеження
Положення заготовки, так що ми не потрібно дивитися через весь
дошка знайти заготовки кожен разу ми намагаємося зробити хід.
Таким чином, положення заготовки завжди збирається почати в правому нижньому кутку.
Таким чином, нижній правий дається індекси г мінус 1, д мінус 1.
Отже, ось ініціалізації.
>> Тепер ми перейдемо до малювати.
Так, нічия буде схожий куди ми йдемо для ітерації
над форумом.
І ми просто хочемо, щоб надрукувати значення ось в кожному положенні дошки.
Так от, ми друку значенням, в кожному положенні дошки.
І зауважте, що ми робимо -.
І це тільки говорить Printf, що незалежно від того, якщо це одна цифра або
двозначне число, ми все ще хочемо, щоб він зайняти до двох стовпців в роздруківці,
так що якщо у нас є два цифру і один значних чисел в одній платі, наш
Рада буде як і раніше виглядати красиво і квадрат.
>> Таким чином, ми хочемо зробити, що для кожного значення в раді, для заготівлі винятком.
Так що, якщо положення в раді одно заготовки, то ми спеціально
хочете роздрукувати тільки підкреслення представляти порожнім, замість того, щоб
незалежно від значення порожній насправді.
>> Нарешті, ми хочемо надрукувати з нової лінії.
Зверніть увагу, що це як і раніше всередині Зовнішній цикл, але за межами
внутрішній цикл.
Оскільки цей зовнішній для циклу ітерації по всіх рядках, і таким чином це Е є
збирається просто надрукувати нову лінію, тому ми перейти до роздрукувати наступний рядок.
І це все за нічию.
>> Отже, тепер давайте перейдемо рухатися.
Перейдемо тепер крок, плитку, що користувач увійшов в гру - вони
введіть плитку вони хочуть рухатися - і ти повинен повертати логічне значення, так
істинним або хибним, залежно від чи був цей крок насправді
дійсно - чи може, що плитка буде переїхав в порожній простір.
>> Так от, ми оголосити локальну змінну, tile_1 і tile_j, які збираються
бути схожий на blank_i і blank_j, за винятком того, що відбувається, щоб відстежувати
Положення плитки.
Тепер ось, ми збираємося використовувати blank_i і blank_j і сказати все гаразд, так
ось порожній на дошці.
>> Тепер, є вище заготовки плитка?
Є плитка зліва від заготовки?
Є плитка праворуч від заготовки?
Чи є плитка нижче заготовки?
Так, якщо плитка знаходиться в одному з тих, позиції, то ми знаємо, що плитка
можуть бути переміщені в порожньому місці і порожній можуть бути переміщені в якому
плитка в даний час.
>> Так от, ми говоримо, якщо плата в положенні blank_i мінус 1 blank_j.
Так що це говорить є плитка вище поточної заготовки?
І якщо це так, ми збираємося, щоб пам'ятати що це позиція плитки.
Плитка знаходиться в положенні blank_i мінус 1 і blank_j.
Тепер спочатку, у нас також є цю перевірку прямо тут, так blank_i є
більше 0.
>> Чому ми хочемо, щоб це зробити?
Ну, якщо заготовка знаходиться у верхньому ряду правління, то ми не хочемо, щоб
дивіться вище заготовки для плитки з немає нічого вище верхньої
ряд дошки.
Це, як ви могли б у кінцевому підсумку отримати щось на зразок помилки сегментації або
ваша програма може спрацювати найнесподіванішим чином.
Так, цього переконавшись, що ми не робимо шукати в місцях, які не дійсні.
>> Тепер ми збираємося зробити те ж саме для всі інші можливі комбінації.
Так от, ми з нетерпінням нижче заготовки щоб побачити, якщо це плитка.
І ми також повинні переконатися, що ми не в нижньому ряду, інакше ми
не слід шукати плитки.
Тут ми будемо дивитися зліва від заготовки, щоб переконатися, що це плитка.
І ми не повинні дивитися наліво якщо ми в крайньому лівому стовпчику.
І тут ми будемо дивитися, щоб Право заготовки, і ми не повинні
подивіться направо, якщо ми в правій колонці.
>> Так що, якщо жодна з цих речей не було правдою, це означає, що плитка не був смеж
до заготівлі, і ми можемо повернутися помилковим.
Цей крок не був дійсний.
Але, якщо один з тих, було правдою, то, по крайней ця точка, ми знаємо, що tile_i і
tile_j рівні Положення плитки.
І так, ми можемо оновити дошку в позиції tile_i і tile_j.
Ми знаємо, що нове значення буде порожнім і що положення blank_i
blank_j, який був оригінальним порожній - ми знаємо, що плитка буде
переїхати туди.
>> Зверніть увагу, ми насправді не потрібно робити реальна заміна тут, так як ми знаємо,
значення, які повинні бути вставлені в цих позиціях.
Нам не потрібно тимчасове Мінлива навколо.
>> Нарешті, ми повинні пам'ятати, що ми є наші глобальні змінні, які
відстеження позиції заготовки.
Тому ми хочемо, щоб оновити положення заготовки бути там, де плитка
спочатку був.
Нарешті, ми повертаємося вірно, так як цей крок був успішним.
Ми успішно поміняти порожній з плиткою.
>> Гаразд, в минулому ми потрібно перевірити вон.
Так, виграв же повертає логічне значення, де правда збирається показують, що
Користувач виграли гру.
І брехня вказує, що гра продовжується до цих пір.
Цей користувач ще не виграв.
Таким чином, це буде в значній мірі протилежність ініціалізації, де ініціалізації,
пам'ятайте, ми ініціалізувати дошка до 15, 14, 13, 12, так далі.
У той час як виграв, ми хочемо перевірити, якщо Плата 1, 2, 3, 4, 5, і так далі.
>> Так, ми збираємося, щоб ініціалізувати наш протистояти до 1 так як це те, що верхня
Зліва від дошки має бути.
А потім ми збираємося петлі над форумом.
Давайте проігноруємо це умова ні на секунду.
І це умова тільки збирається перевірка рада в цьому положенні
рівними поточних статтях?
Якщо це так, збільшити лічильник так, щоб Наступне місце ми дивимося на один вище
ніж становище ми знаходимося на даний момент.
>> Так от, як ми отримуємо угорі ліворуч повинна бути 1.
Збільшують кількість до 2.
Подивіться на наступну позицію.
Це 2?
Якщо це так, збільшити лічильник 3.
Наступна позиція, це 3?
Якщо це так, збільшити лічильник 4, і так далі.
Так, якщо є позиція з плата, яка не дорівнює наш рахунок,
Потім ми хочемо повернутися помилковим, так як це означає, що є деякі плитки, що є
не в правильному положенні.
>> Так от, що ж це умова робить?
Ну, пам'ятаєте, що заготовка повинен йти в правому нижньому кутку.
І значення порожньою не могли б обов'язково дорівнювати вартості
заперечують, що збирається бути досягнуто у правому нижньому куті.
Таким чином, ми спеціально хочете перевірити, якщо я дорівнює дорівнює г мінус 1 і J рівних
дорівнює д мінус 1 - який говорить, якщо ми дивіться на правому нижньому кутку
рада - тоді ми просто хочете продовжити.
Ми хочемо, щоб пропустити цей конкретний ітерація для петлі.
>> Так от, якщо нам вдасться пройти через це вкладеними цикл, що означає, що
не було плитка, яка була в неправильне положення.
І ми вирватися з петлі і прийти тут, де ми можемо повернутися вірно.
Всі плитки були в правильній позиції і це означає, що користувач має
виграв гру.
І це все.
Мене звуть Боб Боуден, і це було 15.