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.