2

4 つの値を含むテーブルがあります。

例えば:

2
4
1
3

関数を使用して、探しているテーブルをステップ実行します。ペアを使用して番号 1 を言い、テーブル内の位置を取得します。

次に、table.remove を使用してその位置から 1 を削除します。私が今やりたいことは、テーブルを圧縮して3つの値の長さにすることです

2
4
3

私はLuaにかなり慣れていないので、優しくしてください。:)

私が持っているのはほとんどこれです:

CloseRandomConsole = math.random(1,(#ConsoleTable)) 

If CloseRandomConsole == 1 then 
 for key, value in pairs(ConsoleTable) do 
 if value == "1" then 
  table.remove(ConsoleTable, key) 
 break 
 end 
end 

どこが間違っているかはわかりますが、それを解決する方法がわかりません。

math.random(1,(#ConsoleTable))

テーブル内の値のいずれかの間でランダムにできるようにしたいだけです。そして、その vlue をランダム化したら、それを削除して、ランダム化する他の 3 つの値が残るようにします。

私はあなたを混乱させていますか?:)

4

2 に答える 2

2

table.remove(ConsoleTable, key)は実際にテーブルから1つの値を削除し、そのサイズを1つ減らします。したがって、次に呼び出すときmath.random(1,(#ConsoleTable))に、その範囲も1つ小さくなります。正直なところ、大丈夫そうですが、何が問題なのかわかりません。

編集:このワンライナーはどうですか?

table.remove(ConsoleTable, math.random(1, #ConsoleTable))

これにより、テーブルからランダムに1つの「コンソール」が削除されると思います。おそらく、あなたがそれを試すことができ、それがあなたが望むものではない場合、何が悪いのかを詳細に説明してください、私たちはもっと多くのことを試すことができます。

于 2010-12-04T16:45:45.087 に答える
2

反復処理中にテーブルから項目を削除することは、一般的に悪いプログラミング手法と考えられています。多くの言語は、これによってかなり混乱します。本当にそれを行いたい場合は、2 番目のミラー テーブルを作成してから、元のテーブルから項目を削除しながらそれを反復処理することをお勧めします。

ただし、コンソールの状態もテーブルに保存し、1 つを非アクティブ (おそらく状態 0) に設定し、他のコンソールはアクティブ (状態 1) のままにすることをお勧めします。次に、プレーヤーはいくつかをアクティブに設定でき、ボスはそれらの1つを選択して再度非アクティブ化します. さらに数行のコードが必要になりますが、より柔軟で理解しやすいはずです。

于 2011-02-26T02:35:28.650 に答える