๐Ÿ—„๏ธ Backend/Java

์ž๋ฐ”(Java) - Thread(๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ) 2 - RPG ๊ฒŒ์ž„ ๋งŒ๋“ค๊ธฐ

kongmi 2023. 2. 7. 18:31

๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•œ ์บ๋ฆญํ„ฐ๊ฐ€ ์ฃฝ์„ ๋•Œ ๊นŒ์ง€ ์‹คํ–‰ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ค๊ธฐ!

์บ๋ฆญํ„ฐ๋Š” ์ „์‚ฌ(warrior)์™€ ๋งˆ๋ฒ•์‚ฌ(wizard)๋ฅผ ๋งŒ๋“ค๊ฒ ์Šต๋‹ˆ๋‹ค.

๋Šฅ๋ ฅ์น˜๋Š” ๊ฐ์ฒด ์ƒ์„ฑํ•  ๋•Œ ์„ค์ •ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์„ค๊ณ„ ๋‚ด์šฉ

  • ์ƒ์†๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ์ ์šฉ
  • ์Šค๋ ˆ๋“œ ๋™์ž‘ ํ™•์ธ
  • ๊ฒŒ์ž„ ์บ๋ฆญํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์Šค๋ ˆ๋“œ๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„ ์ „ํˆฌ ์ง„ํ–‰

Main

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("๊ฐ•๋ ฅํ•œ ์ฒด๋ ฅ๊ณผ ๋ฌผ๋ฆฌ ๊ณต๊ฒฉ๋ ฅ์˜ ์ „์‚ฌ ์ด๋ฆ„์„ ์ •ํ•˜์„ธ์š” : ");
        String warriorName = sc.next();
        System.out.print("๊ถ๊ทน์˜ ๋งˆ๋ฒ• ๋Šฅ๋ ฅ์„ ์ง€๋‹Œ ๋งˆ๋ฒ•์‚ฌ ์ด๋ฆ„์„ ์ •ํ•˜์„ธ์š” : ");
        String wizardName = sc.next();
        Character warrior = new Character(warriorName, 8, 2, 0.8, 0.5, 40, 500);
        Character wizard = new Character(wizardName, 2, 28, 0.5, 0.9, 100, 250);
        GameThread1 gameThread1 = new GameThread1(warrior, wizard);
        GameThread2 gameThread2 = new GameThread2(warrior, wizard);
        gameThread1.start();
        gameThread2.start();
    }
}

Unit

abstract public class Unit {
    protected String name; // ์บ๋ฆญํ„ฐ ์ด๋ฆ„ ์„ค์ •
    protected int pPower; // ํ”ผ์ง€์ปฌ ํŒŒ์›Œ(๋ฌผ๋ฆฌ๊ณต๊ฒฉ๋ ฅ)
    protected int mPower; // ๋งค์ง€์ปฌ ํŒŒ์›Œ(๋งˆ๋ฒ•๋Šฅ๋ ฅ์น˜)
    protected double pHit; // ๋ฌผ๋ฆฌ ์ ์ค‘๋ฅ 
    protected double mHit; // ๋งˆ๋ฒ• ์ ์ค‘๋ฅ 
    protected int ultraPower; // ๊ถ๊ทน๊ธฐ (ํ•ด๋‹น ์บ๋ฆญํ„ฐ๊ฐ€ ๊ฐ€์ง„ ํŠน์ˆ˜ ๋Šฅ๋ ฅ)
    protected int hp; // ์ฒด๋ ฅ
}
๊ฒŒ์ž„์— ์กด์žฌํ•˜๋Š” ์บ๋ฆญํ„ฐ์˜ ๊ธฐ๋ณธ ํŠน์„ฑ ์ •์˜
๊ฐ์ฒด ์ƒ์„ฑ ๋ชปํ•˜๊ฒŒ ์ถ”์ƒํ™” ํด๋ž˜์Šค๋กœ ์ž‘์„ฑ

GameAciton

public interface GameAction {
    double pAttack(); // ๋ฌผ๋ฆฌ ๊ณต๊ฒฉ๋ ฅ
    double mAttack(); // ๋งˆ๋ฒ• ๊ณต๊ฒฉ๋ ฅ
    int ultimate(); // ๊ถ๊ทน๊ธฐ ๊ณต๊ฒฉ๋ ฅ
    boolean setDamage(double damage); // ๋ฐ›๋Š” ํ”ผํ•ด๋Ÿ‰
}

Character

public class Character extends Unit implements GameAction{
    // ์ƒ์„ฑ์ž์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ ๋ฐ›๋Š” ๊ฐ’์œผ๋กœ ์บ๋ฆญํ„ฐ์˜ ๊ธฐ๋ณธ ๋Šฅ๋ ฅ์น˜๋ฅผ ์„ค์ •
    public Character(String name, int pP, int mP, double pH, double mH, int ultra, int hp) {
        this.name = name;
        pPower = pP;
        mPower = mP;
        pHit = pH;
        mHit = mH;
        ultraPower = ultra;
        this.hp = hp;
    }

