2024-11-08 CH-5 팀 과제 (랜덤 타워 디펜스) 트러블 슈팅

MOON·2024년 11월 11일
0

내일배움캠프 과제

목록 보기
31/36

클라이언트에서 테스트 중 타워가 공격을 할때 문제가 발생하였습니다. 한번 공격에 두마리의 몬스터를 공격하는 이상 현상이 나타났습니다.

원인
해당 각각의 유저를 기준으로 몬스터 및 타워의 id를 생성하여 겹치는 현상이 발생하였습니다.

문제의 코드

class User {
  constructor(socket, id) {
    this.socket = socket;
    this.id = id;
    this.sequence = 0;
    this.gameSession;
    this.monsterIdCounter = 1; // 몬스터 id
    this.towerIdCounter = 1; // 타워 id
  }
  
  createMonster(level = null) {
    const monster = new Monster(this.monsterIdCounter++, level);
    this.monsters.push(monster);
    return monster;
  }
  
  createTower(x, y) {
    const tower = new Tower(this.towerIdCounter++, x, y);
    this.towers.push(tower);
    return tower;
  }

1. 해당 유저 마다 1, 2, 3,...등의 순서로 몬스터와 타워 id를 갖게 하였습니다.

2. 각 유저를 기준으로 고유하면 되겠다라고 생각으로 작성하였습니다.

예)

  • 1 플레이어
    • 타워id 1, 타워id 2, 타워id 3
    • 몬스터id 1, 몬스터id 2, 몬스터id 3
  • 2 플레이어
    • 타워id 1, 타워id 2, 타워id 3
    • 몬스터id 1, 몬스터id 2, 몬스터id 3

해결 코드

class User {
  constructor(socket, id) {
    this.socket = socket;
    this.id = id;
    this.sequence = 0;
    this.gameSession;
  }
  
  createMonster(level = null) {
    const monster = new Monster(level);
    this.monsters.push(monster);
    return monster;
  }
  
  createTower(x, y) {
    const tower = new Tower(x, y);
    this.towers.push(tower);
    return tower;
  }
// 몬스터 클래스
let monsterCounter = 0; // 고유한 몬스터 ID 관리

class Monster {
  constructor(level) {
    this.id = this.getMonsterId();
    this.monsterNumber = this.getMonsterNumber(); // 이게 아마 몬스터 타입? (1~5 : 검/파/초/빨/노)
    this.level = level || 1; // 일단 없으면 1로 설정
  }

  getMonsterId() {
    return monsterCounter++;
  }

  getMonsterNumber() {
    const munsterNum = Math.floor(Math.random() * 5) + 1; // 몬스터 5마리네요
    return munsterNum;
  }
}

export default Monster;
// 타워 클래스
let towerCounter = 0;

class Tower {
  constructor(x, y) {
    this.id = this.getTowerId();
    this.x = x;
    this.y = y;
  }

  getTowerId() {
    return towerCounter++;
  }
}

export default Tower;

1. 해당 클래스의 인스턴스를 생성할때 서버기준(전역으로) 완전히 고유한 값을 가지게 만들어 주었습니다. (이것도 uuid를 사용해볼까 했지만 패킷 구조상 id가 숫자형으로 되어있어 간단하게 해보았습니다.)

2. 원래 처음에 이렇게 작성하였다가 위에 2번째 생각으로 수정하였더니 문제가 발생하였던 것이였습니다.

예)

  • 1 플레이어
    • 타워id 1, 타워id 3, 타워id 5
    • 몬스터id 1, 몬스터id 3, 몬스터id 5
  • 2 플레이어
    • 타워id 2, 타워id 4, 타워id 6
    • 몬스터id 2, 몬스터id 4, 몬스터id 6
  • 서로 다른 고유한 id를 가집니다.

결론
해당 몬스터와 타워의 id는 무조건 전역적으로 고유한 값이여야만 해당 클라이언트는 이 값을 가지고 처리할 수 있었던 것 이였습니다.

오늘의 회고

원래 코드가 맞았다?는 것을 뒤늦게나마 알게 되어 다행이였습니다. 계속 수정된 코드가 맞다고만 생각했었던지라 완전히 고유해야 되는구나를 늦게 알아버렸고 테스트를 해보니 확신이 들었습니다. "아..원래 작성한게 맞았구나.." 다음부터는 전에 작성한 코드들도 다시 되집어 보면서 문제를 해결할 것 같네요!!
오늘도 화이팅

profile
안녕하세요

0개의 댓글