>> ROBボーデン：こんにちは。
私はロブだし、私はあなたを願っています 15のゲームのためのゲーム。
今、あなたが必要とする4つの機能があります このプログラムに実装する - INITを、
、描き移動し、優勝した。
それでは、INITを見てみましょう。
>> ここで、我々はしている最初のものを参照してください。 何をするつもりは、変数を宣言している
カウンターと呼ばれる。
それが初期化されるだろう D回Dマイナス1。
dは次元であることに注意してください 当社の取締役会の。
どのようにinitが仕事に行くのは、それが起こっているのである ボード全体を反復するために
そして我々は開始するつもりだ 左上の。
>> そしてちょうど私達を言わせて 4×4ボードを持っている。
我々はしているので、左上 言おうとすると、15である。
そして、我々は単にカウントするつもりだ ボードを通じて、15、14、13を言って、
12、11、10、9、8、7、 6、5、4、など。
だから、左上には、我々はD倍であることを期待 Dマイナス1、4×4
ケースは16のマイナスになるだろう 1、正確に15ある。
>> 我々はするつもりだどこで、今ここにある ボード全体を反復。
そして、我々は内の各位置を設定しようとしている の現在の値ボード
私たちのカウンター、その後、カウンタが起こっている 次のように、デクリメントする
私たちが到達位置が持っているとしている カウンタは、より1つ少なくなる
前の位置。
だから我々は、最初は15を持っていたし、 減算カウンタ。
それでは、我々は14を割り当てるつもりだ 次の位置、減算カウンタ、
そして我々は、割り当てられたとしている 13など。
>> 最後に、我々はその角を処理する必要があり 場合場合には、取締役会でも持っている場合
寸法は、次にちょうど、15、14、13をやっ 12、ダウン3、2、1のすべての方法は、ある
で私たちを残していく 解決不可能ボード。
そして、我々は1と2を交換する必要があります。
DのMOD 2は0に等しいのであれば、それはです どうやって確認するつもりだ
それもだかどうかを確認します。
2 D modは、行Dのマイナスで、0に等しい場合 一番下の行である1、および
位置dマイナス2、または列Dマイナス 2、我々は、2確認を設定しようとしている
列Dマイナス3我々はしている 1に設定する予定。
だから、それはちょうど逆転のWHERE 図1及び図2は、現在。
>> 最後に、我々は非常に設定しようとしている 右下の空白に等しい。ここで、
ブランクは、ハッシュ定義されている 0として上部に。
だから、それは、必ずしも必要ではありませんでした ループでは、これは持っているつもりされているので
0に右下を設定し、以来、 カウンタが0に自然に到達する。
しかし、それは知っている私たちに依存していること ブランクは0を見つけるためにハッシュされた。
私はこのプログラムに入ると、後場合 、100に上部の空白を変更するには
まだ動作するはずです。
>> だから、これは念のことを行っている 右下は、実際に等しく、私たちの
ブランク値。
最後に、我々は2つ​​のグローバル変数を持っている、 私とブランクJ空白、そして我々が表示さ
一番上に宣言されたもの。
そして、我々は世界的なもの2を使用するつもりだ を追跡する変数
空白の位置は、我々はしないように 全体に目を通す必要がある
空白のひとつひとつを見つけるボード 我々は行動を起こすことを試みる時。
だから、空白の位置は常に 右下に開始する予定。
だから、右下のは次式で与えられる。 指数Dマイナス1、Dマイナス1。
だから、それは、INITです。
>> 今、私たちは、描画に移る。
だから、ドローは、同様のことを行っている 私たちは、反復するために行っている場所
ボード全体にわたる。
そして、我々は値だけを印刷したい それは、ボードの各位置にあります。
だからここでは、の値をプリントする ボードの各位置における。
そして、我々がやっていることに気づく - 。
そして、それはただのprintfを伝えるということ 関係なく、それは1桁の場合には、または
2桁の数字、我々はまだそれがしたい プリントアウト2列を取る
そのため、我々は2つ​​の数字と1を持っている場合 同じボードでの桁の数字は、当社
ボードがまだいいと四角になります。
>> だから我々はすべての値のためにそれをやってみたい ボードイン、空白を除いて。
だから、ボード内の位置が等しい場合 ブランク、特に我々
単にアンダースコアをプリントアウトしたい 空白を表すのではなく、する
どのような値 空白は実際にある。
>> 最後に、印刷したい 新しいライン出力。
これは内部のままであることに注意してください 外側のforループの外側が、
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、オリジナルだった 空白 - 私たちは、タイルがために起こっている知っている
そこに移動します。
>> 私たちが実際に行う必要はありません注意してください ここでの本当のスワップ、私たちが知っているので、
挿入する必要がある値 それらの位置へ。
我々は一時的な必要はありません 周りの変数。
>> 最後に、我々はその私たちを覚えておく必要が あるグローバル変数があります
位置を追跡すること ブランクの。
だから我々は、位置を更新する どこにタイルであることが、空白
もともと。
最後に、以来、trueを返し 動きは成功しました。
我々が正常に交換する タイルブランク。
>> 大丈夫なので、最後に、私たち ウォンをチェックする必要があります。
だから、同じようにどこにBOOLを返す優勝 本当のことを示すために起こっている
ユーザは、ゲームを獲得した。
falseは表示していること ゲームはまだ起こっている。
ユーザーが勝っていません。
だから、これはかなりになるだろう INITの反対、INIT、
覚えて、我々は、ボードを初期化する というように15、14、13、12、である。
勝ったのに対して、我々は確認したい場合 ボードは、のように1、2、3、4、5、およびである。
>> そこで、我々は我々の初期化しようとしている それはどのようなトップなので1に対抗
ボードの左側にある必要があります。
そして、我々は、ループするつもりだ ボード全体にわたる。
のは、この条件を無視しましょう 秒。
この状態はちょうどしようとしている チェックはこの位置でボードです
現在のカウントに等しい？
もしそうであれば、そのようカウントをインクリメント 我々は見て次の位置は1高く、
我々は、今にいる位置よりも。
>> だから、我々が得る方法です 左上は1でなければなりません。
2へのカウントをインクリメント。
次の位置を見てください。
これは2か？
もしそうであれば、3にカウントをインクリメント。
次の位置には、この3か？
もしそうであれば、カウントをインクリメント 4へ、というように。
したがって、上の任意の位置がある場合 私たちの数と等しくないボード、
その後、我々はそれ以来、falseを返すようにしたい あるいくつかのタイルがありますことを意味
正しくない位置にある。
>> だからここに、この条件は何をやっている？
さて、空白であることを覚えている 右下に行くことになって。
そして、ブランクの値ではないかもしれない 必然の値に等​​しく
到達することになるだろうカウンター 右下の。
だから我々は、具体的には、私かどうかを確認したい Dマイナス1とJイコールに等しい等しく
Dマイナス1に等しい - と言っているかの私たち の右下を見ている
ボード - ちょうどその時、私たち 続けていきたい。
私たちは、この特定をスキップする のためのループの繰り返し。
>> だから、我々はこの介して取得する管理している場合 forループネストされ、それがあることを意味します
していた何のタイルがありませんでした 誤った位置。
そして、我々はループから抜け出すと来る ここでは、どこにtrueを返すことができます。
すべてのタイルを正しい位置にあった それは、ユーザが有している
ゲームに勝った。
そして、それはこれだけです。
私の名前はロブボーデンであり、これは15であった。