    @Override
    public double pAttack() { // ๋ฌผ๋ฆฌ ๊ณต๊ฒฉ๋ ฅ
        return pPower * pHit;
    }

    @Override
    public double mAttack() { // ๋งˆ๋ฒ• ๊ณต๊ฒฉ๋ ฅ
        return mPower * mHit;
    }

    @Override
    public int ultimate() { // ๊ถ๊ทน๊ธฐ
        return ultraPower;
    }

    @Override
    public boolean setDamage(double damage) { // ๋ฐ›๋Š” ํ”ผํ•ด๋Ÿ‰
        if(hp > damage) {
            hp -= damage;
            System.out.println("๋‚จ์•„์žˆ๋Š” " + name + "์˜ ์ฒด๋ ฅ์€ " + hp + " ์ž…๋‹ˆ๋‹ค.");
            return false;
        } else {
            System.out.println(name + "์ด(๊ฐ€) ์ฃฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„์„ ์ข…๋ฃŒ ํ•ฉ๋‹ˆ๋‹ค.");
            return true;
        }
    }
}

GameThread1

// ์Šค๋ ˆ๋“œ ์ƒ์„ฑ, ์ „์‚ฌ ์บ๋ฆญํ„ฐ์— ๋Œ€ํ•œ ๊ตฌํ˜„๋ถ€
public class GameThread1 extends Thread {
    private Character warrior;
    private Character wizard;

    public GameThread1(Character warrior, Character wizard) {
        this.warrior = warrior;
        this.wizard = wizard;
    }

    @Override
    public void run() {
        int normal; // ์ผ๋ฐ˜ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ํ™•๋ฅ  ๊ตฌํ•˜๊ธฐ
        int special; // ํŠน์ˆ˜ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ํ™•๋ฅ  ๊ตฌํ•˜๊ธฐ
        boolean endGame = false; // ๊ฒŒ์ž„์— ๋Œ€ํ•œ ์ข…๋ฃŒ ์—ฌ๋ถ€
        while(true) {
            try {
                sleep(3000); // 3์ดˆ ๋งˆ๋‹ค ๋ฐ˜๋ณต
                normal = (int)(Math.random() * 2); // 50% ํ™•๋ฅ 
                special = (int)(Math.random() * 20); // 5% ํ™•๋ฅ 
                if(normal == 1) {
                    System.out.println("๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : " + wizard.name + "์—๊ฒŒ " + warrior.pAttack() + " ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.");
                    endGame = wizard.setDamage(warrior.pAttack());
                } else {
                    System.out.println("๋งˆ๋ฒ• ๊ณต๊ฒฉ : " + wizard.name + "์—๊ฒŒ " + warrior.mAttack() + " ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.");
                    endGame = wizard.setDamage(warrior.mAttack());
                }
                if(special == 10) {
                    System.out.println(warrior.name + " ๊ถ๊ทน๊ธฐ ๋ฐœ๋™ !!!!!, " + wizard.name + "์—๊ฒŒ " + warrior.ultimate()
                     + " ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.");
                    endGame = wizard.setDamage(warrior.ultimate());
                }
                if (endGame) {
                    System.exit(0);
                }

            } catch (InterruptedException e) {}
        }
    }
}

GameThread2

public class GameThread2 extends Thread {
    private Character warrior;
    private Character wizard;

    public GameThread2(Character warrior, Character wizard) {
        this.warrior = warrior;
        this.wizard = wizard;
    }
    @Override
    public void run() {
        int normal; // ์ผ๋ฐ˜ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ํ™•๋ฅ  ๊ตฌํ•˜๊ธฐ
        int special; // ํŠน์ˆ˜ ๊ณต๊ฒฉ์— ๋Œ€ํ•œ ํ™•๋ฅ  ๊ตฌํ•˜๊ธฐ
        boolean endGame = false; // ๊ฒŒ์ž„์— ๋Œ€ํ•œ ์ข…๋ฃŒ ์—ฌ๋ถ€
        while(true) {
            try {
                sleep(3300); // 3์ดˆ ๋งˆ๋‹ค ๋ฐ˜๋ณต
                normal = (int)(Math.random() * 2); // 50% ํ™•๋ฅ 
                special = (int)(Math.random() * 18);
                if(normal == 1) {
                    System.out.println("๋งˆ๋ฒ• ๊ณต๊ฒฉ : " + warrior.name + "์—๊ฒŒ " + wizard.mAttack() + " ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.");
                    endGame = warrior.setDamage(wizard.mAttack());
                } else {
                    System.out.println("๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : " + warrior.name + "์—๊ฒŒ " + wizard.pAttack() + " ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.");
                    endGame = warrior.setDamage(wizard.pAttack());
                }
                if(special == 10) {
                    System.out.println(wizard.name + " ๊ถ๊ทน๊ธฐ ๋ฐœ๋™ !!!!!, " + warrior.name + "์—๊ฒŒ " + wizard.ultimate()
                            + " ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.");
                    endGame = warrior.setDamage(wizard.ultimate());
                }
                if (endGame) {
                    System.exit(0);
                }

            } catch (InterruptedException e) {}
        }
    }
}

