とあるサイトを使って、勉強のために少しプログラムを書いてみました。
こちらがサイトになります。→リンク
コンストラクタや、引数、戻り値などの勉強のためにやっております。基本的なことからあまり理解ができておらず、簡単なことかもしれませんが、よろしくお願い致します。
Java
1class Actor extends Thread{ 2 private int hitpoint; 3 private int offence; 4 private int deffence; 5 private String name; 6 private Actor target; 7 private int deley = 1; 8 9 public int getHitPoint() { 10 return hitpoint; 11 } 12 13 public int getOffence() { 14 return offence; 15 } 16 17 public int getDeffence() { 18 return deffence; 19 } 20 public Actor getTarget() { 21 return target; 22 } 23 24 public void setHitPoint(int hitpoint) { 25 this.hitpoint = hitpoint; 26 } 27 public void setAttack(int offence) { 28 this.offence = offence; 29 } 30 public void setDeffence(int deffence) { 31 this.deffence = deffence; 32 } 33 34 public void setTarget(Actor target) { 35 this.target = target; 36 } 37 public boolean isDead() { 38 return hitpoint<=0; 39 } 40 41 public Actor(String name,int hitpoint,int offence,int deffence) { 42 this.name = name; 43 this.hitpoint = hitpoint; 44 this.offence = offence; 45 this.deffence = deffence; 46 } 47 48 public void attack(Actor pActor) { 49 int damage = offence - pActor.getDeffence(); 50 if(damage >= 0) { 51 pActor.setHitPoint(pActor.getHitPoint()-damage); 52 System.out.println(name+"は"+pActor.getName()+"に"+damage+"のダメージを与えた!"); 53 54 }else if(damage<=0) { 55 System.out.println("ダメージを受けない"); 56 } 57 58 59 } 60 61 public void run() { 62 while(true) { 63 try { 64 sleep(1 * deley); 65 66 }catch(InterruptedException e) { 67 } 68 if(isDead()) 69 break; 70 attack(target); 71 } 72 } 73 }
Java2
1public class MyMain { 2 3 4 public static void main(String[] args) { 5 6 Actor Hero = new Actor("主人公",100,25,15); 7 8 Actor Enemy1 = new Actor("敵1",60,30,5); 9 10 Hero.setTarget(Enemy1); 11 Enemy1.setTarget(Hero); 12 Hero.start(); 13 Enemy1.start(); 14 15 } 16}
こちらを実行すると、無限ループになってしまいます。ひとつ前に行った、
Java3
1while(true) { 2 3 Hero.attack(Enemy1); 4 if(Enemy1.getHitPoint() <= 0) { 5 System.out.println(Enemy1.getName() +"を倒した!"); 6 break; 7 } 8 Enemy1.attack(Hero); 9 if(Hero.getHitPoint() <= 0) { 10 System.out.println(Hero.getName() + "は倒されてしまった。"); 11 break; 12} 13} 14
こちらはしっかりと動作しました。
attack(target);という表記がありますが、サイトではattack();のみでした。
このままではコンパイルが通らなかったので、勝手にtargetと入れました。これのせいでしょうか?
よろしくお願い致します。
現在、一度試したところ、実行する度に結果が変わるという現象が起きています。
実行の結果です。
敵1はThread-0に15のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
敵1はThread-0に15のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
敵1はThread-0に15のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
以下無限ループ
二回目
主人公はThread-1に20のダメージを与えた!
敵1はThread-0に15のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
敵1はThread-0に15のダメージを与えた!
敵1はThread-0に15のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
以下無限ループ
デバッグ一回目
敵1はThread-0に15のダメージを与えた!
敵1はThread-0に15のダメージを与えた!
以下無限ループ
デバッグ二回目
主人公はThread-1に20のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
主人公はThread-1に20のダメージを与えた!
どういうことでしょうか。。。