결국 우리의 문제는 '카드의 단어를 앞부터 가져왔을 때 goal의 문장을 만들 수 있느냐?' 인 것.
매 문제와 입출력 예시에는 주인공이 되는 input이 있다.
cards1, 2 말고 goal을 필두로 쓴다고 생각해보자.
goal이 다 없어질때까지 while문을 도는 것으로 하고, 각 카드뭉치와 goal의 index 0번을 비교해서 같으면 shift로 썰자.
그렇게 썰다보면, 순서가 맞다면 goal 배열이 사라져버릴 것. 그러나 순서가 맞지 않다면 인덱스를 비교했을 때 그 어떤 카드 뭉치의 0번도 goal의 0번과 같지 않을 것이다. 그러면 바로 while문에 break를 걸어주고 유유히 떠나는 것으로 하자.
-> 이 방법대로 했더니 무난히 풀렸다. 역시 기주 튜터님의 은총 🤩
-> 이러려면 클라의 점수를 받아 서버단에서 더해주고 서버단 스코어에 저장한 뒤
-> 그 서버단의 스코어를 다시 클라로 뿌려주고 싶은데
이게 맞나?🤔
-> 아니다. 내 로직에서는 서버단의 스코어를 다시 뿌려줄 필요까지는 없고, 클라단에서 올라온 스코어를 서버단의 검증로직으로 돌려서 올바르게 취득한 점수인지 보면 된다. 공룡점프에서도 저장한 점수를 다시 뿌려주진 않았다.
이건 내가 로직 자체를 잘못 이해한 것.
호영 튜터님이 말씀해주신 '서버는 항상 검증하는 애' 를 잊지말고 생각해보자.
몬스터 처치 핸들러 안에서 score 핸들러를 불러와 한번에 돌아가도록 할까? 라는 생각도 했었는데, 핸들러 안에서 핸들러를 불러오는 모습은 보지 못했다. 그렇다면 방법은 두 가지.
- 점수 로직까지 몬스터 처치 핸들러 안에서 다 해결하자.
- 점수 핸들러 따로 만들고 클라단에서 몹 처치 시 2개의 sendEvent를 하자.
나는 일단 1번을 선택했다.
몬스터가 정상 스폰도 되고 잡히기도 하고 골드며 뭐며 다 주는데 서버단에서 Invalid monster info가 떴다.
콘솔도 찍고 페이로드도 찍어보니 monsterId가 문제였다. 저게 실제 json파일의 monsterId가 아닌 것 같았다.
monsters 배열이 monsterNumber 라는걸 갖고 있었는데, 이 값은 과연 뭘까? 다시 한번 역추적 해봐야겠다.
monsterNumber는 monster.js 안에 있었는데, monster.json에서 data의 인덱스 넘버
를 랜덤으로 뽑아주는 것 같았다.
즉, id를 얻고 싶으면 여기에 + 1을 해줘야 하는 셈.
+1 로 수정해줘보자.
만세! 잘 나온다.
적 처치 핸들러에서 아래 기능들을 구현하고 싶었는데 고민이 생겼다.
sendEvent를 하나 더 보낼지 핸들러 안에 핸들러를 넣을 지 고민하다 질문을 드렸는데, 핸들러 안에 핸들러를 부르는게 맞다고 알려주셨다. 여기서의 핸들러는 하나의 API라고 보는게 맞다고.
그렇다면 나는 moveStageHandler를 여기다 불러서 userId와 stage를 받아가 스테이지를 이동해주는 것으로.
-> game.js에서 userGold 라는 이름으로 선언되어 있었는데 내가 그냥 gold로 받아서 payload에서 읽어오질 못했다.
userGold로 고쳐주니 정상적으로 받아왔다.
야호.
placeNEwTower()
함수에 tower.length로 조건을 걸고 스테이지별 설치 상한 갯수를 불러와, 현재 타워 수가 그 값이라면 alert로 타워 설치 상한이라고 알려주면 좋을 것 같다. 이건 그냥 생각만 하는 것이니 필수가 구현되고 나면 다시 고민하는 걸로🤔
레디스는 어차피 인메모리 방식의 DB라서 연결이 끊기면 다 날아간다. 싱글 플레이라면 상관 없다. 그런데 멀티 플레이어일 때 한 유저만 튕겼다가 다시 들어오면 그땐 어떻게 해야될까? 이런 걸 생각해보면 좋다.
그러니 JSON으로 저장하는 것도 좋지만 보안 유출에도 유의해야 한다.
그리고 드래그앤 드롭으로 놓는다고 할때 같은 위치에 놓지 못하도록 방어 로직이 있는지? 방어 로직이 항상 중요하다.