Project_xxx

[Project_] FO - 1

wakelight23 2024. 12. 3. 21:26

Futsal Online Project (풋살 온라인 프로젝트)

● 게임 플레이를 어떻게 구현해야할까?

- 풋살 온라인이라고는 했지만 공부한 내용을 적용해보는 실습이다

- 팀 프로젝트이며 각 맡은 파트 별로 구현하는 게 다르다

- 내가 맡은 부분은 게임 플레이인데 어떤 식으로 구현을 해야할까?

 

1. 카드 대결 게임 형식으로 구현

- 자신의 인벤토리(TeamMember)에서 능력치를 합산할 선수 3명을 선택
- 선택된 3명의 선수들의 능력치 합산 = '전투력'

- 각 선수들의 능력치에 설정한 가중치 더해서 전투력에 대한 차별점
- 랜덤 수 하나를 뽑아서 승률 비교로 승/패 결정

- 플레이한 게임 내용 기록

 

 

2. 구현한 코드

- 선수 3명의 능력치 합산하는 함수

function calculateTeamPower(selectedPlayers) {
  return selectedPlayers.reduce((total, member) => {
    // 각 능력치 가중치 적용 -> 이 부분 적용할지 안 할지 미정
    // 이쪽 부분은 임의 수치 설정 가능
    const powerScore =
      (speed * 1.2) +          // 스피드: 20% 추가
      (goalFinishing * 1.5) +  // 골 결정력: 50% 추가
      (shootPower * 1.3) +     // 슛파워: 30% 추가
      (defense * 1.1) +        // 수비력: 10% 추가
      (stamina * 1.0);         // 스태미나: 기본

    // 강화 레벨 보너스 (레벨당 5% 추가)
    // 데이터 테이블에 저장된 upgrade의 수치에 따라 5%씩 각 능력치에 가중치 적용
    const upgradeBonus = 1 + (member.upgrade * 0.05);

    return total + (powerScore * upgradeBonus);
  }, 0);

 

- myPower : 3명의 능력치를 합산하는 과정

// myPower 계산 예시
const player = {
  speed: 90,        // 90 * 1.2 = 108
  goalFinishing: 85, // 85 * 1.5 = 127.5
  shootPower: 88,   // 88 * 1.3 = 114.4
  defense: 75,      // 75 * 1.1 = 82.5
  stamina: 80       // 80 * 1.0 = 80
};
const upgrade = 2; // 강화 레벨 2 (10% 보너스)
const powerScore = 108 + 127.5 + 114.4 + 82.5 + 80 = 512.4
const myPower = powerScore * (1 + (2 * 0.05)) = 512.4 * 1.1 = 563.64

// opponentPower 계산
const minPower = 563.64 * 0.8 = 450.91
const maxPower = 563.64 * 1.2 = 676.37
const opponentPower = 랜덤값(450.91 ~ 676.37)

 

- 승패 결정 과정

function determineWinner(myPower, opponentPower) {
  // 승률 계산 예시
  const powerDiff = myPower - opponentPower;
  // 예: myPower = 600, opponentPower = 500
  // powerDiff = 100

  const winProbability = 0.5 + (powerDiff / (myPower + opponentPower)) * 0.5;
  // 예: 0.5 + (100 / 1100) * 0.5 = 0.545 (54.5% 승률)

  const randomFactor = Math.random(); // 0~1 사이 랜덤값
  // 예: randomFactor = 0.4

  const isWin = randomFactor < winProbability;
  // 0.4 < 0.545 이므로 승리

 

- 게임이 진행되면서 나오는 값들 정리

myPower: 563.64
opponentPower: 520.00
powerDiff: 43.64
winProbability: 52.3%
randomFactor: 0.4
결과: 승리 (randomFactor < winProbability)

 

 

● 개선할 점

 - 게임 플레이 방식을 구현하긴 했지만 단조로운 느낌이 든다.
 - 한 가지의 방법만이 아닌 여러가지의 방법으로 게임 플레이를 구현해야할 듯 하다.