2016-05-03 9 views
0

私はECS/Composition over inheritanceで読書をしていましたが、私が現在取り組んでいるコンセプトを理解するために、現在取り組んでいるテキストアドベンチャーゲームを変更することに決めました。javaで簡単なテキストアドベンチャーゲームを実装する(インターフェイスで作業する)

私はゲームで特定の武器を使って試してみることに決めました。

私のゲームでは、すべての武器がIGameObjectと見なされるというロジックがあります。

武器インタフェース:

public interface IWeapon { 
    int getWeaponDamage(); 
} 

武器クラス:

public class Weapon implements IWeapon { 

    private int damage; 

    public Weapon(int damage) 
    { 
     this.damage = damage; 
    } 

    @Override 
    public int getWeaponDamage() { 

     return this.damage; 
    } 

IGameObjectインタフェース:

public interface IGameObject { 

    String getGameObjectID(); 
    String getGameObjectName(); 
    String getGameObjectDescription(); 
} 

ゲームオブジェクトクラス:

念頭に置いてこのすべてで、私は、次のを思い付きました
public class GameObject implements IGameObject { 

    private String ID; 
    private String name; 
    private String Desc; 

    public GameObject(String ID, String name, String Desc) 
    { 
     this.ID = ID; 
     this.name = name; 
     this.Desc = Desc; 
    } 

このすべて使用抽象クラス:

public abstract class GameGun implements IGameObject, IWeapon { 

    IGameObject gameObj; 
    IWeapon weaponObj; 

    //Left out getters to keep it simple and easy to read. 
    public GameGun(IGameObject game, IWeapon weapon) 
    { 
     this.gameObj = game; 
     this.weaponObj = weapon; 
    } 
    public void fire() 
    { 
     System.out.println("Shot Fired"); 
    } 

    public void reload() 
    { 
     //implementation for reload method 
    } 

はすべて一緒にそれを置くことを:

主な方法:

GameObject sleep = new GameObject("SLP-1","Sleep Weapon","A Custom Made Gun"); 
    Weapon sleepDamage = new Weapon(10); 

    GameGun sleepWeapon = new SleepWeapon(sleep,sleepDamage); 

質問:

  1. 私はただ望みました私の実装が正しいかどうかを知る
  2. そうでない場合は、どうすれば修正できますか?

答えて

0

私は多くのものを修正し、それを動作させました。あなたは今それで遊ぶことができます:D すべての作業コードを持つために要点を取ってください。ここ

CONSOLE

Revolver Gun:Gun reloaded 
Revolver Gun:Gun shots => 10 damage(s) 
Basic Sword:Sword cuts => 5 damage(s) 
Basic Sword:Sword cuts => 5 damage(s) 
Basic Sword:Sword cuts => 5 damage(s) 
Revolver Gun:Gun shots => 10 damage(s) 

CODE

package com.rizze.test.labs.sof.gamegun; 

import org.junit.Test; 

public class GameGunTest { 


    @Test 
    public void betterCode2() { 

     Game sleep = new Game("SLP-1","Sleep Weapon","A Custom Made Gun"); 
     Gun gun = new Gun(); 
     Sword sword = new Sword(); 

     gun.hit(); 
     sword.hit(); 
     sword.hit(); 
     sword.hit(); 
     gun.hit(); 
    } 



    public class Gun implements IWeapon { 

     private int damage; 
     private String name; 

     public Gun(int damage) 
     { 
      this.damage = damage; 
      this.reload(); 
     } 

     public Gun() 
     { 
      this.damage = 10; 
      this.name= "Revolver Gun"; 
      this.reload(); 
     } 

     @Override 
     public int getDamages() { 

      return this.damage; 
     } 

     /** 
     * 
     * @return damages 
     */ 
     @Override 
     public int hit() { 
      System.out.println(this.name + ":Gun shots => "+damage +" damage(s)"); 
      return this.damage; 
     } 

     @Override 
     public void reload() { 
      System.out.println(this.name+":Gun reloaded");   
     } 

    } 


    public class Sword implements IWeapon { 

     private String name; 
     private int damage; 

     public Sword(String name){ 
      this.damage = 5; 
      this.name=name; 

     } 

     public Sword(){ 
      this.damage = 5; 
      this.name="Basic Sword"; 

     } 

     @Override 
     public int getDamages() { 

      return this.damage; 
     } 

     /** 
     * 
     * @return damages 
     */ 
     @Override 
     public int hit() { 
      System.out.println(name+ ":Sword cuts => "+damage +" damage(s)"); 
      return damage; 
     } 

     @Override 
     public void reload() { 
      System.out.println(name+ ":Sword - skipped reload");   
     } 

    } 





    public class Game implements IGame { 

     private String id; 
     private String name; 
     private String desc; 

     public Game(String ID, String name, String Desc) 
     { 
      this.id = ID; 
      this.name = name; 
      this.desc = Desc; 
     } 

     @Override 
     public String getId() { 
      return this.id; 
     } 

     @Override 
     public String getName() { 
      return this.getName(); 
     } 

     @Override 
     public String getDesc() { 
      return this.desc; 
     } 
    } 



} 
//IGAME 

public interface IGame { 

    String getId(); 
    String getName(); 
    String getDesc(); 
} 


//IWEAPON 

package com.rizze.test.labs.sof.gamegun; 

    public interface IWeapon { 
     int getDamages(); 
     int hit(); 
     void reload(); 
    } 

GIST 完全GISTです:https://gist.github.com/jeorfevre/92d093853bfd3fc5c666b915b309abf1

+0

あなたはgamegunオブジェクトを必要とする理由私は理解していませんでしたか?だからbetterCode()の例で私はそれを使用していない!例を見てください!お楽しみください:D – jeorfevre

+0

これは多くのありがとう!私が正しい道を歩いているのを見てうれしかった。すべての武器が銃であるわけではないので、私はGameGun抽象クラスを持っていました。私はまた剣が欲しいかもしれない。 GameGunはガンの基本的なアクションを処理します。一方、武器は戻ってダメージを受けます。 –

+0

コードの90%が機能していました。私はGameGunクラスをやっていません。なぜなら、関数の戻り値を渡すためには、定型コードを何度も繰り返すからです。あなたはゲームを書くためにスカラーを考えてきましたか?コードはリーンで清潔です。それに見えるコストの価値がある!また、解決策があなたのために良かったかどうかを検討する:)。 – jeorfevre