我在visual studio c#中的项目只响应D键,而不响应其他键

我在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) {

下面的代码是用来检测玩家何时按下一个键(a s或d),但它只响应d,我不知道为什么。我对编码相当陌生,这是visual studio c#中的一个学校项目 p1到3检测您正在使用的角色,当您按下按钮时,它会使空闲动画停止(称为自动),只有当您的能量已满时,您才能进行攻击

  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,这可能永远不会发生在同一行上。