「Error:java: エラー: リリース・バージョン〇はサポートされていません」の解決方法

久しぶりにIntelliJを使ったらハマった。

原因は使用しているJDKのバージョンが、実際にあるものと、IntelliJの設定が異なっているからです。

設定する場所はここ。

Project StructureのProject SDKのバージョンが、PCに入っているバージョンと一致しているか、

と、Project language levelのバージョンが一致しているか。

もう一つは、settingのJava compilerのbytecodeのバージョン。

この設定が全て一致していないと、タイトルにあるようなビルドエラーが出るようです。

焦るわ!

【デザインパターン】Factoryパターン

なんでデザインパターンの話になるとJavaなのかね?

まぁ、概念が解れば他の言語にでも応用は可能だけど。

さくっとサンプルコードを書いてみました。

package org.example.factory.creator;

public abstract class Product {
    public abstract void methodA();
    public abstract void methodB();
}

package org.example.factory.creator;

public abstract class Creator {
    public final Product create() {
        Product product = factoryMethod();
        return product;
    }

    protected abstract Product factoryMethod();
}

package org.example.factory.concrete;

import org.example.factory.creator.Product;

public class ConcreteProduct extends Product {
    public ConcreteProduct() {
        super();
    }

    public void methodA() {

    }

    public void methodB() {

    }
}

package org.example.factory.concrete;

import org.example.factory.creator.Creator;
import org.example.factory.creator.Product;

public class ConcreteCreator extends Creator {

    protected Product factoryMethod() {
        return new ConcreteProduct();
    }
}
package org.example.factory;

import org.example.factory.creator.*;
import org.example.factory.concrete.*;

public class Main {
    public static void main(String[] args) {
        Creator factory = new ConcreteCreator();
        Product object = factory.create();
        object.methodA();
        object.methodB();
    }
}

抽象クラスProductとCreatorを作成します。

Creatorクラスではcreateメソッドを実装していますが、その実態であるfactoryMethod()は抽象メソッドです。

これを使用するにはProductとCreatorを実装したクラスを作成する必要があります。

それがConcreteProductとConcreteCreatorという例で作成しています。

使用する場合は、まずはConcreteCreatorをインスタンス化し、Creator型で保持します。

以後、create()メソッドを使用して、ConcreteProductのインスタンスを作成して使用します。

新しいProductを追加する場合は、同じようにProductとCreatorを実装するクラスを作成し、Creator型で新しいCreatorをインスタンス化して使用すれば対応可能です。

このパターンを使用するメリットとしては、Productを作成する窓口がcreate()メソッドに一本化されます。

Productの初期設定をfactoryMethod()内に実装すれば、Productに対するあれこれ設定をするという余計な手間が省けます。

【北海道大戦】バトルのバランス調整

ちょっとコードを書き換えてバトルのバランス調整をしました。

        private void onClickMouseShowActionResult(asd.Vector2DF pos)
        {
            var result = janken(selectedAttack, selectedDeffece);
            if(result == BattleResult.win)
            {
                _deffencePower -= (int)Math.Floor(_attackPower * (Singleton.Random.NextDouble() + 0.1));
                if(_deffencePower <= 0)
                {
                    Singleton.GameData.BattleResultUpdate(BattleResult.win);
                    var scene = new MainScene();
                    asd.Engine.ChangeScene(scene);
                    _deffenceParam.Text = "戦闘力:0";
                }
                else
                {
                    _deffenceParam.Text = "戦闘力:" + _deffencePower;
                }
            }
            else if(result == BattleResult.lose)
            {
                
                _attackPower -= (int)Math.Floor(_deffencePower * (Singleton.Random.NextDouble() + 0.1));
                if (_attackPower <= 0)
                {
                    Singleton.GameData.BattleResultUpdate(BattleResult.lose);
                    var scene = new MainScene();
                    asd.Engine.ChangeScene(scene);
                    _attackParam.Text = "戦闘力:0";
                }
                else
                {
                    _attackParam.Text = "戦闘力:" + _attackPower;
                }
            }
            _attackResult.Hide();
            _deffenceResult.Hide();
            _status = GameStatus.SelectDeffenceAction;
        }

単純に戦力値で引き算する訳じゃ無くて、

乱数の係数を掛け合わせてみました。

単純計算ではわずかな戦力差でも一撃で決着が付いてしまいましたが、

これによって、僅差であれば、一撃で決着することは無くなります。

あとは札幌強すぎ問題ですね・・・