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;
'Framework > react' 카테고리의 다른 글
[리액트] map으로 배열 렌더링하기 (1) | 2024.06.13 |
---|---|
함수형 컴포넌트 클래스형 컴포넌트 선언 , 사용해보기 (feat.CodeSandbox) (0) | 2024.06.13 |
[react 틱택토 게임]React에서의 onClick 이벤트 처리와 함수 전달에 관한 주의사항 (0) | 2024.06.04 |
리액트 버튼 여러개 만들기 css 적용하기 (0) | 2024.06.01 |
boardSize에 따라 동적으로 승자를 계산할 수 있도록 수정 (0) | 2024.05.29 |