TIL

TIL - 전투 RPG게임 (코드 개선)

hamiric 2024. 11. 5. 17:21

## 해당 TIL은 주어진 과제를 수행하면서 얻은 학습 내용과, 시행착오 등등을 종합해서 작성한것임

1. 함수의 매개변수 줄이기

매개변수로써 객체를 넘긴다는 것은, 객체가 복사될 수 있는 위험성이 존재할 뿐만 아니라, 함수 내부에서 객체를 수정하는지에 대한 모호함이 있을 수 있으므로, 정말로 필요한 때가 아니면 되도록 쓰지 않는게 좋다.

개선한 코드들은, 객체에 직접 접근할 수 있음에도 불구하고 매개변수로 넘기고 있던 코드들을 멤버함수에서 처리하거나, 직접 접근하여 처리하는 걸로 수정하였다. (예시는 간단한것만)

 

< 기존 코드 >

Monster getRandomMonster(List<Monster> mons) {
    int rndmonsidx = Random().nextInt(mons.length);
    battlemonsidx = rndmonsidx;
    return mons[rndmonsidx];
}

 

< 개선 코드 >

Monster getRandomMonster() {
    int rndmonsidx = Random().nextInt(monsterlist.length);
    battlemonsidx = rndmonsidx;
    return monsterlist[rndmonsidx];
}

 

2. 전투시 턴에 대한 고찰 및 개선

수정 전에는 [ 캐릭터턴 ] 과 [ 몬스터턴 ] 이렇게 2개의 턴만을 이용하여, 각각 맞는 타이밍에 배틀이 진행 될 수 있게 했었는데, 도전기능을 추가함에 따라, 기능들이 약간 타이밍이 맞지 않게 전개되는 문제가 발생했다. 따라서 턴을 시작할때의 [ 시작턴 ] 과 전체 턴이 끝났을때의 [ 끝날턴 ] 을 추가로 만들어준 후, 각각에 맞는 기능들을 추가 및 수정해 주었다.

 

< 기존 코드 >

while (true) {
    //...
    switch (turn) {
        case BattleTurn.characterturn:
            print('\n${user.name}의 턴');
            userselectaction(battleMonster);
            turn = BattleTurn.monstertrun;
            break;
        case BattleTurn.monstertrun:
            print('\n${battleMonster.name}의 턴');
            battleMonster.attackCharacter(user);
            showAllStatus(battleMonster);
            turn = BattleTurn.characterturn;
            break;
        }
        if (user.hp <= 0 || battleMonster.hp <= 0) {
            break;
        }
    }
    //...
}

 

< 수정 코드 >

battle:
while (true) {
    // ...
    switch (turn) {
        case BattleTurn.startturn:
            turnnum++;
            print('\n${turnnum}번째 턴입니다!');
            if (turnnum != 1 && turnnum % 3 == 1) { // 4, 7, 10...
                battleMonster.increasedfs();
            }
            turn = BattleTurn.characterturn;
            break;
        case BattleTurn.characterturn:
            print('\n${user.name}의 턴');
            userselectaction(battleMonster);
            turn = BattleTurn.monsterturn;
            break;
        case BattleTurn.monsterturn:
            print('\n${battleMonster.name}의 턴');
            battleMonster.attackCharacter(user);
            turn = BattleTurn.endturn;
            break;
        case BattleTurn.endturn:
            user.decresebuff();
            if (user.hp <= 0 || battleMonster.hp <= 0) {
                break battle;
            }
            showAllStatus(battleMonster);
            turn = BattleTurn.startturn;
            break;
    }
    // ...
}