在特定索引之前或之后的多个步骤中搜索元素时,索引超出数组范围

Index outside bounds of the array when searching for an element multiple steps before or after a specific index

问题:我正在控制台应用程序中重新创建 Battleship,用户输入的格式为 'letter-number-letter-number' (A1E1)。该程序需要确定第二个字母的索引在加上或减去 4 时是否与第一个字母相同,以验证用户输入的长度是否符合船舶类型。但是,当我的代码运行时,索引超出了数组的范围。

例如,巡洋舰有 5 个空格长。因此,要水平放置 Cruiser,数字必须相同,并且字母必须在 validInputs 数组中彼此相距 4 个元素。

一些输入的工作,例如:A3E3 工作,但是,E3A3 将越界。

public static char[] validInputs = new char[] { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 
    'I', 'J', '1', '2', '3', '4', '5', '6', '7', '8', '9', 't' };                 

if (placementInput[1] - placementInput[3] == 0)
{
    char validInputCheck = placementInput[2];

    // Finds index of the 2nd letter in valid inputs
    int validInputIndex = Array.IndexOf(validInputs, validInputCheck);

    // Validates that the 2nd letter is either 4 steps behind or 
    // ahead of the first letter within the validInputs array. 
    if (placementInput[0] == validInputs[validInputIndex - 4] || 
        placementInput[0] == validInputs[validInputIndex + 4])
    {
        validationCounter++;
        break;
    }

异常意味着您正在尝试访问数组边界之外的索引。

"E3A3" 不起作用的原因是您使用第二个字母进行比较 (validInputCheck = placementInput[2]),而在 "E3A3" 中,该字母是 A.

字母 AvalidInputs 数组中的索引为 0,在您的代码中您尝试获取 validInputs[validInputIndex - 4],其计算结果为 validInputs[-4],这显然在数组边界之外。

"A3E3" 起作用的原因是字母 E 离数组的末端(在索引 4 处)足够远,因此减法和加法不会导致数字超出范围。

为了避免异常,您需要在尝试访问索引之前验证它们是否在数组边界内。

例如:

if ((validInputIndex - 4 > -1 && 
     placementInput[0] == validInputs[validInputIndex - 4]) || 
    (validInputIndex + 4 < validInputs.Length && 
     placementInput[0] == validInputs[validInputIndex + 4]))
{
    validationCounter++;
    break;
}

附带说明一下,通常我们使用相等运算符来确定两个值是否相等,而不是进行数学运算然后比较结果,即:

if (placementInput[1] == placementInput[3])

而不是:

if (placementInput[1] - placementInput[3] == 0)