>> ROB BOWDEN：你好。
我抢，我希望你 游戏游戏15。
现在，有你需要的四大功能 这项计划实施 - 初始化，
绘制，移动，赢了。
那么，让我们来看看初始化。
>> 在这里，我们看到我们的第一件事 要做的是声明一个变量
所谓的计数器。
这将被初始化 至d次·d减1。
请记住，d为维 我们的董事会。
如何初始化是去工作的是它会 遍历整个板
我们要开始 在左上角。
>> 并让我们只说我们 有一个4×4板。
所以左上角我们 接下来要说的是15。
然后，我们只是要算 通过板，说15，14，13，
12，11，10，9,8，7， 6,5，4，等等。
所以左上方，我们预期将d次 ð减去1，这在4乘4
案件将是零下16 1，这是正确的15。
>> 现在这里就是我们要去 遍历整个董事会。
而我们要设定每个位置 董事会的当前值
我们的计数器，然后计数器是怎么回事 递减，从而使下一个
我们到达的位置，都将有 计数器大于1小于
以前的位置。
因此，我们最初有15和 递减计数器。
这样的话，我们要分配14到 下一个位置，递减计数器，
而我们要指定 13，依此类推。
>> 最后，我们需要处理的那个角落 情况下，如果董事会有偶数
尺寸，那么就做15，14，13， 12，一路下滑到3，2，1，是
要离开我们 一个无法解决的板。
我们必须交换1和2。
因此，当d MOD 2等于0，这是 我们要如何检查
来看看它是否均匀。
若d模2等于0，则在D行减 1，这是最底行，并且
位置d减2或D列减 2，我们要设置为2，
d栏零下3我们 要设置为1。
所以，这只是其中倒车 在1和2目前是。
>> 最后，我们要设置很 右下等于空白，其中
空白已经被定义哈希 在顶部为0。
所以，这是不是绝对必要的， 因为这个for循环都将有
设置右下角为0，因为 反自然会达到0。
但是，这依赖于我们知道 空白被散列找到一个0。
如果我进入这个程序，后来 更改上方的空白为100，它
应该仍然工作。
>> 所以这只是在确保 右下实际上等于我们
空白值。
最后，我们有两个全局变量， 所以我的空白和空白j和我们看到的
在上面这些声明。
我们要使用这两个全球 变量来跟踪的
空白的位置，使我们不 需要看整个
板找空白的每一个 一次我们试图做出的举动。
因此，坯件的位置始终是 将开始于右下方。
所以右下角由下式给出 指数Ð减1，D减1。
所以，这是初始化。
>> 现在，我们继续绘制。
所以，拉伸将是类似 我们要去的地方进行迭代
在整个电路板。
我们只是要打印的值 这是在板的每个位置。
所以在这里，我们要打印的值是 在棋盘的每个位置。
并请注意，我们正在做的 - 。
而这只是告诉printf的那 不论它是一个数字或
两位数字，我们仍然希望它 占用两列在打印出来，
所以，如果我们有2位和1 在同一块板上位数，我们的
板仍然会好看和广场。
>> 所以我们想要做的，对于每一个值 中板，除空白。
所以，如果在电路板上的位置等于 空白的，那么我们的专
想打印出只是一个下划线 以表示为空白，而不是
的任何值 空白实际上是。
>> 最后，我们要打印 出一个新行。
请注意，这仍然是内 外循环，但外面
内循环。
由于这种外部for循环遍历 在所有的行，所以这是printf的
将只打印一个新行，所以我们 移动到打印出的下一行。
这就是它的平局。
>> 所以，现在让我们继续前进移动。
现在，我们通过招，瓷砖的 用户将被输入到游戏 - 它们
进入他们想要移动的瓷砖 - 和 你应该返回一个布尔值，所以
true或false，这取决于 这一举动是否竟是
有效的 - 那瓦能否 搬进空白。
>> 所以在这里，我们声明一个局部变量， 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。
>> 我们为什么要那么做？
那么，如果是空白的最上面一行 董事会的，那么我们不希望
看看上面因为空白的瓷砖 没有什么高于顶
排板。
这就是你可能最终得到 像段故障或
你的程序可能只是工作 以意想不到的方式。
所以，这是确保我们不 看在无效的地方。
>> 现在，我们要做同样的事情 所有其它可能的组合。
所以在这里，我们期待下面的空白 看看如果是这样的瓷砖。
而且我们还必须确保我们 不是在最后一行，否则我们
不该看的瓷砖。
在这里，我们将看向左边 空白，看它是否是瓷砖。
我们不应该向左边看 如果我们是在最左边的列。
在这里，我们要去看看的 右侧的空白，我们不应该
向右边看，如果我们 在最右边的列中。
>> 所以，如果没有这些东西都是真实的， 这意味着该瓦片不相邻
到空白，我们可以返回false。
此举是无效的。
但是，如果其中的一个是真的，那么在 这一点，我们知道，tile_i和
tile_j是等于 瓷砖的位置。
因此，我们可以在更新主板 位置tile_i和tile_j。
我们知道，新的值将是空 并且，该位置blank_i
blank_j，这是原来的 空白 - 我们知道瓷砖是要
搬到那里。
>> 请注意，我们实际上并不需要做一个 这里真正的交换，因为我们知道
需要被插入的值 到这些位置。
我们不需要一个临时 变量各地。
>> 最后，我们必须记住，我们 有我们的是全局变量
跟踪的位置的 空白的。
因此，我们要更新的位置 空白是平铺在那里
原来是。
最后，我们回到真正的自 此举是成功的。
我们成功地交换 与瓷砖空白。
>> 好吧，所以最后我们 需要检查韩元。
所以，同样赢得了返回一个布尔值，其中 真正是要表明
赢得了用户的游戏。
和假的，表明 比赛仍在继续。
该用户还没有赢得。
所以，这将是相当多 初始化的对面，这里的init，
请记住，我们初始化板 15，14，13，12，等等。
虽然赢了，我们要检查 板是1，2，3，4，5，等等。
>> 所以，我们要初始化我们 计数器为1，因为这顶一下
电路板的左边应该是。
然后我们要循环 在整个电路板。
让我们忽略这个条件 一秒钟。
而这个情况也只是要 检查董事会在此位置
等于当前的计数？
如果是这样，递增计数，以使 我们来看看下一个位置是高
比我们在现在的位置上。
>> 所以这就是我们如何获得 左上角应为1。
递增计数为2。
看看下一个位置。
这是2？
如果是这样，递增计数为3。
下一个位置，这是3？
如果是这样，递增计数 到4，等等。
所以，如果有在任何位置 板，不等于我们的数量，
然后我们要返回自认为假 意味着有一些瓷砖是
不是在正确的位置上。
>> 所以在这里，这是什么情况在做什么？
好了，记住，是空白 应该去在右下角。
和空白的值可能不是 不一定等于的值
反驳说，将要达到 在右下角。
因此，我们特别要检查，如果我 等于等于ð减1和j等于
等于Ð零下1 - 这是说，如果我们 在看的右下
主板 - 那么我们就 要继续。
我们想跳过这个特殊的 迭代的for循环。
>> 因此，如果我们能够熬过这 嵌套的for循环中，这意味着
没有瓷砖，这是在 不正确的位置。
我们跳出循环，来 在这里，在这里我们可以返回true。
所有切片都在正确的位置 这意味着用户具有
赢得了比赛。
就是这样。
我的名字是罗布·鲍登，这是15。