์˜ค๋ž˜ ๊ฑธ๋ ค์„œ ๊ฐ๊ฐ hp๋Š” 200, 100์œผ๋กœ ์กฐ์ • ํ›„ ์‹คํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ฐ•๋ ฅํ•œ ์ฒด๋ ฅ๊ณผ ๋ฌผ๋ฆฌ ๊ณต๊ฒฉ๋ ฅ์˜ ์ „์‚ฌ ์ด๋ฆ„์„ ์ •ํ•˜์„ธ์š” : ๋‘๋ฆฌ
๊ถ๊ทน์˜ ๋งˆ๋ฒ• ๋Šฅ๋ ฅ์„ ์ง€๋‹Œ ๋งˆ๋ฒ•์‚ฌ ์ด๋ฆ„์„ ์ •ํ•˜์„ธ์š” : ์บ”๋””
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 6.4 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 93 ์ž…๋‹ˆ๋‹ค.
๋งˆ๋ฒ• ๊ณต๊ฒฉ : ๋‘๋ฆฌ์—๊ฒŒ 25.2 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ๋‘๋ฆฌ์˜ ์ฒด๋ ฅ์€ 174 ์ž…๋‹ˆ๋‹ค.
๋งˆ๋ฒ• ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 92 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ๋‘๋ฆฌ์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ๋‘๋ฆฌ์˜ ์ฒด๋ ฅ์€ 173 ์ž…๋‹ˆ๋‹ค.
์บ”๋”” ๊ถ๊ทน๊ธฐ ๋ฐœ๋™ !!!!!, ๋‘๋ฆฌ์—๊ฒŒ 100 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ๋‘๋ฆฌ์˜ ์ฒด๋ ฅ์€ 73 ์ž…๋‹ˆ๋‹ค.
๋งˆ๋ฒ• ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 91 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ๋‘๋ฆฌ์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ๋‘๋ฆฌ์˜ ์ฒด๋ ฅ์€ 72 ์ž…๋‹ˆ๋‹ค.
๋งˆ๋ฒ• ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 90 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ๋‘๋ฆฌ์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ๋‘๋ฆฌ์˜ ์ฒด๋ ฅ์€ 71 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 6.4 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 83 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ๋‘๋ฆฌ์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ๋‘๋ฆฌ์˜ ์ฒด๋ ฅ์€ 70 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 6.4 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 76 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ๋‘๋ฆฌ์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ๋‘๋ฆฌ์˜ ์ฒด๋ ฅ์€ 69 ์ž…๋‹ˆ๋‹ค.
๋งˆ๋ฒ• ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 75 ์ž…๋‹ˆ๋‹ค.
๋งˆ๋ฒ• ๊ณต๊ฒฉ : ๋‘๋ฆฌ์—๊ฒŒ 25.2 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ๋‘๋ฆฌ์˜ ์ฒด๋ ฅ์€ 43 ์ž…๋‹ˆ๋‹ค.
๋งˆ๋ฒ• ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 74 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ๋‘๋ฆฌ์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ๋‘๋ฆฌ์˜ ์ฒด๋ ฅ์€ 42 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 6.4 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 67 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ๋‘๋ฆฌ์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ๋‘๋ฆฌ์˜ ์ฒด๋ ฅ์€ 41 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 6.4 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 60 ์ž…๋‹ˆ๋‹ค.
๋งˆ๋ฒ• ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 1.0 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 59 ์ž…๋‹ˆ๋‹ค.
๋งˆ๋ฒ• ๊ณต๊ฒฉ : ๋‘๋ฆฌ์—๊ฒŒ 25.2 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ๋‘๋ฆฌ์˜ ์ฒด๋ ฅ์€ 15 ์ž…๋‹ˆ๋‹ค.
๋ฌผ๋ฆฌ ๊ณต๊ฒฉ : ์บ”๋””์—๊ฒŒ 6.4 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‚จ์•„์žˆ๋Š” ์บ”๋””์˜ ์ฒด๋ ฅ์€ 52 ์ž…๋‹ˆ๋‹ค.
๋งˆ๋ฒ• ๊ณต๊ฒฉ : ๋‘๋ฆฌ์—๊ฒŒ 25.2 ๋ฐ๋ฏธ์ง€๋ฅผ ์ž…ํ˜”์Šต๋‹ˆ๋‹ค.
๋‘๋ฆฌ์ด(๊ฐ€) ์ฃฝ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„์„ ์ข…๋ฃŒ ํ•ฉ๋‹ˆ๋‹ค.