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;