스레드를 수업 도중에 배운 김에 발로 짜봤습니다. 재밌을 것 같아서요. 물론 후에 공부를 하지 않아서 제대로 쓰는 법은 모르지만, 일단 돌아가니 OK라는 느낌으로 올려봅니다.
실행 결과의 예는 아래를 펼쳐보세요.
하쿠레이 레이무 등장!
공격력 : 73
하쿠레이 레이무 : 248/248
키리사메 마리사 등장!
공격력 : 91
키리사메 마리사 : 211/211
이자요이 사쿠야 등장!
공격력 : 113
이자요이 사쿠야 : 214/214
코치야 사나에 등장!
공격력 : 115
코치야 사나에 : 240/240
키리사메 마리사 이 하쿠레이 레이무 을 공격! 공격력 : 91
하쿠레이 레이무 에게 91 만큼의 피해가!
하쿠레이 레이무 : 157/248
이자요이 사쿠야 이 코치야 사나에 을 공격! 공격력 : 113
코치야 사나에 에게 113 만큼의 피해가!
코치야 사나에 : 127/240
하쿠레이 레이무 이 이자요이 사쿠야 을 공격! 공격력 : 73
이자요이 사쿠야 에게 73 만큼의 피해가!
이자요이 사쿠야 : 141/214
키리사메 마리사 이 코치야 사나에 을 공격! 공격력 : 91
코치야 사나에 에게 91 만큼의 피해가!
코치야 사나에 : 36/240
코치야 사나에 이 이자요이 사쿠야 을 공격! 공격력 : 115
이자요이 사쿠야 에게 115 만큼의 피해가!
이자요이 사쿠야 : 26/214
이자요이 사쿠야 이 키리사메 마리사 을 공격! 공격력 : 113
키리사메 마리사 에게 113 만큼의 피해가!
키리사메 마리사 : 98/211
하쿠레이 레이무 이 이자요이 사쿠야 을 공격! 공격력 : 73
이자요이 사쿠야 에게 73 만큼의 피해가!
이자요이 사쿠야 : 0/214
이자요이 사쿠야 이 지쳐 쓰러졌다!
키리사메 마리사 이 하쿠레이 레이무 을 공격! 공격력 : 91
하쿠레이 레이무 에게 91 만큼의 피해가!
하쿠레이 레이무 : 66/248
코치야 사나에 이 하쿠레이 레이무 을 공격! 공격력 : 115
하쿠레이 레이무 에게 115 만큼의 피해가!
하쿠레이 레이무 : 0/248
하쿠레이 레이무 이 지쳐 쓰러졌다!
코치야 사나에 이 키리사메 마리사 을 공격! 공격력 : 115
키리사메 마리사 에게 115 만큼의 피해가!
키리사메 마리사 : 0/211
키리사메 마리사 이 지쳐 쓰러졌다!
코치야 사나에 만이 살아남았습니다 !
소스는 아래를 펼쳐보세요.
import java.util.Vector;
class listBattler{
private Vector<Battler> list = new Vector<Battler>();
public synchronized void add(Battler obj) {
list.addElement(obj);
}
public Battler getRandom(Battler me) {
Battler get = null;
do {
get = list.get((int) Math.floor(Math.random()*list.size()));
//System.out.println(me.getName() + "가 획득중 - " + get);
} while (me == get);
return get;
}
public synchronized void remove(Battler obj) {
list.remove(obj);
}
public void startAll() {
for (Battler s: list) {
s.start();
}
System.out.println();
}
public int getSize() { return list.size();}
}
class Battler extends Thread {
private int hp;
final int atk;
final int max_hp;
final listBattler list;
public Battler(String name, listBattler list) {
super(name);
hp = 200 + (int)(Math.random()*100);
max_hp = hp;
this.list = list;
atk = (int)(Math.random()*100) + 50;
System.out.println(name + " 등장!");
System.out.println("공격력 : " + atk);
printHP();
System.out.println();
}
public void run() {
while (true) {
//System.out.print(" " + getName());
//printHP();
try {
sleep((int)(Math.random() * 7000) );
//System.out.println(getName() + " 대기완료");
//System.out.println(getName() + " 공격완료");
if (hp <= 0) {/*die();*/ break;}
else if (list.getSize() == 1) {
System.out.println(getName() + " 만이 살아남았습니다 !");
break;
}
else attackRandom(list);
} catch(InterruptedException e) {}
}
}
public synchronized void attackRandom(listBattler list_) {
Battler enemy = list_.getRandom(this);
System.out.println(getName() + " 이 " + enemy.getName() + " 을 공격! 공격력 : " + atk);
enemy.damage(atk);
enemy.checkHP();
}
public void damage(int damage) {
hp -= damage;
if (hp < 0) hp = 0;
System.out.println(getName() + " 에게 " + damage + " 만큼의 피해가!");
printHP();
System.out.println();
}
private void printHP() {
System.out.println(getName() + " : " + hp + "/" + max_hp);
}
public void checkHP() {
if (hp <= 0)
die();
}
private void die() {
{
list.remove(this);
System.out.println(getName() + " 이 지쳐 쓰러졌다! ");
System.out.println();
}
}
}
public class JavaThreadBattler {
public static void main(String[] args) {
listBattler list = new listBattler();
list.add(new Battler("하쿠레이 레이무", list));
list.add(new Battler("키리사메 마리사", list));
list.add(new Battler("이자요이 사쿠야", list));
list.add(new Battler("코치야 사나에", list));
list.startAll();
}
}