본문 바로가기
개발자로 나아가는 나의 언어들/JAVA

자바 알고리즘만들어보기 - 드래곤볼

by 승싱생숭 2019. 3. 18.
728x90

오늘은 추억의 드래곤볼 게임을 만들어볼 예정인데요!

다들 어렸을때 친구와 하던 드래곤볼 게임 기억하시나요 ?

서로 손바닥을 치며 기를모으고 에너지파를 쏘고 막기도 하던 추억의 게임이요.


컴퓨터와 대결하는 방식으로 만들었고 체력을 만들어 두었구요.

내가 기를 모으면 상대도 어떠한 랜덤한 행동을 시도하구요.

기를 모을때 에너지파를 맞으면 체력이 1달고 막기를 통해 막을 수있어요!

그리고 서로 에너지파를 쏘면 무산되구요! 코드한번 보실까요?




먼저 메인문이에요! 주요기능은 다 클래스로 나누어놨으니 메인문에서는 동작과정만 확인하실게요

package dragonball;


/*

 * 동작을 입력한다

 * 0. 플레이어가 컴퓨터인지 사람인지 확인

 * 0-1. 컴퓨터라면 랜덤입력

 * 0-2. 사람이라면 스캐너

 * 1. 동작은 '기모으기' '막기' '공격'

 * 2. 기를 모으면 기++;

 * 3. 공격을 하면 기--;

 * 4. 기가 0개면 공격을 할 수 없다.

 * 5. 기를 모으는 동안 공격을 할 경우 체력 감소

 * 6. 체력이 0이 되면 게임 끝

 */


public class Main {


    public static void main(String[] args) {

/*

* isPlayerBot가 false이면 사람

*/

PlayerVO[] player = { new PlayerVO(false, "손오공", 3), 

new PlayerVO(true, "피콜로bot", 3) };

Play.play(player);

    }


}



그 다음은 Play 라는 클래스 인데요!

전체적인 게임 루틴이 포함되어있답니다~


package dragonball;


import java.util.Scanner;


/*

 * 동작을 입력한다

 * 0. 플레이어가 컴퓨터인지 사람인지 확인

 * 0-1. 컴퓨터라면 랜덤입력

 * 0-2. 사람이라면 스캐너

 * 1. 동작은 '기모으기' '막기' '공격'

 * 2. 기를 모으면 기++;

 * 3. 공격을 하면 기--;

 * 4. 기가 0개면 공격을 할 수 없다.

 * 5. 기를 모으는 동안 공격을 할 경우 체력 감소

 * 6. 체력이 0이 되면 게임 끝

 */


public class Play {


    private static Scanner scanner;


    public static void play(PlayerVO[] player) {


scanner = new Scanner(System.in);


// 이길 때 까지 반복

while (true) {

    initStatus(player[0]);

    initStatus(player[1]);


    // 동작판단

    inputAction(player[0]);

    inputAction(player[1]);


    // 기 모으기

    // 공격하면 기 감소

    kiCount(player[0]);

    kiCount(player[1]);


    // 상대가 기를 모을때 공격하면 체력감소

    attack(player[0], player[1]);


    printMessage(player[1]);

    printMessage(player[0]);


    if (isWin(player[0])) {

System.out.println(player[1].getPlayerName() + " 승리!");

break;

    }

    if (isWin(player[1])) {

System.out.println(player[0].getPlayerName() + " 승리!");

break;

    }

    /*

     * TODO:버전업시 승리 이후 난이도가 상승하여 더 강한 상대 등장 승리 수 카운트 변수를 만들고,

     * 상대 체력이 0이 되었을때, 위너 시점에서 승리 수 카운트가 남아있으면 봇을 새로 생성

     */

    System.out.println();

    System.out.println("==================================================================");

    System.out.println("==================================================================");

    System.out.println("\n\n");


}


    }


    static void initStatus(PlayerVO player) {

player.setHpStatus(false);

    }


    // 동작 판단

