반응형
● 최대한 객체지향에 맞춰서 코드를 변경해보려 했지만, 아직 어디를 더 객체지향적으로 손봐야 할지 감이 오질 않는다.
코드를 바꾸면서 기존에 존재하던 규칙을 바꾸어 보았다. 먼저 기존의 규칙을 살펴보면
rule) 플레이어 두 명은 가위바위보를 하여 공격권을 얻어 자신의 플레이어 코드( warrior //player 1 , magician //plater 2)를 입력하면 공격을 한다.
개선점
- 사용자의 입력에 맞춰서 1/2 확률로 공격을 하도록 하여 현실에서 필요한 가위바위보를 없애며 운 적인 요소도 필요함과 동시에 확률을 단순히 1/2로 맞춰서 비등비등한 긴장감을 자아낼 수 있도록 하였음
- 잘못된 명령어 입력 시 재귀 호출을 사용하여 "go"외의 명령어는 허용치 않게 설계
다음에 추가하고 싶은 점
전적 기록 시스템을 추가할 계획이 있다. 게임의 전적을 배열을 이용하여 누가 이겼는지를 저장하고 초기화도 가능하도록 코드를 업데이트할 예정
package mygames;
import java.util.Scanner;
abstract class Fightable {
abstract int attack ();
abstract boolean guard();
}
class Warrior extends Fightable {
int HP = 150;
int guardProperty = 70;
@Override
public int attack() {
return 10;
}
@Override
public boolean guard() {
int x = (int)(Math.random()*10)+1;
if(x*10>guardProperty)
return true;
else
return false;
}
public String toString(){
return "Warrior";
}
}
class Magician extends Fightable {
int HP = 100;
int guardProperty = 40;
@Override
public int attack() {
int damage = 40;
int x = (int) (Math.random() * 10) + 1;
if(x*10>=85){
damage+=5;
this.guardProperty-=10;
System.out.println("대마법사의 지혜 발동");
System.out.println("공격력이 증가했다!");
System.out.println("방어력이 하락했다!");
}
return damage;
}
@Override
public boolean guard() {
int x = (int) (Math.random() * 10) + 1;
if (x * 10 > guardProperty)
return true;
else
return false;
}
public String toString() {
return "Magician";
}
}
class Attack {
Warrior warrior = new Warrior(); //player 1
Magician magician = new Magician(); //plater 2
int turn =0;
public void attackBy(Fightable f) {
if(f.toString().equals("Magician")){
if(warrior.guard() && warrior.HP>0){
turn++;
System.out.println("턴수 :"+turn+"Magician 공격! , Warrior가 GUARD! 현재체력"+warrior.HP);
return;
}
warrior.HP=warrior.HP - f.attack();
turn++;
if(warrior.HP<=0) {
warrior.HP=0;
System.out.println("Magician의 마지막 공격!, Warrior의 HP는 "+warrior.HP+", game over , Magician Win");
//System.out.println("게임을 다시 시작해주세요");
return;
}
System.out.println("턴수 :"+turn+" Magician이 Warrior를 공격");
System.out.println("남은 체력"+warrior.HP);
} else if (f.toString().equals("Warrior")){
if(magician.guard()&&magician.HP>0){
turn++;
System.out.println("턴수 :"+turn+"Warrior 공격! , Magician이 GUARD! 현재체력"+magician.HP);
return;
}
magician.HP =magician.HP - f.attack();
turn++;
if(magician.HP<=0) {
magician.HP=0;
System.out.println("Warrior의 마지막 공격!,Magician 의 HP는 "+magician.HP+",game over , Warrior Win");
//System.out.println("게임을 다시 시작해주세요");
return;
}
System.out.println("턴수 :"+turn+" Warrior가 Magician를 공격");
System.out.println("남은 체력"+magician.HP);
}
}
boolean gameOver (){
if(warrior.HP<=0 || magician.HP<=0){
return false;
} else return true;
}
}
class WhoIsAttack {
int x;
int whoisattack (String string) {
int attackerIs =0;
if (string.equals("go")) {
x= (int)(Math.random()*10)+1;
System.out.println("whois"+x);
if (x * 10 > 50) {
attackerIs = 1;
return attackerIs;
}
if (x * 10 <= 50) {
attackerIs = 2;
return attackerIs;
}
} else if (!string.equals("go")) {
return attackerIs;
}
return attackerIs;
}
}
public class WarriorVsMagician {
public static void main(String[] args) {
Magician magician = new Magician();
Warrior warrior = new Warrior();
Attack atk = new Attack();
Scanner scanner = new Scanner(System.in);
WhoIsAttack whoIsAttack = new WhoIsAttack();
while (atk.gameOver()) {
System.out.println("게임을 시작합니다. go를 입력해주세요");
String turnChoice = scanner.nextLine();
int player = whoIsAttack.whoisattack(turnChoice);
if (player==1) {
atk.attackBy(magician);
continue;
} else if (player== 2) {
atk.attackBy(warrior);
continue;
} else if(player==0){
System.out.println("잘못된 입력입니다.");
continue;
}
}
System.out.println("게임이 종료되었습니다.");
scanner.close();
}
}
result
01
'Java > Daily-Java' 카테고리의 다른 글
[자바의 정석] Exercise (7_1) + (0) | 2021.07.07 |
---|---|
[자바의 정석] Exercise (7_1) (0) | 2021.07.06 |
[JAVA 복습] 미니게임 WarriorVsMagician (1) | 2021.05.18 |
[Array] 버리긴 아까운 백준 오답 (feat.MultiArray,No.4434) (0) | 2021.04.21 |
[Array] 2차원 배열의 90도 회전 (0) | 2021.04.20 |