๐๏ธ 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 ๋ฐ๋ฏธ์ง๋ฅผ ์
ํ์ต๋๋ค.
๋๋ฆฌ์ด(๊ฐ) ์ฃฝ์์ต๋๋ค. ๊ฒ์์ ์ข
๋ฃ ํฉ๋๋ค.