

何がいけないかを調べたのですが...  
ちゃんと引数も入れてあるのでわかりません。

# エラーの内容

[code]

    TypeError: Cannot read property '2' of undefined
    
[/code]

# コード

[code]

    const board_preference = {0: "＋", 1: "○", 2: "●", 3: "■", 4: "＋"};
    let board = 
    [[0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0],
    [0,0,0,4,3,0,0,0],
    [0,0,4,1,2,3,0,0],
    [0,0,3,2,1,4,0,0],
    [0,0,0,3,4,0,0,0],
    [0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0]];
    
    const user_turn = (user_selection_vertical, user_selection_horizontal) => {
        var user_x = user_selection_vertical;
        var user_y = user_selection_horizontal;
        if (board[user_x][user_y] == 3) {
            board[user_selection_vertical][user_selection_horizontal] = 1;
        }
        let user_turn_flag = true;
        let user_turn_count = 0;
        while (user_turn_flag) {
            user_turn_count++;
            if (!user_x + user_turn_count == 0) {
                if (board[user_x - user_turn_count][user_y] == 2&&board[user_x - (user_turn_count + 1)][user_y] == 1) {
                    changehost(user_x - user_turn_count,user_y,1);
                }
            }
            if (!user_x + user_turn_count == 7) {
                if (board[user_x + user_turn_count][user_y] == 2&&board[user_x +(user_turn_count + 1)][user_y] == 1) {
                    changehost(user_x - user_turn_count,user_y,1);
                }
            }
            if (!user_y + user_turn_count == 0) {
                if (board[user_x][user_y - user_turn_count] == 2&&board[user_x][user_y - (user_turn_count + 1)] == 1) {
                    changehost(user_x - user_turn_count,user_y,1);
                }   
            }
            if (!user_y + user_turn_count == 7) {
                if (board[user_x][user_y + user_turn_count] == 2&&board[user_x][user_y + (user_turn_count + 1)] == 1) {
                    changehost(user_x - user_turn_count,user_y,1);
                }
            }
            if (user_turn_count == 7) {user_turn_flag = false;}
        }
    }
    
    const changehost = (host_selection_vertical, host_selection_horizontal,Human) => {
        let host_x = host_selection_vertical;
        let host_y = host_selection_horizontal;
        board[host_x][host_y] = Human;
    }
    user_turn(4,2);
    console.log(board_display());
    
[/code]


CC BY-SA 4.0
2020-04-12T01:07:59.723
65547
2022-01-20T16:34:15.247
2020-04-12T07:49:35.757
3060
39592
question
javascript node.js
javascriptでのエラーについて: TypeError: Cannot read property '2' of undefined


意図したコードになるために十分であるかは不明確ですが、コードを見て誤っていると指摘できるところは次のとおりです。

**1) ループカウンタ`user_turn_count` の増加タイミング**

`user_turn_count` は `0` 以上 `7` 以下の値を採る想定だと考えますが、このコードだと `whille` ループに入った直後に
`+1` し(、ループの最後で `if (user_turn_count == 7) {user_turn_flag =
false;}`してい)るので、実質 `1` 以上 `7` 以下しか採り得ません。

増加タイミングを `if (user_turn_count == 7) ...` の後にする必要があるかと考えます。

また、今回の場合は、 `while` より
[`for`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/for)
が妥当であると思います。

**2) 演算子の優先順位**

例えば `while` 文中の最初の `if` 文

[code]

    if (!user_x + user_turn_count == 0) {
    
[/code]

は、 "`user_x` と `user_turn_count` を加算した結果が `0` でない場合"を意図していると考えますが、実際には、
"`!user_x` と `user_turn_count` を加算した結果が `0` の場合"となります。

これは、 `==` よりも `!` の方が優先順位が高いためです。  
次のリンク先に説明があります。

  * [演算子の優先順位 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Operator_Precedence)

**3)`if` 評価条件** (演算子の意味)

`while`文中の2つめの`if`文

[code]

    if (!user_x + user_turn_count == 7) {
        if (board[user_x + user_turn_count][user_y] == 2&&board[user_x +(user_turn_count + 1)][user_y] == 1) {
            changehost(user_x - user_turn_count,user_y,1);
        }
    }
    
[/code]

を見ると、`board`配列に指定しているindexは `user_x + user_turn_count` (等)があり、これが `if`
文にも登場していることから、`board`配列のindexが範囲内に収まるようにするための条件判定であると考えられます。

このことから、想定している挙動のコードは、実際には

[code]

    if(user_x + user_turn_count <= 7)
    
[/code]

でしょうか。  
(※ ただしindexに `user_x +(user_turn_count + 1)` も指定しているので上記の指定も正しくはないと考えます)

* * *

以上を考慮すると、次のようなコードになります(冒頭に記載した通り、これで十分かは不明確です):

[code]

    const board_preference = {0: "＋", 1: "○", 2: "●", 3: "■", 4: "＋"};
    let board = 
    [[0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0],
    [0,0,0,4,3,0,0,0],
    [0,0,4,1,2,3,0,0],
    [0,0,3,2,1,4,0,0],
    [0,0,0,3,4,0,0,0],
    [0,0,0,0,0,0,0,0],
    [0,0,0,0,0,0,0,0]];
    
    const user_turn = (user_selection_vertical, user_selection_horizontal) => {
    var user_x = user_selection_vertical;
    var user_y = user_selection_horizontal;
    if (board[user_x][user_y] == 3) {
        board[user_selection_vertical][user_selection_horizontal] = 1;
    }
    let user_turn_flag = true;
    let user_turn_count = 0;
    while (user_turn_flag) {
        if (user_x - user_turn_count > 0) {
            if (board[user_x - user_turn_count][user_y] == 2&&board[user_x - (user_turn_count + 1)][user_y] == 1) {
                changehost(user_x - user_turn_count,user_y,1);
            }
        }
        if (user_x + user_turn_count < 7) {
            if (board[user_x + user_turn_count][user_y] == 2&&board[user_x +(user_turn_count + 1)][user_y] == 1) {
                changehost(user_x - user_turn_count,user_y,1);
            }
        }
        if (user_y - user_turn_count > 0) {
            if (board[user_x][user_y - user_turn_count] == 2&&board[user_x][user_y - (user_turn_count + 1)] == 1) {
                changehost(user_x - user_turn_count,user_y,1);
            }   
        }
        if (user_y + user_turn_count < 7) {
            if (board[user_x][user_y + user_turn_count] == 2&&board[user_x][user_y + (user_turn_count + 1)] == 1) {
                changehost(user_x - user_turn_count,user_y,1);
            }
        }
        if (user_turn_count == 7) {user_turn_flag = false;}
        user_turn_count++;
    }
    }
    
    const changehost = (host_selection_vertical, host_selection_horizontal,Human) => {
    let host_x = host_selection_vertical;
    let host_y = host_selection_horizontal;
    board[host_x][host_y] = Human;
    }
    
    user_turn(4,2);
    console.table(board);
    
[/code]

[コード差分](https://github.com/yukihane/stackoverflow-qa/compare/760f12..0cf8f6b)


CC BY-SA 4.0
2020-04-12T07:24:53.413
65555
2022-01-20T16:34:15.247
2022-01-20T16:34:15.247
2808
2808
65547
answer