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。