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