1 00:00:00,000 --> 00:00:13,070 2 00:00:13,070 --> 00:00:13,715 >> ROBボーデン:こんにちは。 3 00:00:13,715 --> 00:00:17,800 私はロブだし、私はあなたを願っています 15のゲームのためのゲーム。 4 00:00:17,800 --> 00:00:22,040 今、あなたが必要とする4つの機能があります このプログラムに実装する - INITを、 5 00:00:22,040 --> 00:00:24,650 、描き移動し、優勝した。 6 00:00:24,650 --> 00:00:27,230 それでは、INITを見てみましょう。 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 どのようにinitが仕事に行くのは、それが起こっているのである ボード全体を反復するために 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倍であることを期待 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 2 D modは、行Dのマイナスで、0に等しい場合 一番下の行である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 だから、それはちょうど逆転のWHERE 図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 最後に、我々は2つ​​のグローバル変数を持っている、 私とブランクJ空白、そして我々が表示さ 47 00:02:50,270 --> 00:02:53,360 一番上に宣言されたもの。 48 00:02:53,360 --> 00:02:56,270 そして、我々は世界的なもの2を使用するつもりだ を追跡する変数 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 だから、右下のは次式で与えられる。 指数Dマイナス1、Dマイナス1。 53 00:03:13,270 --> 00:03:14,880 だから、それは、INITです。 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を伝えるということ 関係なく、それは1桁の場合には、または 61 00:03:37,410 --> 00:03:42,010 2桁の数字、我々はまだそれがしたい プリントアウト2列を取る 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 これは内部のままであることに注意してください 外側のforループの外側が、 70 00:04:11,970 --> 00:04:13,200 forループの内側。 71 00:04:13,200 --> 00:04:17,930 ループのためのこの外側を反復処理しているため すべての行の上ので、この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 最後に、以来、trueを返し 動きは成功しました。 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 だから、同じようにどこにBOOLを返す優勝 本当のことを示すために起こっている 132 00:07:39,900 --> 00:07:41,460 ユーザは、ゲームを獲得した。 133 00:07:41,460 --> 00:07:43,780 falseは表示していること ゲームはまだ起こっている。 134 00:07:43,780 --> 00:07:46,340 ユーザーが勝っていません。 135 00:07:46,340 --> 00:07:52,100 だから、これはかなりになるだろう INITの反対、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 もしそうであれば、そのようカウントをインクリメント 我々は見て次の位置は1高く、 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 その後、我々はそれ以来、falseを返すようにしたい あるいくつかのタイルがありますことを意味 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 だから我々は、具体的には、私かどうかを確認したい Dマイナス1とJイコールに等しい等しく 161 00:09:15,760 --> 00:09:19,470 Dマイナス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 >> だから、我々はこの介して取得する管理している場合 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