    static void inputAction(PlayerVO player) {


// 사람이면 동작 입력

if (player.isPlayerBot() == false) {


    System.out.println("동작 입력");

    System.out.println("1.기모으기|2.막기|3.공격");

    System.out.println("----------------------");

    System.out.print("입력> ");

    player.setAction(scanner.nextInt());

    System.out.println();


    // 1,2,3외의 숫자는 잘못된 입력 --> 다시 시작

    if (player.getAction() < 1 || player.getAction() > 3) {

System.out.println("잘못된 수 입력");

inputAction(player);

    }


}

// bot이면 랜덤 동작

else if (player.isPlayerBot()) {


    player.setAction((int) (Math.random() * 3) + 1);


}


// 기가 0이면 공격할 수 없다.

if (player.getAction() == 3 && player.getKiCount() <= 0) {


    // 사람이면 메세지 출력

    if (player.isPlayerBot() == false) {

System.out.println("기가 0입니다. 다시 입력하세요");

    }

    inputAction(player);

}


    }


    // 기를 모으면 kiCount++, 공격하면 kiCount--

    static void kiCount(PlayerVO player) {

if (player.getAction() == 1) {

    player.setKiCount(player.getKiCount() + 1);

} else if (player.getAction() == 3) {

    player.setKiCount(player.getKiCount() - 1);

}

    }


    // 상대방이 기를 모을때 공격하면 체력 감소

    static void attack(PlayerVO player1, PlayerVO player2) {

/*

* TODO:true-false로 상태 확인해서 체력감소 사실이 확인되면 메세지 출력하는 방식으로

*/

if (player1.getAction() == 1 && player2.getAction() == 3) {


    player1.setHp(player1.getHp() - 1);

    player1.setHpStatus(true);


} else if (player1.getAction() == 3 && player2.getAction() == 1) {


    player2.setHp(player2.getHp() - 1);

    player2.setHpStatus(true);


}

    }


    static boolean isWin(PlayerVO player) {

if (player.getHp() == 0) {


    return true;

}

return false;

    }


    static void printMessage(PlayerVO player) {

System.out.println("\n");

System.out.println(player);

if (player.isHpStatus() == true) {

    System.out.println("////////" + player.getPlayerName() + " 체력 감소////////");

}

if (player.getHp() == 0) {

    System.out.println("////////" + player.getPlayerName() + " 사망////////");

}


    }


}




마지막으로 PlayerVO는 Setter와 Getter를 통한 입력값 저장과 반환의 공간이라고 보시면 되겠네요~


package dragonball;


/*

 * 필요한것

 * 어떤 액션인지

 * 플레이어가 사람인지 컴퓨터인지

 * 기를 저장할 수 있는 공간

 * 체력

 */

public class PlayerVO {


    private String playerName;

    private int action;

    private boolean isPlayerBot;

    private int kiCount;

    private int hp;

    private boolean hpStatus;

    private boolean attackStatus;

    private boolean kiStatus;


    PlayerVO(boolean isPlayerBot, String playerName, int hp) {

this.isPlayerBot = isPlayerBot;

this.playerName = playerName;

this.hp = hp;

    }


    public String getPlayerName() {

return playerName;

    }


    public int getAction() {

return action;

    }


    public boolean isPlayerBot() {

return isPlayerBot;

    }


    public int getKiCount() {

return kiCount;

    }


    public int getHp() {

return hp;

    }


    public boolean isHpStatus() {

return hpStatus;

    }


    public boolean isAttackStatus() {

return attackStatus;

    }


    private boolean isKiStatus() {

return kiStatus;

    }


    private void setPlayerName(String playerName) {

this.playerName = playerName;

    }


    public void setAction(int action) {

this.action = action;

    }


    private void setIsPlayerBot(boolean playerIsBot) {

this.isPlayerBot = playerIsBot;

    }


    public void setKiCount(int kiCount) {

this.kiCount = kiCount;

    }


    public void setHp(int hp) {

this.hp = hp;

    }


    public void setHpStatus(boolean hpStatus) {

this.hpStatus = hpStatus;

    }


    private void setAttackStatus(boolean attackStatus) {

this.attackStatus = attackStatus;

    }


    private void setKiStatus(boolean kiStatus) {

this.kiStatus = kiStatus;

    }


    @Override

    public String toString() {

String actionTemp = null;

switch (action) {

case 1:

    actionTemp = "기모으기";

    break;

case 2:

    actionTemp = "막기";

    break;

case 3:

    actionTemp = "공격";

    break;


}


return playerName + "의 ##" + actionTemp + "##\n[hp=     " + hp + " || 기=     " + kiCount + "\t]";

    }


}





728x90