我有一个简单的WinForms游戏,玩家可以在表格上开车。可以有更多的汽车每个由不同的玩家驱动。
按下某个键时,会触发Form1_KeyDown。现在我需要确定:
我遇到的唯一解决方案是为每个玩家创建一个Keys数组,其中每个索引都意味着不同的命令(例如array [0] = go up,array [1] = down down等)
public Keys[] keyControls = new Keys[5]; // up, down, left, right and fire key codes!
然后我必须遍历每个玩家和每个Key才能找到合适的玩家,所以我会这样:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
foreach (Car car in cars)
{
for (int i = 0; i < car.keyControls.length; i++)
{
if (car.keyControls[i] == e.KeyData)
{
// save car, index (for movement type) and double break the loops with flags
}
}
}
// do something with found car and movement index (movement type)
}
但是我想尽可能地使用“漂亮”和优化的代码,所以我想考虑使用一些Linq:
Cars car = cars.First(t => t.keyControls.Any( m => m == e.KeyData));
但在这种情况下,我将无法获得机芯的索引,因此我无法确定如何处理该车。
我应该将密钥数据存储在某个不同的“对象”中吗?或者是否有可能从Linq获取索引而不再通过循环来查找索引代表什么?
答案 0 :(得分:1)
考虑使用字典或通用字典,您可以在其中存储用于快速查找的密钥,以及表示您需要知道的用于对该查找执行操作的任何其他数据的对象。字典比迭代集合或使用linq要快得多。