PK에는 3명의 영웅 캐릭터가 참여합니다.
각 영웅마다 체력(영웅이 0이 되면 쓰러짐), 공격력(공격할 때마다 상대 체력이 차감됨), 공격 간격(공격할 때마다 간격을 기다려야 진행 가능) 공격의 속성을 갖고 있으며, 또한 처음 공격하기 전에 간격을 기다려야 합니다)
또한, 각 영웅에는 공격 스킬과 방어 스킬이라는 두 가지 스킬이 있습니다. 공격 스킬은 상대를 공격할 때 일정 확률로 활성화되고, 방어 스킬은 상대의 공격을 받을 때 일정 확률로 활성화됩니다. 다음과 같이
BM:
HP 650, 공격력 40, 공격 간격 1.5초
공격스킬(점프촙) : 공격할 때마다 30% 확률로 2배의 데미지를 입힌다. 디펜스 스킬(리바운드) : 공격을 받을 때마다 30% 확률로 우리가 받은 데미지를 상대에게 반사한다. 예를 들어 공격을 받았다면 상대의 공격력은 30이고, 자신의 체력이 30점 차감되고, 스킬이 발동되면 상대도 체력이 30점 차감되며, 피해는 1회만 반등할 수 있습니다. 두 BM이 서로 PK를 할 경우 지속적인 반등이 발생하지 않습니다.
DH : HP 600, 공격력 30, 공격 간격 1초
공격스킬(흡혈) : 공격할 때마다 30% 확률로 입힌 피해를 자신의 체력으로 전환(피해자에게 피해를 입히고 공격 피해를 자신의 체력으로 전환)하지만 초과할 수는 없다. 예를 들어 공격할 때 상대의 체력을 30포인트 감소시키고 동시에 자신의 체력을 30포인트 추가합니다. 방어 스킬(회피): 공격을 받을 때마다 30%의 체력이 추가됩니다. 피하고 피해를 입지 않을 기회.
MK:
HP 700, 공격력 50, 공격 간격 2.5초
공격 스킬(강히트) : 공격할 때마다 30% 확률로 상대를 3초간 기절시킵니다. (피해를 받은 상대는 3초간 기절합니다. 해당 기간 동안 상대 영웅은 공격할 수 없습니다.) 기절만 가능하며, 공격을 받을 때는 방어 스킬을 발동할 수 없으며, 기절이 끝난 후 상대 영웅은 다시 공격 간격을 기다려야 하며 기절 시간은 지속되지 않습니다. 상대가 이미 기절한 상태에서 우리가 공격 스킬을 발동하면 상대의 기절 시간이 다시 계산되기 시작합니다. 방어 스킬(신) : 공격을 받을 때마다 60% 확률로 피해량의 절반을 방어합니다. 예를 들어, 우리가 공격을 받으면 상대는 공격력이 40이 됩니다. 스킬이 활성화되면 우리의 체력이 20포인트만 차감됩니다.
1. 프로그램 시작 후 콘솔 입력을 모니터링합니다.
2. PK를 시작하려면 영웅 이름 두 개(쉼표로 구분)를 입력하세요. 형식은 BM, DH입니다.
3. 시스템은 한쪽이 승리할 때까지 자세한 PK 프로세스를 출력합니다. 형식은 다음과 같습니다.
BM은 DH를 공격하고, BM은 공격 스킬을 활성화하고, DH는 방어 스킬을 활성화하지 않으며, BM: 350->350, DH: 280->200
....
BM이 승리하다
package com.lxi; import java.io.InputStreamReader;import java.util.Random; //세 문자의 기본 클래스 abstract class Person { //Health value double coldTime; 냉각 시간 int waitTime; //공격력 int ChanceHit; //액티브 스킬 발동 확률 int ChanceDefense; //방어 스킬 발동 확률 abstract void hit(Person p); //공격 스킬 abstract int defence(Person p); //방어 스킬, 데미지 포인트 반환} class DH extends Person { public DH() { val = 600 fight = 30; = 3 ; //30% 확률을 나타냅니다.Defense = 3; waitTime = 0; } Random rand = new Random(); //액티브 스킬 활성화 플래그 boolean defenceFlag = false; //디펜스 스킬 활성화 플래그 public void hit(Person p) { if (rand.nextInt(10) <chanceHit) { //액티브 액티브 스킬 활성화 int 상처 = p.defense ( this); p.val = p.val - 상처; if (p.val <= 0) { System.out.println(this.getClass().getSimpleName() + "승리!"); System.exit(0); } val = val + harm; if (val > 600) val = 600; hitFlag = true; //액티브 스킬이 활성화되었음을 표시} else { //일반 공격 수행 ( this); p.val = p.val - 상처; if (p.val <= 0) { System.out.println(this.getClass().getSimpleName() + "승리!"); System.exit(0); } } System.out.println(this.getClass().getSimpleName() + "공격" + p.getClass().getSimpleName() + "," + this.getClass().getSimpleName () + (this.hitFlag ? "공격 스킬 발동" : "공격 스킬 발동 안됨") + p.getClass().getSimpleName() + (this.defenseFlag ? "방어 스킬 활성화됨" : "방어 스킬 활성화 안됨") + this.getClass().getSimpleName() + ":" + this.val + "," + p.getClass().getSimpleName() + ":" + p.val); hitFlag = false; // defenceFlag = false; //플래그를 재설정하고 다음에 재사용합니다.} public int defence(Person p) { if (rand.nextInt(10) < ChanceDefense) { defenceFlag true; //방어 스킬이 활성화되었음을 표시 return 0 } else { return p.fight } };
class BM extends Person { public BM() { val = 1.5; fight = 40; 기회Hit = 3; waitTime = 0; //활성화된 방어 스킬 수 int temp = 40; //공격력, 전투와 동일한 값 boolean deflag = false; hit(Person p) { if (rand.nextInt(10) <chanceHit) { fight = fight * 2; //이중 공격 실행 hitFlag = true } int 상처 = p.defense(this); val - fight; fight = temp; //단일 공격으로 되돌리기 if (p.val <= 0) { System.out.println(this.getClass().getSimpleName() + "승리!"); System.exit(0); } System.out.println(this.getClass().getSimpleName() + "공격" + p.getClass().getSimpleName() + "," + this. getClass().getSimpleName() + (this.hitFlag ? "공격 스킬 시작됨" : "공격 스킬 시작되지 않음") + p.getClass().getSimpleName() + (this.defenseFlag ? "방어 스킬 활성화" : "방어 스킬이 활성화되지 않습니다.") + this.getClass().getSimpleName() + ":" + this.val + "," + p.getClass().getSimpleName() + ": " + p.val); hitFlag = false; defenceFlag = false; } public int defence(Person p) { if (rand.nextInt(10) <chanceDefense) { if (count != 0) { p.val = p.val - p.fight; count++; defenceFlag = true; if (p.val <= 0) { System.out.println(this.getClass().getSimpleName() + "승리!") ; System.exit(0); } } } return p.fight; }} 클래스 MK 확장 Person { public MK() { val = 2.5; ChanceDefense = 6; waitTime = 0; 부울 hitFlag = false; Random rand = new Random() { if (rand.nextInt(10) <chanceHit) { p.waitTime = 3; //상대를 3초 동안 기절시킵니다. hitFlag = true } int 상처 = p.defense(this); p.val = p.val - 상처; if (p.val <= 0) { System.out.println(this.getClass().getSimpleName() + "Win!"); System.out.println(this.getClass().getSimpleName() + "공격" + p.getClass().getSimpleName() + "," + this.getClass().getSimpleName() + (this.hitFlag ? "공격 스킬 발동" : "공격 스킬 발동 안됨") + p.getClass().getSimpleName() + (this.defenseFlag ? "방어 스킬 발동" : "방어 스킬 발동 안됨") + this. getClass().getSimpleName() + ":" + this.val + "," + p.getClass().getSimpleName() + ":" + p.val); false; } public int defence(Person p) { if (rand.nextInt(10) < ChanceDefense) { defenceFlag = true; return p.fight / 2 //방어 스킬이 활성화되고 데미지가 절반으로 줄어듭니다.} return p.fight; } }
public class Rpg { @SuppressWarnings("unchecked") public static void main(String[] args) throws Exception { System.out.println("여기에 PK를 위해 두 문자를 입력하세요. 영어 쉼표로 구분하세요: [BM, DH, MK] "); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); Class<Person> c1; Class<Person> c2; try { String temp = br.readLine(); String[] str = temp.split(","); if (str.length != 2) { throw new Exception("입력 형식이 잘못되었습니다. 기본 PK를 누르세요."); } c1 = (클래스<사람>) Class.forName("com.lxi." + str[0].toUpperCase()) c2 = (클래스<사람>) Class.forName("com.lxi." + str[1].toUpperCase()) } catch (Exception e) { // TODO 자동 생성된 catch 블록 c1 = (Class<Person>) Class.forName("com .lxi.BM"); c2 = (Class<Person>) Class.forName("com.lxi.DH"); } try { Person p1 = c1.newInstance(); Person p2 = c2.newInstance(); 긴 시간 = System.currentTimeMillis(); 긴 nextTime1 = (시간 + p1.coldTime*1000) // 긴 nextTime2 = (시간 + p2.coldTime*1000); /공격 시작 시간 System.out.println("---게임 시작---") while (true) { long currenTime = System.currentTimeMillis() if (nextTime1 < currenTime) { //시간이 다 되면 공격을 시작합니다 p1.hit(p2); nextTime1 += p1.coldTime*1000 + p1.waitTime*1000; //다음 공격 시간 = 냉각 시간 + 기절 시간 p1 .waitTime = 0; //라운드가 끝나면 기절 시간을 0으로 재설정합니다. } if (nextTime2 < currenTime) { p2.hit(p1) += p2.coldTime*1000 + p2.waitTime*1000; p2.waitTime = 0; } } } catch (ClassCastException e) { // TODO 자동 생성된 catch 블록 e.printStackTrace() } catch (InstantiationException e); TODO 자동 생성된 catch 블록 e.printStackTrace() } catch (IllegalAccessException e) { // TODO 자동 생성된 catch 블록 e.printStackTrace(); } catch (Exception e) { e.printStackTrace() } }}
이상이 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.