Java/Daily-Java

[JAVA 복습] 미니게임 WarriorVsMagician (update ver.2)

모모토 2021. 5. 25. 13:17

● 최대한 객체지향에 맞춰서 코드를 변경해보려 했지만, 아직 어디를 더 객체지향적으로 손봐야 할지 감이 오질 않는다.

코드를 바꾸면서 기존에 존재하던 규칙을 바꾸어 보았다. 먼저 기존의 규칙을 살펴보면

 

rule) 플레이어 두 명은 가위바위보를 하여 공격권을 얻어 자신의 플레이어 코드( warrior //player 1 , magician //plater 2)를 입력하면 공격을 한다.

 

개선점

  1. 사용자의 입력에 맞춰서 1/2 확률로 공격을 하도록 하여 현실에서 필요한 가위바위보를 없애며 운 적인 요소도 필요함과 동시에 확률을 단순히 1/2로 맞춰서 비등비등한 긴장감을 자아낼 수 있도록 하였음
  2. 잘못된 명령어 입력 시 재귀 호출을 사용하여 "go"외의 명령어는 허용치 않게 설계

다음에 추가하고 싶은 점

 

전적 기록 시스템을 추가할 계획이 있다. 게임의 전적을 배열을 이용하여 누가 이겼는지를 저장하고 초기화도 가능하도록 코드를 업데이트할 예정

package mygames;

import java.util.Scanner;

abstract class Fightable {
    abstract int attack ();
    abstract boolean guard();
}

class Warrior extends Fightable {
    int HP = 150;
    int guardProperty = 70;
    @Override
    public int attack() {
        return 10;
    }

    @Override
    public boolean guard() {

        int x = (int)(Math.random()*10)+1;

        if(x*10>guardProperty)
            return true;
        else
            return false;
    }

    public String toString(){
        return "Warrior";
    }
}

class Magician extends Fightable {
    int HP = 100;
    int guardProperty = 40;
    @Override
    public int attack() {
        int damage = 40;
        int x = (int) (Math.random() * 10) + 1;
        if(x*10>=85){
            damage+=5;
            this.guardProperty-=10;
            System.out.println("대마법사의 지혜 발동");
            System.out.println("공격력이 증가했다!");
            System.out.println("방어력이 하락했다!");
        }
        return damage;
    }

    @Override
    public boolean guard() {

        int x = (int) (Math.random() * 10) + 1;

        if (x * 10 > guardProperty)
            return true;
        else
            return false;
    }

    public String toString() {
        return "Magician";
    }
}


class Attack {
    Warrior warrior = new Warrior(); //player 1
    Magician magician = new Magician(); //plater 2
    int turn =0;

    public void attackBy(Fightable f) {

        if(f.toString().equals("Magician")){
            if(warrior.guard() && warrior.HP>0){
                turn++;
                System.out.println("턴수 :"+turn+"Magician 공격! , Warrior가 GUARD! 현재체력"+warrior.HP);
                return;
            }
            warrior.HP=warrior.HP - f.attack();
            turn++;
            if(warrior.HP<=0) {
                warrior.HP=0;
                System.out.println("Magician의 마지막 공격!, Warrior의 HP는 "+warrior.HP+", game over , Magician Win");
                //System.out.println("게임을 다시 시작해주세요");
                return;

            }
            System.out.println("턴수 :"+turn+" Magician이 Warrior를 공격");
            System.out.println("남은 체력"+warrior.HP);

        } else if (f.toString().equals("Warrior")){
            if(magician.guard()&&magician.HP>0){
                turn++;
                System.out.println("턴수 :"+turn+"Warrior 공격! , Magician이 GUARD! 현재체력"+magician.HP);
                return;
            }
            magician.HP =magician.HP - f.attack();
            turn++;
            if(magician.HP<=0) {
                magician.HP=0;
                System.out.println("Warrior의 마지막 공격!,Magician 의 HP는 "+magician.HP+",game over , Warrior Win");
                //System.out.println("게임을 다시 시작해주세요");
                return;
            }
            System.out.println("턴수 :"+turn+" Warrior가 Magician를 공격");
            System.out.println("남은 체력"+magician.HP);

        }

    }
    boolean gameOver (){
        if(warrior.HP<=0 || magician.HP<=0){
            return false;
        } else return true;

    }
}

class WhoIsAttack {
    int x;

    int whoisattack (String string) {
        int attackerIs =0;
        if (string.equals("go")) {
            x= (int)(Math.random()*10)+1;
            System.out.println("whois"+x);
            if (x * 10 > 50) {
                attackerIs = 1;
                return attackerIs;
            }
            if (x * 10 <= 50) {
                attackerIs = 2;
                return attackerIs;
            }
        } else if (!string.equals("go")) {
            return attackerIs;
        }
        return attackerIs;
    }
}


public class WarriorVsMagician {
    public static void main(String[] args) {
        Magician magician = new Magician();
        Warrior warrior = new Warrior();
        Attack atk = new Attack();
        Scanner scanner = new Scanner(System.in);
        WhoIsAttack whoIsAttack = new WhoIsAttack();

        while (atk.gameOver()) {
            System.out.println("게임을 시작합니다. go를 입력해주세요");
            String turnChoice = scanner.nextLine();
            int player = whoIsAttack.whoisattack(turnChoice);
            if (player==1) {
                atk.attackBy(magician);
                continue;
            } else if (player== 2) {
                atk.attackBy(warrior);
                continue;
            } else if(player==0){

                System.out.println("잘못된 입력입니다.");
                continue;
            }
        }
        System.out.println("게임이 종료되었습니다.");
        scanner.close();
    }
}

result

01