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 這將被初始化 至d次·d減1。 10 00:00:37,620 --> 00:00:40,200 請記住,d為維 我們的董事會。 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 所以左上方,我們預期將d次 ð減去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 我們到達的位置,都將有 計數器大於1小於 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 因此,當d MOD 2等於0,這是 我們要如何檢查 32 00:01:52,930 --> 00:01:54,410 來看看它是否均勻。 33 00:01:54,410 --> 00:01:59,810 若d模2等於0,則在D行減 1,這是最底行,並且 34 00:01:59,810 --> 00:02:05,430 位置d減2或D列減 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 所以,這是不是絕對必要的, 因為這個for循環都將有 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,D減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 所以,如果我們有2位和1 在同一塊板上位數,我們的 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 由於這種外部for循環遍歷 在所有的行,所以這是printf的 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 true或false,這取決於 這一舉動是否竟是 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 到空白,我們可以返回false。 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 所以,這將是相當多 初始化的對面,這裡的init, 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 我們想跳過這個特殊的 迭代的for循環。 164 00:09:26,200 --> 00:09:31,250 >> 因此,如果我們能夠熬過這 嵌套的for循環中,這意味著 165 00:09:31,250 --> 00:09:34,690 沒有瓷磚,這是在 不正確的位置。 166 00:09:34,690 --> 00:09:38,900 我們跳出循環,來 在這裡,在這裡我們可以返回true。 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