Today's Plan
Studying JavaScript knowledge
(1) 이벤트 위임
(2) 브라우저 기본 동작
(3) 커스텀 이벤트 디스패치
Coding JavaScript
(1) Javascript Tic Tac Toe game project 마무리
(2) 깃허브에 업로드하고 내용 정리
Training Coding Test with Python
(1) 백준 코딩 테스트 기출 4문제
(2) 이번 주 코딩 테스트 문제들 전체 다시 풀기
1.
Coding JavaScript
(1) Javascript Tic Tac Toe game project 마무리
1. [4a8f3cc] | Fix: TicTacToe Game App: fix userClickHandler function: make enable to swap player's turn
function userClickHandler(event){
if (event.target.tagName === 'DIV'){
let gridClass = '.'+ event.target.classList[1];
let num = gridClass.charAt(gridClass.length-1);
drawMark(gridClass, num, user['mark']);
user['clicked'].push(num);
if (checkWinner()){
finishGame();
} else {
computerTurn = true;
setTimeout(startGame,500);
}
}
}
function startGame(){
if(computerTurn) playComputer();
if(!computerTurn) playUser();
}
computerTurn 변수에 startGame을 userClickHandler에서 처리하게 했습니다.
사실 사용자 선택 후 다시 startGame을 부르게 하는 과정에서 startGame을 startGame내부에서 호출하는 바람에
콜스택이 터지게 하는 문제가 생겼었습니다.
보드판에 클릭 이벤트 리스너를 등록하는 것을 클릭 이벤트가 발생하는 것으로 순간 착각했기 때문이었습니다.
클릭 이벤트 발생 기점으로 한 사이클이 끝난 것이기 때문에 그 안에 게임 종료조건 검사와 게임 재실행기능까지 수행하도록 수정했습니다.
2. [d344cad] | Fix: TicTacToe Game App: fix draw Mark function: to update notSelected number list by index
function drawMark(gridClass, num, mark){
let grid = document.querySelector(gridClass);
let markingSpan = document.createElement('span');
markingSpan.textContent = mark;
grid.append(markingSpan);
let numIndex = notSelected.indexOf(num);
notSelected.splice(numIndex, 1);
console.log(notSelected);
}
컴퓨터가 랜덤 숫자를 고를 수 있는 옵션을 주기 위해 설정했던 notSelected 리스트가 업데이트되어지도록 했습니다.
여기서도 처음에 실수를 했는데, splice는 인덱스를 기준으로 수행된다는 것을 착각해 값을 그대로 넣어줬기 때문입니다. 하여 해당 값의 인덱스를 구해서 정확하게 그 자리의 값이 사라지도록 완성했습니다.
3. [5be2529] | Feat: TicTacToe Game App: complete checkWinner function
두 배열이 순서와 관계 없이 같은지를 체크해야 했습니다.
let winningSet = [
['0', '1', '2'],
['3', '4', '5'],
['6', '7', '8'],
['0', '3', '6'],
['1', '4', '7'],
['2', '5', '8'],
['0', '4', '8'],
['2', '4', '6']
];
...
function checkWinner(clickedList){
if (clickedList.length < 3){
return false
}
for (set of winningSet){
if (set.every(num => clickedList.indexOf(num) != -1)) {
return true
}
}
return false
}
미리 우승 조건을 배열로 지정해주고 그 조건들에 해당하게 된다면 승리하였다고 알리게 했습니다.
1. 3개가 되지 않는 경우 판별 조건도 성립하지 않기에 불필요한 계산을 줄이기 위해 미리 false를 리턴합니다.
2. checkWinner function안에서 각 winning case배열을 every함수로 돌며,
그 winning case의 모든 값을,
판별당할 플레이어의 선택리스트가 갖고 있는지 여부를 확인했습니다. 맞다면 바로 true를 리턴합니다.
3. 모든 winning case에 속하지 않는 경우 false를 리턴합니다.
every메서드에 대해 확실히 몰라서 forEach처럼 사용했다가 오류가 났었습니다.
every메서드는 모든 아이템에 대해 주어지는 함수의 조건에 참/거짓인지만 판별하는 메서드입니다.
4. [00badda] | Feat: TicTacToe Game App: complete finishGame function
function finishGame(winner){
gameBoard.removeEventListener('click', userClickHandler);
popUpTitle.textContent = (`${winner} win!!`);
switch(winner){
case 'Computer':
popUpMessage.textContent = '';
popUpStrongMessage.textContent = 'I was smarter than you! 😈😈'
break
case 'You':
popUpMessage.textContent = '';
popUpStrongMessage.textContent = 'You were smarter than me! 😻😻'
}
popUp.classList.add("showPopUp");
console.log('finish');
return
}
게임 종료 시의 기능을 작성했습니다.클릭 불가능하게 만들고, 팝업 재활용해 게임 재시작 여부를 묻게 했습니다.
5. [7b6cdf1] | Feat: TicTacToe Game App: add Init function to initialize the game when it is restarted
게임 재시작을 고려해 init 메서드를 추가해 게임 시작 시 게임을 초기화하도록 했습니다.
buttons.addEventListener('click', event =>{
// ...
// popUp.classList.remove("showPopUp");
initGame();
setTimeout(startGame,300);
});
function initGame(){
notSelected = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
user['clicked'] = [];
computer['clicked'] = [];
computerTurn = true;
grids.forEach(grid => grid.textContent = '');
}
: initGame 안에서 초기화할 정보들을 초기화해줍니다.
: 각 칸에 그려진 마킹기호들을 지우기 위해 grids배열에 forEach를 통해 접근해 내용을 빈 문자열로 지정했습니다.
: 게임 버튼 시작과 동시에 그려져 있으면 사용자와 컴퓨터 간의 커뮤니케이션 느낌이 덜한 것 같아 0.3초 후에 컴퓨터가 첫 마킹을 시작하게 했습니다.
6. [912576d] | Style: TicTacToe Game App: add style on grid(box-shadow and hover effect)
더 게임스럽게 보이기 위해 그림자효과를 주고, 반응형으로 만들기 위해 호버이펙트를 추가했습니다.
7. [3d07381] | Feat: TicTacToe Game App: make restart popup if players cannot select any grid
마지막으로 정상적으로 작동하는지 확인하다가 경우의 수를 하나 더 발견했습니다.
아무도 이기는 사람 없이 칸이 다 찬다면, 이도 저도 못하고 끝나버리는 것이었습니다. 따라서 이 경우에 해당하는 경우 게임을 끝내고 재시작 여부 팝업을 띄우게 했습니다.
function checkWinner(clickedList){
// ...
if (user['clicked'].length + computer['clicked'].length == 9){
finishGame('Nobody');
}
return false
}
function finishGame(winner){
// ...
case 'Nobody':
popUpMessage.textContent = '';
popUpStrongMessage.textContent = 'Cannot move 😵 Try Again 😟'
}
popUp.classList.add("showPopUp");
console.log('finish');
return
}
8. [7d9ffa3] | Fix: TicTacToe Game App: change code to make clean code
중복되는 코드 제거, 코딩 중 디버깅을 위한 console.log("xxx") 제거, 공백 정리, 변수/함수 위치 조정을 했습니다.
(2) 깃허브에 업로드하고 내용 정리
2.
모던 JavaScript 튜토리얼
ko.javascript.info
이벤트 기초
1. 이벤트 위임
2. 브라우저 기본 동작
3. 커스텀 이벤트 디스패치
UI이벤트
1. 마우스 이벤트
2. Moving the mouse: mouseover/out, mouseenter/leave
3. 드래그 드롭 앤 마우스 이벤트
4. Pointer events
3.
Training Coding Test with Python
https://proprotrainee.tistory.com/87
[ BOJ ] 15649 N과 M
proprotrainee.tistory.com
https://proprotrainee.tistory.com/88
[ BOJ / 파이썬] 1926 그림
/ 제출 1 / from collections import deque #세로, 가로 n, m = map(int, input().split()) board = [list(map(int, input().split())) for _ in range(n)] dx = [1, 0, -1, 0] dy = [0, -1, 0, 1] visited = [[Fa..
proprotrainee.tistory.com
https://proprotrainee.tistory.com/89
[ BOJ / 파이썬 ] 미로 탐색
/ 제출 1 / 첫 제출에 틀렸습니다. 가 나와서 당황했었다. 잘 .. 한 것 같은데 뭐지.. 복사하면서 줄 바꿈 등이 잘 못 옮겨졌었던 것이었습니다. 동일 소스코드를 줄정렬한 것이 아래 코드입니다. /
proprotrainee.tistory.com
https://proprotrainee.tistory.com/90
[ BOJ / 파이썬 ] 7576 토마토
/ 풀이 1 / from collections import deque m, n = map(int, input().split()) tomatoes = [list(map(int, input().split())) for _ in range(n)] dx = [0, 0, -1, 1] dy = [-1, 1, 0, 0] ripped = [[False] * m f..
proprotrainee.tistory.com
'Intro > Daily Study Note' 카테고리의 다른 글
[220725] Daily Study Note (0) | 2022.07.26 |
---|---|
[ 모던 JavaScript 튜토리얼 ] 학습 진도 파트2. 브라우저:문서,이벤트, 인터페이스 (0) | 2022.07.25 |
[220721] Daily Study Note (0) | 2022.07.21 |
[220720] Daily Study Note (0) | 2022.07.20 |
[220719] Daily Study Note (0) | 2022.07.19 |