我在visual studio c#中的项目只响应D键,而不响应其他键
下面的代码是用来检测玩家何时按下一个键(a s或d),但它只响应d,我不知道为什么。我对编码相当陌生,这是visual studio c#中的一个学校项目 p1到3检测您正在使用的角色,当您按下按钮时,它会使空闲动画停止(称为自动),只有当您的能量已满时,您才能进行攻击我在visual studio c#中的项目只响应D键,而不响应其他键,c#,C#,下面的代码是用来检测玩家何时按下一个键(a s或d),但它只响应d,我不知道为什么。我对编码相当陌生,这是visual studio c#中的一个学校项目 p1到3检测您正在使用的角色,当您按下按钮时,它会使空闲动画停止(称为自动),只有当您的能量已满时,您才能进行攻击 private void FrmFinalProject_KeyDown(object sender, KeyEventArgs e) { if (p1 == 2) {
private void FrmFinalProject_KeyDown(object sender, KeyEventArgs e)
{
if (p1 == 2)
{
if (e.KeyCode == Keys.D)
{
if (p1Energy >= 10)
{
tmrBatAtk2.Enabled = true;
picBatAuto.Visible = false;
picBatAtk2.Visible = true;
p1Energy = 0;
prgP1Bar.Value = 0;
pgrHpP2.Value = pgrHpP2.Value - 25;
}
if (e.KeyCode == Keys.S)
{
if (p1Energy >= 10)
{
tmrBatAtk2.Enabled = true;
picBatAuto.Visible = false;
picBatAtk1.Visible = true;
p1Energy = 0;
prgP1Bar.Value = 0;
pgrHpP2.Value = pgrHpP2.Value - 30;
}
}
if (e.KeyCode == Keys.A)
{
if (p1Energy >= 10)
{
tmrBatAtk2.Enabled = true;
picBatAuto.Visible = false;
picBatAtk3.Visible = true;
p1Energy = 0;
prgP1Bar.Value = 0;
pgrHpP2.Value = pgrHpP2.Value - 35;
}
}
}
}
if (p1 == 1)
{
if (e.KeyCode == Keys.D)
{
if (p1Energy >= 10)
{
tmrFriendAtk.Enabled = true;
PicFriendAuto.Visible = false;
picFriendAtk1.Visible = true;
p1Energy = 0;
prgP1Bar.Value = 0;
pgrHpP2.Value = pgrHpP2.Value - 25;
}
if (e.KeyCode == Keys.S)
{
if (p1Energy >= 10)
{
tmrFriendAtk.Enabled = true;
PicFriendAuto.Visible = false;
PicFriendAtk2.Visible = true;
p1Energy = 0;
prgP1Bar.Value = 0;
pgrHpP2.Value = pgrHpP2.Value - 30;
}
}
if (e.KeyCode == Keys.A)
{
if (p1Energy >= 10)
{
tmrFriendAtk.Enabled = true;
PicFriendAuto.Visible = false;
picFriendatk3.Visible = true;
p1Energy = 0;
prgP1Bar.Value = 0;
pgrHpP2.Value = pgrHpP2.Value - 35;
}
}
}
}
if (p1 == 3)
{
if (e.KeyCode == Keys.D)
{
if (p1Energy >= 10)
{
tmrKnightAtk.Enabled = true;
picKnightAuto.Visible = false;
knightatk1.Visible = true;
p1Energy = 0;
prgP1Bar.Value = 0;
pgrHpP2.Value = pgrHpP2.Value - 25;
}
if (e.KeyCode == Keys.S)
{
if (p1Energy >= 10)
{
tmrKnightAtk.Enabled = true;
picKnightAuto.Visible = false;
knightAtk2.Visible = true;
p1Energy = 0;
prgP1Bar.Value = 0;
pgrHpP2.Value = pgrHpP2.Value - 30;
}
}
if (e.KeyCode == Keys.A)
{
if (p1Energy >= 10)
{
tmrKnightAtk.Enabled = true;
picKnightAuto.Visible = false;
knightAtk3.Visible = true;
p1Energy = 0;
prgP1Bar.Value = 0;
pgrHpP2.Value = pgrHpP2.Value - 35;
}
}
}
}
}
正如其他人在评论中所指出的,问题在于将
IF
语句括起来。如果你想检查同样的东西,这里有一个按键,那么它需要在相同的水平。请看我添加了绿线和红线以显示同一级别的语句的图像
你的按键检查应该全部在绿线上,就像第一个一样,但其余的都不是
因此,为了解决您的问题,您需要在内部的if
语句后面加上一个结束}
括号(并对每个语句都这样做)
但是你有这个问题的原因是因为你的代码太复杂了,所以当你有这样的错误时,很难找到,因为它很难阅读。当您只需要一次检查时,还可以在多个位置重复相同的检查(p1Energy>=10
)
所以你需要重构你的代码。使用switch语句和子方法意味着您可以更好地阅读代码、查找bug并了解发生了什么
private void FrmFinalProject_KeyDown(object sender, KeyEventArgs e)
{
int p1 = 2, p1Energy = 1;
//if p1Energy >= 10 needs to be checked for every case, so we just check once at the beginning
if (p1Energy >= 10)
{
//Now we use a switch to check the value of p1, and call sub-methods to perform the code
switch (p1)
{
case 1: Process1(e);
break;
case 2: Process2(e);
break;
case 3: Process3(e);
break;
}
}
因此,现在为每种情况调用一个子方法Process1/2/3()。看起来是这样的:
private void Process2(KeyEventArgs e)
{
switch(e.KeyCode)
{
case Keys.D: Process_2_D();
break;
case Keys.A: Process_2_A();
break;
case Keys.S: Process_2_S();
break;
}
}
(每种情况重复)
然后,它为每个子案例调用一个子方法,每个子案例可能看起来像这样
私有无效过程_2_D()
{
tmrBatAtk2.Enabled=true;
picBatAuto.Visible=false;
picBatAtk2.Visible=true;
p1能量=0;
prgP1Bar.Value=0;
pgrHpP2.Value=pgrHpP2.Value-25;
}
(每种情况重复)
虽然我不会说这是一段出色的代码,但现在它更容易阅读,更重要的是,调试也更容易
此代码可能会得到显著改进,以提高效率。但由于不了解您的详细计划,因此很难提出更多建议。另外,作为初学者,这可能就足够了。因为这是一个学校项目,所以你首先需要学习,如果你出现了惊人的代码,那么很明显你还没有编码
一天结束时,尽管你可以花很多时间设计一个漂亮的系统,但最终的结果可能并不值得在每种情况下付出努力,特别是对于私人项目,你可能是唯一一个从事这项工作的人,永远也不会或几乎不会改变它。好吧,代码
if(e.KeyCode==Keys.S)
在if(e.KeyCode==Keys.D)
的范围内。如果可以,我建议修改代码以避免太多缩进。这导致了类似这样的问题。也许将每个玩家的动作移动到一个方法中,在这些方法中,一次只能按一个键,一旦你处理了这个键,return
。这会让你的代码更具可读性,并且可能会给你一个更好的分数:)一旦你做到了这一点,你可以查看每一段代码——是否有重复的代码片段,它们本身可能是方法?如果(p1Energy>=10)-so如果(p1Energy<10)
你按什么键都不重要,所以你可以在看按键之前检查一下。你可以通过。有用的提示来解决这个问题和许多其他问题。折叠方法。CTRL+M+O组合以折叠所有方法,并更好地了解其他方法中的所有嵌套方法。第一个IF语句总是说IF==key是D。当它是另一个键时,就没有其他值了。所以基本上代码是这样的,如果key是D,然后如果key是S,这可能永远不会发生在同一行上。