Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

rabbit97 님의 블로그

22일 일지 본문

개발 일지

22일 일지

rabbit97 2024. 8. 22. 20:15

일단 새벽부터 정말 많은 일이 있었다..

로그가 자꾸 출력되지 않아서 이걸 해결 못하면 잠은 없다 선언하고 열심히 위치도 옮겨보고 별에 별걸 다 했을때쯤이미 시간이 많이 지나갔고

잠을 얼마 자지 못한 채 그대로 씻기만 하고 출석하기..

1시간 알고리즘(정신과 수련의 시간)의 시간을 가지고 10시쯤 강의가 있었는데

매 주 화 목요일 오전 10시 반부터 문승현 튜터님이 컴퓨터 공학과 관련된 내용의 수업을 강의를 해주신다고 한다.

안그래도 이대로만 가면 코딩만 공부한 취미생과 다른 점이 없어 따로 공부를 해야하나 했는데 다행이다.

 

이렇게 오전 발제가 끝나고 바로 개인 과제!!

 

하지만 어제는 하나하나 기록하면서 만들었는데 무슨 정신인지 기록을 안하면서 이것저것 바꿨다..

최대한 기억나는대로 적기!!

 

import chalk from 'chalk';
import readlineSync from 'readline-sync';

class Player {
constructor(player) {
this.name = '';
this.hp = 100;
this.attacks = 10;
this.defense = 5;
this.speed = 8;
this.inventory = [];
}

equip(item) {
this.inventory.push(item);
}

attack(monster, logs) {
const critical = 0.1;
const Cri = Math.random() < critical;

const damage = this.attacks - monster.defense;
const finalDamage = Cri ? damage * 2 : damage;

monster.hp -= finalDamage > 0 ? finalDamage : 1;

logs.push(chalk.green(`${this.name}${finalDamage}${Cri ? ' (크리티컬!)' : ''} 쌘 공격!`));
}
}

class Monster {
constructor(stage) {
this.hp = stage * 10;
this.attacks = stage * 5;
this.defense = stage * 3;
this.speed = stage * 5;
this.name = `몬스터${stage}`;
}
attack(player) {
const damage = this.attacks - player.defense;
player.hp -= damage > 0 ? damage : 10;
console.log(`${this.name}${damage} 공격!`);
return damage;
}
}

function displayStatus(stage, player, monster) {
console.log(chalk.magentaBright(`\n=== Current Status ===\n`));
console.log(
chalk.cyanBright(`\n | Stage: ${stage} \n`) +
chalk.blueBright(
`\n | 플레이어 정보 | 체력 ${player.hp} | 공격력 ${player.attacks} | 방어력 ${player.defense} | 스피드 ${player.speed} | 장비 ${player.inventory} \n`,
) +
chalk.redBright(
`\n | 몬스터 정보 | 체력 ${monster.hp} | 공격력 ${monster.attacks} | 방어력 ${monster.defense} | 스피드 ${monster.speed} \n`,
),
);
console.log(chalk.magentaBright(`\n=====================\n`));
}

function Turn(player, monster) {
const speedy = player.speed - monster.speed;
const probability = 0.5 + speedy * 0.1;

return Math.random() < probability ? 'player' : 'monster';
}

const battle = async (stage, player, monster) => {
let logs = [];
let turn = 0;
while (player.hp > 0 && monster.hp > 0) {
console.clear();
displayStatus(stage, player, monster);

logs.forEach((log) => console.log(log));

const turns = Turn(player, monster);
console.log(`턴: ${turns}`);

if (turn === 0) {
console.log(chalk.green(`\n1. 공격한다 2. 아무것도 하지않는다.`));
const choice = readlineSync.question(chalk.bgGray('선택'));

logs.push(chalk.green(`**** ${choice}를 선택 ****`));

switch (choice) {
case '1':
player.attack(monster, logs);
break;
}

if (monster.hp <= 0) {
console.log(`${monster.name} 처치!! 다음 스테이지!`);
player.hp += 50;
console.log(` 체력이 50 증가 !! 현재 체력 : ${player.hp} `);
logs.push(chalk.green(`${player.name}${player.attacks} 공격!`));

break;
}
} else {
console.log(chalk.red(`${monster.name}의 턴.`));
const damage = monster.attack(player);
logs.push(chalk.red(`${monster.name} ${damage} 공격!`));

if (monster.hp > 0) {
logs.push(chalk.red(` 몬스터 공격 후 플레이어 체력 : ${player.hp}`));
} else {
console.log('몬스터의 체력이 0 이하입니다.');
}
if (player.hp <= 0) {
console.log(`으악`);
break;
}
}
turn = (turn + 1) % 2;
}
};

export async function startGame() {
console.clear();
const player = new Player();
let stage = 1;

while (stage <= 10) {
const monster = new Monster(stage);
await battle(stage, player, monster);

stage++;
}
}

일단 어제와 추가된 점은 첫번째로 로그와 관련된 내용이다.

아무리 위치를 바꿔도 로그가 안나타나는 이유를 몰라 검색을 좀 많이 했는데 결국 구조를 이해하지 못한 나의 잘못이였고...

일단 해결은 해야하기에 이 위치 저 위치 바꿔보면서 어째어째 로그는 잘 나오게 되었다.

두번째는 클래스 안에 스피드 능력치를 넣고 스피드에 따른 턴을 부여하는 것!

원래는 무조건 1번을 누르면 내가 먼저 때리고 맞는 형식인데 이제 객체 안의 스피드의 값에 따라 누가 먼저 때릴지 결정한다.

 

따로 스킬을 넣고 싶은데 이미 이렇게 설계를 해놔가지고 공격을 하면 일정 확률로 스킬이 나가게끔 할 예정

이건 아직 코드를 보면 아이템 장비창만 만들어 놓고 손을 안댄걸 볼 수 있는데 여기에 장비를 장착하면 특정 스킬의 확률이랑 스피드를 올리는 로직을 구현 할 예정이다.

세번째는 크리티컬 확률! 턴으로 확률과 관련된 내용을 넣다보니 응용해서 크리티컬도 넣었다. 기본적으로 공격할 때 발동하는 함수인 어택 안에다가 일정확률로 데미지가 2배로 올라가는 로직을 넣었다.

그리고 필수 구현 내용을 확인하다가 스테이지가 넘어가면 체력이 회복하게끔 하라고 하셔서 스테이지++가 실행되면 넣을까 하다가 몬스터 체력이 0이 되면 먼저 실행을 하고 스테이지가 넘어가는 방식으로 작성했다.

 

여기까지가 어제부터 계속 수정한 결과인데 아직은 에러가 안뜬다.

내일까지 할 목록은 스킬과 장비 이 두가지만 하면 과제는 얼추 끝날 것 같다.

그냥 구현만 하고 제출하면 성의가 없으니 최대한 글씨 색갈도 바꾸고 로그도 최종적으로 잘 나오게 수정 할 예정
> 로그가 제일 문제다.

'개발 일지' 카테고리의 다른 글

24일 일지  (0) 2024.08.25
23일 일지  (0) 2024.08.23
21일 일지  (0) 2024.08.21
20일 일지  (0) 2024.08.20
19일 일지  (0) 2024.08.19