241016 TIL - 우주와 알고리즘과 그 무엇

LIHA·2024년 10월 16일
0

내일배움캠프

목록 보기
85/105
post-thumbnail

알고리즘

카드뭉치 문제가 안풀려요😵 - '주인공'이 되는 input이 있을 것

기주 튜터님이 주신 힌트

결국 우리의 문제는 '카드의 단어를 앞부터 가져왔을 때 goal의 문장을 만들 수 있느냐?' 인 것.
매 문제와 입출력 예시에는 주인공이 되는 input이 있다.
cards1, 2 말고 goal을 필두로 쓴다고 생각해보자.

goal이 다 없어질때까지 while문을 도는 것으로 하고, 각 카드뭉치와 goal의 index 0번을 비교해서 같으면 shift로 썰자.
그렇게 썰다보면, 순서가 맞다면 goal 배열이 사라져버릴 것. 그러나 순서가 맞지 않다면 인덱스를 비교했을 때 그 어떤 카드 뭉치의 0번도 goal의 0번과 같지 않을 것이다. 그러면 바로 while문에 break를 걸어주고 유유히 떠나는 것으로 하자.

-> 이 방법대로 했더니 무난히 풀렸다. 역시 기주 튜터님의 은총 🤩


defense our universe

내가 하고 있던 건 - 여전히 몬스터 처치 핸들러 만지는 중

그래서 내가 하고싶은 건?

  • 몬스터 잡으면 골드와 스코어를 얻는다
  • 몬스터 레벨을 받아 저장된 스코어가 2000의 배수면 레벨을 올려준다

-> 이러려면 클라의 점수를 받아 서버단에서 더해주고 서버단 스코어에 저장한 뒤
-> 그 서버단의 스코어를 다시 클라로 뿌려주고 싶은데
이게 맞나?🤔

-> 아니다. 내 로직에서는 서버단의 스코어를 다시 뿌려줄 필요까지는 없고, 클라단에서 올라온 스코어를 서버단의 검증로직으로 돌려서 올바르게 취득한 점수인지 보면 된다. 공룡점프에서도 저장한 점수를 다시 뿌려주진 않았다.
이건 내가 로직 자체를 잘못 이해한 것.
호영 튜터님이 말씀해주신 '서버는 항상 검증하는 애' 를 잊지말고 생각해보자.

공룡점프 핸들러 안에서 다른 핸들러를 불러오는 모습은 없었다 - 일단 이 안에서 해결하자

몬스터 처치 핸들러 안에서 score 핸들러를 불러와 한번에 돌아가도록 할까? 라는 생각도 했었는데, 핸들러 안에서 핸들러를 불러오는 모습은 보지 못했다. 그렇다면 방법은 두 가지.

  1. 점수 로직까지 몬스터 처치 핸들러 안에서 다 해결하자.
  2. 점수 핸들러 따로 만들고 클라단에서 몹 처치 시 2개의 sendEvent를 하자.

나는 일단 1번을 선택했다.

아니 왜 점수 저장이 안돼? -> 스테이지 시작 시에 initializeScore 메서드를 불러오지 않았다.

왜 Invalid monster info가 나오지? -> id를 받아와야 하는데 0번이 찍힌다

몬스터가 정상 스폰도 되고 잡히기도 하고 골드며 뭐며 다 주는데 서버단에서 Invalid monster info가 떴다.
콘솔도 찍고 페이로드도 찍어보니 monsterId가 문제였다. 저게 실제 json파일의 monsterId가 아닌 것 같았다.
monsters 배열이 monsterNumber 라는걸 갖고 있었는데, 이 값은 과연 뭘까? 다시 한번 역추적 해봐야겠다.

monsterNumber는 monster.js 안에 있었는데, monster.json에서 data의 인덱스 넘버를 랜덤으로 뽑아주는 것 같았다.
즉, id를 얻고 싶으면 여기에 + 1을 해줘야 하는 셈.

+1 로 수정해줘보자.

만세! 잘 나온다.

sendEvent를 두번 하는 것 보다, 핸들러 안에서 핸들러를 부르는게 맞다 - 유정 튜터님의 조언

적 처치 핸들러에서 아래 기능들을 구현하고 싶었는데 고민이 생겼다.

  • 점수를 더해준다 -> 완료
  • 골드를 더해준다 -> 완료
  • 점수가 일정 값 이상이면 스테이지를 이동해준다 -> 얘 어떻게 처리하지???

sendEvent를 하나 더 보낼지 핸들러 안에 핸들러를 넣을 지 고민하다 질문을 드렸는데, 핸들러 안에 핸들러를 부르는게 맞다고 알려주셨다. 여기서의 핸들러는 하나의 API라고 보는게 맞다고.

그렇다면 나는 moveStageHandler를 여기다 불러서 userId와 stage를 받아가 스테이지를 이동해주는 것으로.

초기 골드가 왜 안 불러와지지? - 변수명을 맞춰주지 않았다

-> game.js에서 userGold 라는 이름으로 선언되어 있었는데 내가 그냥 gold로 받아서 payload에서 읽어오질 못했다.
userGold로 고쳐주니 정상적으로 받아왔다.

야호.

initializeTower를 어떻게 설정하면 좋을까?

스테이지 별 타워 설치 상한을 두고 싶은데 - stage.json에 정보를 두고 불러오면 좋을 듯

placeNEwTower() 함수에 tower.length로 조건을 걸고 스테이지별 설치 상한 갯수를 불러와, 현재 타워 수가 그 값이라면 alert로 타워 설치 상한이라고 알려주면 좋을 것 같다. 이건 그냥 생각만 하는 것이니 필수가 구현되고 나면 다시 고민하는 걸로🤔


타워디펜스 발표회

피드백 모음

컨트롤러와 라우터는 뭐가 다를까? 🤔

멀티 플레이일 때 한명만 튕기면 어떻게 될까?

레디스는 어차피 인메모리 방식의 DB라서 연결이 끊기면 다 날아간다. 싱글 플레이라면 상관 없다. 그런데 멀티 플레이어일 때 한 유저만 튕겼다가 다시 들어오면 그땐 어떻게 해야될까? 이런 걸 생각해보면 좋다.

게임 디자인 데이터는 소스코드 만큼이나 유출되면 안되는 보안 사항이다

그러니 JSON으로 저장하는 것도 좋지만 보안 유출에도 유의해야 한다.
그리고 드래그앤 드롭으로 놓는다고 할때 같은 위치에 놓지 못하도록 방어 로직이 있는지? 방어 로직이 항상 중요하다.

캐시에서 세션 관리 하는 것은 시도해보면 좋다

parse나 stringify를 너무 자주 쓰는 건 권장되지는 않는다

트러블 슈팅 기록 모음

템플릿 리터럴로 변수를 불러올 경우 Object object로 나온다. 그냥 따옴표와 쉼표로 하니 출력되었다

동시 접속 방지를 위한 캐시 플레이어 정보 삭제 - 캐시 데이터 만료시간을 짧게, 게임 스테이지를 짧게.

socket.once 라는 것이 있다

페어 프로그래밍을 하면 좋다. VS Code 익스텐션에 Live Share 라는 게 있다

profile
갑자기 왜 춤춰?

0개의 댓글