0

では、序文として、私の教授が私たちにプロジェクトを投げかけましたが、そのプロジェクトを引き受ける準備ができていないと思います。それでも、「スマート」な 5 列連続ゲームを構築する必要があります。だから私は、プログラムにこれを使ってボードの寸法をユーザーに尋ねさせることから始めました:

https://gist.github.com/2307257

このゲームのボードは非常に大きいので、コンピューターがボードの中央を制御できるように、ボード上のスペースをランク付けするアルゴリズムが必要です。たとえば、5x5 ボードでは、値は次のようになります。

1 1 1 1 1

1 2 2 2 1

1 2 3 2 1

1 2 2 2 1

1 1 1 1 1

この場合、コンピューターはボードの中央 (値 3) を選択します。私はまったく初心者なので、これを行うのに苦労しています。ボード上の任意のスポットの値は次のようになるはずだと思うので、いくつかのループでこれを行うことができると考えていました。スルー (最大高 - i)] = 1 + i ですよね?よく私はこのようなものを使用しようとしてきました:

https://gist.github.com/2307327

でももちろんうまくいきません。さもなければ、私はここにいないでしょう。これを理解するのを手伝ってください。ありがとう

4

1 に答える 1

1

長さ/サイズ 5 の配列は 0 から 4 までのインデックスを持つため、このコードはバッファ オーバーフローを引き起こします。

行 27 は、y が同じ高さの場合にクラッシュを引き起こします。これは、配列の範囲外で書き込みを行うためです。x が幅に等しく、y が高さより小さい場合、array[0][y+1] セルに書き込みます。

ループは ... for (y = 0; y < height; y++) for (x = 0; x < width; x++) ... である必要があります。高さと幅 (たとえば) は 5 に等しいためです。y と x は反復します。 0 から 4 まで。有効な配列インデックスになります。

上記のように配列にデータを入力する場合は、y 方向を無視しています。簡素化できます。

#define MIN(A, B) (((A) < (B)) ? A : B)

// x or y is cell 0 to 4 then the cell value should x or y + 1
// x or y is close to the other edge then the cell value should be width - x, or height - y
// I'm assuming that if the playing field is larger than 9x9 then a cell value of 5 is
// good enough.
array[x][y] = 
   MIN(
      5,
      MIN(
         MIN(x + 1, width  - x),
         MIN(y + 1, height - y)));

結果が27行目と対称であることを認識して、賢くしようとしていることがわかります。ただし、そうする場合は、forループを変更して、幅(および最終的には高さ)の「半分」を反復処理する必要があります。そうしないと、上書きされます。既に計算されたセル。要するに、これは最適化です。あなたが最後にすべきこと、そして何かが最初に機能するようになった後にすべきこと。

多くの場合、単純で理解しやすいことを行うだけで、最適化が必要ない速度という点で「十分」になります。この場合、脳死の単純なアルゴリズムが遅く見えるようにするには、1970 年代の超低速のマシンが必要です。

いくつかのニットピッキング...
- 入力を検証します。一部の yahoo タイプが負の数の場合、配列を作成しようとするとクラッシュします。この場合、5 を接続する必要があるため、5 未満の値を受け入れても意味がありません。4x4 のボードでは不可能になります。

于 2012-04-20T17:31:45.303 に答える