데일리 공부 기록

hands on vue - 게임만들기 2

탐훈 2023. 3. 2. 23:31
728x90

1. Special Attack은 3라운드 마다 쓸 수 있다. 

v-bind:diabled 속성을 이용하여 3라운드마다 쓸 수 있게 하여라

 

수정 전

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vue Basics</title>
    <link
      href="https://fonts.googleapis.com/css2?family=Jost:wght@400;700&display=swap"
      rel="stylesheet"
    />
    <link rel="stylesheet" href="styles.css" />
    <script src="https://unpkg.com/vue@next" defer></script>
    <script src="app.js" defer></script>
  </head>
  <body>
    <header>
      <h1>Monster Slayer</h1>
    </header>
    <div id="game">
      <section id="monster" class="container">
        <h2>Monster Health</h2>
        <div class="healthbar">
          <!-- 방법1 -->
          <!-- <div class="healthbar__value" v-bind:style="{width:userHealth + '%'}"></div> -->
          <!-- 방법2 -->
          <div class="healthbar__value" v-bind:style="monsterHealthBar"></div>
        </div>
      </section>
      <section id="player" class="container">
        <h2>Your Health</h2>
        <div class="healthbar"> 
          <!-- 방법1 -->
          <!-- <div class="healthbar__value" v-bind:style="{width:monsterHealth + '%'}"></div> -->
          <!-- 방법2 -->
          <div class="healthbar__value" v-bind:style="yourHealthBar"></div>
        </div>
      </section>
      <section id="controls">
        <button v-on:click="attackMonster">ATTACK</button>
        <button>SPECIAL ATTACK</button>
        <button>HEAL</button>
        <button>SURRENDER</button>
      </section>
      <section id="log" class="container">
        <h2>Battle Log</h2>
        <ul></ul>
      </section>
    </div>
  </body>
</html>
const app = Vue.createApp({
    data: function(){
        return{
            userHealth: 100,
            monsterHealth: 100,
        }
    },
    methods: {
        attackMonster(){
            const attackValue = Math.random() * 10;
            this.monsterHealth -= attackValue;
            if(this.monsterHealth < 0){
                this.monsterHealth = 0;
            }
            this.attackUser();
        },
        attackUser(){   
            const attackValue = Math.random() * 15;
            this.userHealth -= attackValue;
            if(this.userHealth < 0){
                this.userHealth = 0;
            }
        },
    },
    computed: {
        monsterHealthBar(){
            return {width:this.monsterHealth + '%'};
        },
        yourHealthBar(){
            return {width:this.userHealth + '%'};
        }
    },
}).mount('#game');

 

수정 후

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Vue Basics</title>
    <link
      href="https://fonts.googleapis.com/css2?family=Jost:wght@400;700&display=swap"
      rel="stylesheet"
    />
    <link rel="stylesheet" href="styles.css" />
    <script src="https://unpkg.com/vue@next" defer></script>
    <script src="app.js" defer></script>
  </head>
  <body>
    <header>
      <h1>Monster Slayer</h1>
    </header>
    <div id="game">
      <section id="monster" class="container">
        <h2>Monster Health</h2>
        <div class="healthbar">
          <!-- 방법1 -->
          <!-- <div class="healthbar__value" v-bind:style="{width:userHealth + '%'}"></div> -->
          <!-- 방법2 -->
          <div class="healthbar__value" v-bind:style="monsterHealthBar"></div>
        </div>
      </section>
      <section id="player" class="container">
        <h2>Your Health</h2>
        <div class="healthbar"> 
          <!-- 방법1 -->
          <!-- <div class="healthbar__value" v-bind:style="{width:monsterHealth + '%'}"></div> -->
          <!-- 방법2 -->
          <div class="healthbar__value" v-bind:style="yourHealthBar"></div>
        </div>
      </section>
      <section id="controls">
        <button v-on:click="attackMonster">ATTACK</button>
        <button v-bind:disabled="round % 3 != 0" v-on:click="specialAttack">SPECIAL ATTACK</button>
        <button v-on:click="heal">HEAL</button>
        <button v-on:click="surrender">SURRENDER</button>
      </section>
      <section id="log" class="container">
        <h2>Battle Log</h2>
        <ul></ul>
      </section>
    </div>
  </body>
</html>
const app = Vue.createApp({
    data: function(){
        return{
            userHealth: 100,
            monsterHealth: 100,
            round: 0,
        }
    },
    methods: {
        attackMonster(){
            this.round ++;
            const attackValue = Math.random() * 10;
            this.monsterHealth -= attackValue;
            if(this.monsterHealth < 0){
                this.monsterHealth = 0;
            }
            this.attackUser();
        },
        attackUser(){   
            const attackValue = Math.random() * 15;
            this.userHealth -= attackValue;
            if(this.userHealth < 0){
                this.userHealth = 0;
            }
        },
        specialAttack(){
            this.round++;
            this.monsterHealth -= Math.random() * 18.5;
            this.attackUser();
        },
        heal(){
            this.round++;
            if(this.userHealth + 5 >= 100){
                this.userHealth = 100;
                this.attackUser();  
            }else{
                this.userHealth += 10;
                this.attackUser();
            }
        },
        surrender(){
            this.userHealth = 0;
            alert("Monster Win!");
        }
    },
    watch:{
        userHealth(){
            if(this.userHealth <= 0) {
                this.userHealth = 0;
                alert("Monster win!");
            } else if(this.monsterHealth <=0) {
                this.monsterHealth = 0;
                alert("You Win!");
            }
        }   
    },
    computed: {
        monsterHealthBar(){
            return {width:this.monsterHealth + '%'};
        },
        yourHealthBar(){
            return {width:this.userHealth + '%'};
        }
    },
}).mount('#game');

 

한방에 로직을 짜서 기능이 정상 동작하면 물론 좋겠지만

계속 만들면서 기능을 확인해가며 만드는게 제일 편하다...