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であった。