ProgateでJavaを習得→自分で基礎的なゲーム作ったので説明します

#ProgateのJavaコースで学んだこと
Progateの有料版を使って、Javaコースを全クリアしました。
Javaコースは、2つの種類に分かれています。(2018/06/03時点)
学習コースは、スライドでJavaのしくみを説明してもらいながら、基礎をわかるコースです。
道場コースは、最低限の説明をみてながら学習コースで学んだことをつかって、
一つの作品をつくるコースです。
Javaに対して、僕がすごいと思った機能はこの3つでした。

- メソッド...自分で行動を作って、プログラムに命令をだす仕組み
- オブジェクト指向...プログラムの世界になまえと行動をもったキャラ(クラス)をつくれる仕組み
- 継承...キャラ(クラス)をたくさん作るとき、それに共通する情報や行動をひとつにまとめられる仕組み

１つのキャラクターのことをJavaでは、クラスというそうです。
僕は、この3つの機能を使って一つ自分でゲームを作ることにしました。

#資本論ゲーム
資本論とは、マルクスというおじさんが考えた、
「この世界では、つとめ人やサラリーマンは貧乏で、じぶんの会社や商品をもつ人が金持ちになる」
という考えです。

これを確かめるために僕は、Capitalist(商品を持つひと/以下Cap.)とWorker(つとめ人/以下Wor.)というクラスを作って、彼ら二人目のおかねの動きをみるゲームを作りました。

##二人の基本情報
この二人は、(なまえ,HP,おかね,商品)の4つのステータスでできています。

```
Capitalist person1 = new Capitalist("資本家", 10, 500000, 0);
Worker person2 = new Worker("労働者", 10, 500000, 0);
```
二人とも最初のステータスはおなじです。

##スーパークラス Person
このゲームでは、Cap.とWor.に継承させるPersonというクラスを作りました。

```
class Person {
	protected String name;
	 protected int health;
	 protected int money;
	 protected double product;
	 
	 Person(String name, int health, int money, double product){
	     this.name = name;
	     this.health = health;
	     this.money = money;
	     this.product = product;
	 }
	 
	 public String getName() {
	    return this.name;
	  }
	  public int getHealth() {
	    return this.health;
	  }
	  public int getMoney() {
	    return this.money;
	  }
	  public double getProduct() {
	    return this.product;
	  }
	 
	 public void printData(){
	     System.out.println("名前：" + this.name);
	     System.out.println("体力：" + this.health);
	     System.out.println("貯蓄：" + this.money);
　　　　　　　System.out.println("商品" + this.product);
	 }
	 }
```
二人のステータスはカプセル化させて、このクラスから継承しているクラスからしか引き出せないようにしました。
二人に共通するメソッドは、ステータスを出力させるPrintOut()メソッドです。

##クラス Worker
```
class Worker extends Person{
	 public Worker(String name, int health, int money, double product){
	        super(name, health, money, product);
	    }
	    public void work(){
	     if(this.health == 5){
	         this.health += 5;
	         this.money -= 20000;
	     }else if(this.health > 0){
	        this.health-= 2;
	        this.money+= 10000;
	     }else{
	         this.health += 5;
	         this.money -= 20000;
	     }
	 }
}
```
Wor.は、５日で働いて、２日休むのを繰り返します。
HPがあるときは働き、HPがないときは全快になるまで休みます。
このゲームで
"働く"とは、HPが2減って、お金が10000増えることを指し
"休む"とは、HPが5増えて、お金が20000減ることを指します。

つまり、Wor.は１か月で約20万円を稼ぎ、約16万円使うので、
毎月約4万円ずつたまります。

##クラス Capitalist
```
class Capitalist extends Person{
	public Capitalist(String name, int health, int money, double product){
        super(name, health, money, product);
    }
 
    
    public void manage(){
     invest();
     harvest();
 }
 
 public void invest(){
      if(this.health == 5){
         this.health += 5;
         this.money -= 20000;
     }else if(this.health > 0){
        this.health -= 2;
        this.money -= 10000;
        this.product += 0.02;
     }else{
         this.health += 5;
         this.money -= 20000;
     }
 }
 public void harvest(){
     if(this.product >= 1){
         this.money += (int)product*1000;
     }
 }
}
```
Cap.は、5日投資して、2日休むのを繰り返します。
HPがあるときは投資をして、HPがないときは全快になるまで休みます。
このゲームで
"働く"とは、HPが2減って、お金も10000減り、商品ステータスが0.02増えることを指します。
"休む"とは、HPが5増えて、お金が20000減ることを指します。
つまり、Cap.は１か月で約36万円お金が減ります。

もう一つCap.には収穫(harvest)という行動があります。
Cap.は商品ができると(product >= 1)、その商品の数*1000円が毎日もらえます。
商品は50日かけてやっと一つ出来上がります。

#結果
Cap.とWor.の二人の行動を繰り返していくと、はじめの何年かはWor.のほうがお金を増やしていましたが、数十年後にはCap.のほうが豊かになっていました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/254759/ed8a307b-d506-6ec0-f436-76ba80608480.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/254759/da412c64-5e7f-44df-1c84-911e1b94e579.png)

もちろんこのゲームは正確ではありません。
Wor.には、昇給やボーナス、転職イベントがあるかもしれませんし、
Cap.には、投資失敗や投資の効率化イベントがあるかもしれません。

しかし、資本論でいわれてることは大まかにみても正しいというのがこのグラフで僕はわかりました。
資本家目指してかんばるぞ！