1

最初は、私の質問は以前に尋ねられるべきだったと思いますが、欲しいものが見つかりませんでした。

私が開発しているこの iOS アプリの 1 つの要素は、8x8 グリッドをテトリスのピースに分割することです (各ピースは 4 つのブロックでできています)。私が持っている2つの特定の質問は次のとおりです。

  1. Objective-C でテトリスのピースを表現する最良の方法は何ですか?

  2. グリッドをランダムな Tetris ピースに表示するアルゴリズム (および後で 2 つのピースが適合するかどうかを確認する方法)。

01/28 版 @livingtech さんのおっしゃる通り、「穴あき」以外はほぼ実装できたと思います。私のコードは、テトリス ブロックが 2 つのブロック (はい、水平または垂直に接続された 2 つの正方形) のみの単純な段階では穴がなくても機能しますが、3 正方形のテトリス ブロックでは穴ができます。テストしたばかりで、1000回実行したところ、穴のないものを取得できました。したがって、次の正方形がシングルトンになるかどうかを確認するメカニズムが必要なのは間違いありません。

4

5 に答える 5

1

私は自分のゲームで同じことをしようとしています。私はまったくの初心者ですがXNA、C# を使用しています。

しかし、私がそれについて行おうとしている方法は次のとおりです。4x6 grid array

--y123456
X1-000000
X2-000000
X3-000000
X4-000000

ここ、

  • 0 はブロックなしを意味します
  • 1 ブロックを定義します

アルゴリズム

  1. 配列の最初の 0 (左上隅) から始めて、ランダムに 0 または 1 を選択します。
  2. x1/x2-y1/y2 に基づいて座標をランダムに選び、1 か 0 を決定します。
  3. 1 の場合は、その 1 が置かれた場所に基づいてコーディネートを決定します。
  4. x2 y1 で 1 だった場合は、次に接触する座標に 1 を入れるかどうかを決定します。
  5. 接触する座標と接触しない座標をコーディングするだけで、ロジックがロールスルーされます。

私のセットアップは少し異なります。しかし、これが私のランダム テトリス エンジンの基本的な基盤です。

また、そのようにすることで、ホワイトボードを用意し、グリッドの図を作成し、座標をラベル付けするのが本当に役立つこともわかりました.

于 2013-03-13T03:08:40.427 に答える
0

あなたの質問 #2 にまだ誰も答えていないと思います。

設定:

  1. グリッドをある種の配列として表す必要があります。少なくとも、グリッド内の各座標が「占有」されているかどうかを示すために、ある種のブール値が必要になります。
  2. グリッド上のピースを追跡する必要があります。これは別の配列である可能性があり、今回は各ピースの 4 つの座標への参照を保持します。
  3. ピースを埋め始めるグリッド内の座標を追跡するには、1 つまたは複数の変数が必要です (おそらく、開始するコーナーでこれらを設定します)。
  4. 可能なすべてのテトリス ピースとローテーションの「プール」を設定します。(以下に概説するすべての反復で既にチェックしたものを追跡する必要があります。)

繰り返す:

  1. あなたの開始座標に合うランダムなピースをプールから取得します。(派手になりたい場合は、どれを選択するかを賢くするか、完全にランダムにすることができます。ピースが収まらない場合は、チェックマークを付けて、永遠にランダムにチェックし続けることがないようにします。すべての部分をチェックしたところまで、反復をバックアップするか、最初からやり直すかのいずれかで、機能しない解決策があります。)
  2. 選択したテトリスのピースが「穴」、つまり 4 マス未満の空きスペースを残さないことを確認してください。(この問題を解決するための要件が​​わからないため、速度とコーディングの容易さのどちらに重点を置くべきかはわかりませんが、必要に応じてこの手順をスキップして、解決策を「ブルート フォース」で解決することもできます.)
  3. ピース配列に書き込み、塗りつぶされた座標をマークすることにより、ピースを「配置」します。
  4. すべてのスペースが埋まっている「完了」状態を確認します。
  5. グリッドで新しい座標を選択し、#1 を繰り返します。(前の座標の隣にある空のものを選びます。)
于 2013-01-27T06:04:31.560 に答える
0

これがまだ実際の場合、数か月前に Objective-C でテスト テトリス アプリを作成しましたhttps://github.com/SonnyBlack/Test-Demo-Tetris。私のアルゴリズムはあまりよくないと思いますが、機能しています。=)

于 2013-08-27T07:14:52.687 に答える
0

あなたのボードは 8*8 なので、ボードを表すために int64 を使用できると思います。int64 の各ビットは、特定のグリッドが満たされているかどうかを表します。

于 2013-01-26T05:24:29.257 に答える
0

テトリスの実装は私の趣味です。最初に Windows/C で実装しました。次にPerl/Tkで!Obj-C/Cocoa (Mac) で行った最後の実装。いずれの場合も、ゲーム ロジックは同じです。UI のみが変更されます。私はすべての小さなボックスを個別に扱い、ボード上のすべての「セット」ボックスの存在 (および色) を含む 2 次元配列を持っています。私が使用する標準ボードのサイズは、幅 10 ボックス、高さ 20 ボックスです。

それとは別に、「ドロップ」ピースを追跡します。それは場所であり、それがどのようなピースであるかです。タイマーに基づいて、駒を落としてみてください。「ドロップ」ピースがドロップするボックスのいずれかがすでに設定されている場合は、ピースのドロップを停止し、ピースボックスをボードの「設定」部分に追加します。新しい作品を作成し、最初からやり直してください。

それを実装する最良の方法ではないかもしれませんが、私の頭では理にかなっています。純粋な OO の観点から、ドロップ ピースの各シェイプは、ジェネリック シェイプ クラスのサブクラスである可能性があります。形状がドロップできるかどうか、形状内の個々のボックスのオフセットなどをチェックする関数をオーバーライドします。

于 2013-01-26T07:46:38.237 に答える