Framework/react

[리액트 틱택토 게임 응용하기] part 1_1 6*6 판에서 3개만 이어져도 승리하게 만들기

딸기뚜왈기 2024. 6. 13. 09:31

1. 6*6 판에서 3개만 이어져도 승리하게 만들기

 

 

1. 6*6 판에서 3개만 이어져도 승리하게 만들기

 

// 보드 크기를 받아서 승리 조건을 생성하는 함수
function generateWinningLines(boardSize) {
    const lines = [];
    const boardWinsize = boardSize-3
   

    // 가로 승리 조건 추가
    for (let row = 0; row < boardSize; row++) {
        for (let col = 0; col < boardWinsize; col++) {
            const horizontalLine = [];
            for (let j = 0; j < boardWinsize; j++) {
                horizontalLine.push(row * boardSize + col + j);
        }
        lines.push(horizontalLine);
    }
}

    // 세로 승리 조건 추가
    for (let col = 0; col < boardSize; col++) {
        for (let row = 0; row < boardWinsize; row++) {
            const verticalLine = [];
            for (let y = 0; y < boardWinsize; y++) {
                verticalLine.push((row + y) * boardSize + col);
        }
        lines.push(verticalLine);
    }
}
//[0(0*6),6(1*2),12][1(0*6+1),7(1*6+1),13(2*6+1)]
//[6(1*6),12,18][7(1*6+ 1).13(2*6+1).19(3*6+1)][8((1*6+ 0 + 2)),14(2*6+ 0 + 2),20(3*6+ 0 + 2),]
//[12(2*6),18,24][13,19,25]
//[18(3*6),24,30][25,31,37]
    // 대각선 승리 조건 추가
   
    for (let row = 0; row < boardSize-2; row++) {
        for (let x = 0; x < (boardWinsize + 1) ; x++) {
            const diagonal1 = [];
            const diagonal2 = [];
            for (let y = 0; y < boardWinsize; y++) {
                console.log(row, 'x:',x,'y:',y, (row + y) * boardSize + x + y + row,(row + y) * boardSize + (boardSize - x - 1))
                diagonal1.push((row + y) * boardSize + x + y );
                diagonal2.push((row + y) * boardSize + (boardSize -x -y -1));

            // row = 0, x = 1, y = 0 / 4  0 + 4
            // row = 0, x = 1, y = 1 / 10 ->9  6 + 3
            // row = 0, x = 1, y = 2 / 16 ->14  12 + 2

            // row = 2, x = 2, y = 0 / 15 ->15  12 + 3
            // row = 2, x = 2, y = 1 / 21 ->20  18 + 2
            // row = 2, x = 2, y = 2 / 27 ->25  24 + 1
//-            
            //row = 0 x = 0 y = 0 0
            //row = 0 x = 0 y = 1 7
            //row = 0 x = 0 y = 2 14

            //row = 2 x = 0 y = 0 14->12 12 + 0
            //row = 2 x = 0 y = 1 21->19 18 + 1
            //row = 2 x = 0 y = 2 28->26 24 + 2

            //row = 3 x = 1 y = 0 22->19  18 + 1
            //row = 3 x = 1 y = 1 29->26  24 + 2
            //row = 3 x = 1 y = 2 36->33  30 + 3

            //26
            //33

           
        }
        lines.push(diagonal1);
        lines.push(diagonal2);
   
    }
   
    }
// 18((3+0)18+0) 25((3+1)24+1) 32((3+2)30+2)    
// 7(6+(1+0+0)1) 14(12+(1+0+1)2) 21(18+(1+0+2)3)
// 8(6+(1+1+0)2) 15(12+(1+1+1)3) 22(18+(1+1+2)4)
// 17((2+0)12 +(6-0-1)5) 22((2+1)18 + (6-1-1)4)  27((2+2)24 + (6-2-1)3)
   

//col + row
    console.log(lines)
    return lines;
   
}

// 승자를 계산하는 함수  수정 전
// function calculateWinner(squares, boardSize) {
//     const lines = generateWinningLines(boardSize);
//     for (let i = 0; i < lines.length; i++) {
//         const line = lines[i];
//         const [a, b, c] = line;
//         if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c]) {
//             return squares[a];
//         }
//     }
//     return null;

// 승자를 계산하는 함수  수정 후
function calculateWinner(squares, boardSize) {
    const lines = generateWinningLines(boardSize);
    for (let i = 0; i < lines.length; i++) {
        const line = lines[i];
        let first = squares[line[0]];
        if (first && line.every(index => squares[index] === first)) {
            return first;
        }
    }
    return null;
}

export default calculateWinner;