카테고리 없음
본캠프 3주차 (4)
jaeoun0238
2024. 11. 14. 20:43
import chalk from 'chalk';
import readlineSync from 'readline-sync';
class Player {
constructor() {
this.hp = 100; // 초기 체력
this.maxHp = 100; // 최대 체력
this.mp = 100;
this.maxMp = 100;
this.baseAttackPower = 10; // 초기 공격력은 10으로 설정
}
getAttackPower(stage) {
const minAttackPower = Math.max(1, stage * 2 - 1); // 최소 공격력
const maxAttackPower = stage === 1 ? 10 : stage * 5; // 1스테이지에서 최대 공격력 10
return Math.floor(Math.random() * (maxAttackPower - minAttackPower + 1)) + minAttackPower; // 범위 내 랜덤 공격력 반환
}
attack(monster, stage) {
const damage = this.getAttackPower(stage); // 스테이지에 따라 공격력 계산
monster.hp -= damage; // 몬스터의 체력 감소
return damage; // 공격한 피해량 반환
}
levelUp() {
this.maxHp += 20; // 최대 체력 증가
this.hp = this.maxHp; // 체력을 최대값으로 회복
}
}
class Monster {
constructor(stage) {
this.hp = 100 + (stage - 1) * 20; // 스테이지에 따라 몬스터 체력 증가
}
getAttackPower(stage) {
const minAttackPower = Math.max(1, stage * 2 - 1); // 최소 공격력
const maxAttackPower = stage === 1 ? 10 : stage * 5; // 1스테이지에서 최대 공격력 10
return Math.floor(Math.random() * (maxAttackPower - minAttackPower + 1)) + minAttackPower; // 범위 내 랜덤 공격력 반환
}
attack(player, stage) {
const damage = this.getAttackPower(stage); // 스테이지에 따라 공격력 계산
player.hp -= damage; // 플레이어의 체력 감소
return damage; // 공격한 피해량 반환
}
}
function displayStatus(stage, player, monster) {
console.log(chalk.magentaBright(`\n=== Current Status ===`));
console.log(
chalk.cyanBright(`| Stage: ${stage} `) +
chalk.blueBright(
`| 플레이어 정보 (HP: ${player.hp}/${player.maxHp}, 기본 공격력: ${player.baseAttackPower})`,
) +
chalk.redBright(
`| 몬스터 정보 (HP: ${monster.hp}) |`,
),
);
console.log(chalk.magentaBright(`=====================\n`));
}
const battle = async (stage, player) => {
const monster = new Monster(stage);
let logs = [];
while (player.hp > 0 && monster.hp > 0) {
console.clear(); // 콘솔지우는 코드
displayStatus(stage, player, monster);
logs.forEach((log) => console.log(log));
console.log(
chalk.green(
`\n1. 공격한다 2. 아무것도 하지않는다. 3. 도망간다. 4. 회피한다. 5. 마법을 사용한다. `,
),
);
const choice = readlineSync.question('당신의 선택은? ');
logs.push(chalk.green(`${choice}를 선택하셨습니다.`));
switch (choice) {
case '1':
const damage = player.attack(monster, stage); // 몬스터에게 공격
logs.push(chalk.green(`플레이어가 몬스터에게 ${damage}의 피해를 주었습니다.`));
console.log(`몬스터의 남은 체력: ${monster.hp}`);
if (monster.hp > 0) {
const monsterDamage = monster.attack(player, stage); // 플레이어에게 공격
logs.push(chalk.red(`몬스터가 플레이어에게 ${monsterDamage}의 피해를 주었습니다.`));
console.log(`플레이어의 남은 체력: ${player.hp}`);
}
break;
case '2':
logs.push(chalk.blue("플레이어가 아무것도 하지 않았습니다."));
break;
case '3':
logs.push(chalk.blue("플레이어가 도망쳤습니다."));
break;
case '4':
logs.push(chalk.blue("플레이어가 회피하였습니다."));
break;
case '5':
logs.push(chalk.blue("플레이어가 마법을 사용하였습니다."));
console.log(`플레이어의 남은 마법 사용 횟수: `);
break;
default:
logs.push(chalk.yellow("잘못된 선택입니다. 다시 선택해주세요."));
break;
}
}
if (player.hp <= 0) {
logs.push(chalk.red("플레이어가 패배했습니다."));
} else if (monster.hp <= 0) {
logs.push(chalk.green("몬스터를 처치했습니다!"));
}
return player.hp > 0; // 플레이어가 살아있으면 true 반환
};
export async function startGame() {
console.clear();
let stage = 1;
let player = new Player();
//let player2 = new Player(); // 플레이어는 한 명만 생성
//console.log(player.hp,player2.hp);
while (true) { // 무한 루프
const isAlive = await battle(stage, player);
if (!isAlive) {
console.log(chalk.red("게임 오버!"));
break; // 플레이어가 패배하면 게임 종료
}
player.levelUp(); // 스테이지가 증가할 때마다 플레이어의 최대 체력 증가 및 체력 회복
stage++; // 스테이지 증가
}
console.log(chalk.green("게임이 종료되었습니다."));
}
프로젝트 하면서 망한것 같다는.. 생각이 들어서 새로 다시 해야할것같다..
기본기가 너무 약해서 다시 한번 정리하기
다항연산자 : !(논리부정), ~(비트부정), + -(부호), ++ -- (증감연산자)
- 산순연산자 : *(곱하기), /(나누기), %(나머지연산자), +(더하기), -(빼기)
- 시프트연산자 : <<, >>, >>>
- 관계연산자 : <, <=, >, >=, ==, !=
- 논리연산자 : 비트논리연산 &, ^, | 일반논리연산 &&, ||
- 조건연산자 : ?, :
- 대입연산자 : =, +=, -=, *=, /=, %=, <<=, >>=, >>>=, &=, ^=, |=
var과 let, const의 차이
1. Var : 중복 선언 가능
var name = 'javascript';
console.log(name); // javascript
var name = 'react';
console.log(name); // react
JavaScript
var 로 선언한 변수는 동일한 이름으로 여러 번 중복해서 선언이 가능함. 이와 같은 경우, 마지막에 할당된 값이 변수에 저장됨. 위의 예제를 보면 에러 없이 각기 다른 값이 출력되는 것을 볼 수 있음.
이는 필요할 때마다 변수를 유연하게 사용할 수 있다는 장점이 될 수도 있지만, 기존에 선언해둔 변수의 존재를 잊고 값을 재할당하는 등의 실수가 발생할 가능성이 큼. 특히 코드량이 많아졌을 때, 같은 이름의 변수명이 여러 번 선언되었다면 어디 부분에서 문제가 발생하는지 파악하기 힘들뿐더러 값이 바뀔 우려가 있음.
이를 보완하기 위해 ES6부터 추가된 변수 선언 방식이 let 과 const 임.
2-1. let : 중복 선언 불가능, 재할당 가능
let name = 'javascript';
console.log(name); // javascript
let name = 'react';
console.log(name);
// Uncaught SyntaxError: Identifier 'name' has already been declared
name = 'vue';
console.log(name); // vue
JavaScript
var 와 다르게 let 은 해당 변수가 이미 선언되었다는 에러 메시지가 출력됨. 이처럼 중복 선언이 불가능함.
name = 'vue' 와 같이 변수 선언 및 초기화 이후 반복해서 다른 값을 재할당 할 수는 있음.
2-2. const : 중복 선언 불가능, 재할당 불가능
const name = 'javascript';
console.log(name); // javascript
const name = 'react';
console.log(name);
// Uncaught SyntaxError: Identifier 'name' has already been declared
name = 'vue';
console.log(name);
// Uncaught TypeError: Assignment to constant variable
JavaScript
let 과 const 의 차이점은 immutable 의 여부임. let 은 변수에 다른 값을 재할당할 수 있지만, const 는 재할당 시 에러 메시지가 출력됨.
function func() {
const list = ["A", "B", "C"]
list = "D";
console.log(list);
// TypeError: Assignment to constant variable
list.push("D");
console.log(list); // ["A", "B", "C", "D"]
}
JavaScript
이처럼 const 는 constant(상수)를 뜻하기 때문에 한 번만 선언이 가능하며 값을 바꿀 수도 없음. 하지만 위 예제와 같이 배열과 오브젝트의 값을 변경하는 것은 가능함.
결과적으로 const 는 불변을 의미하는 것과 다르게, 값을 재할당하는 코드만 불가능하다고 볼 수 있음.
그리고 코드의 흐름을 보는게 가장 중요한데 코드가 어디서부터 실행되고 종료되는지 흐름을 파악하는게 가장 중요하다고 튜터님께 조언을 받았다. 계속해서 복습해보기..
감사합니다 튜터님 ㅜㅜ
<오늘의 정리>
Var : 중복 선언 가능
let : 중복 선언 불가능, 재할당 가능
const : 중복 선언 불가능, 재할당 불가능
코드의 흐름을 잘 파악하기
기본기 다지기