ゲーム開発者が偉ぶるブログ

ゲーム開発のビジネスやマネジメントについて日々思うことをあれこれ偉ぶって書き綴ったもの。

Java | 作ったもの① 吉祥寺クエスト

Javaにて最初に作ったものがこちら。
プログラム言語で作ったものとしても初めてになる。

import java.io.IOException;

public class RPG
{
    //定数
    final static String    NAME_PL = "あなた";    //    主人公の名前
    final static String    NAME_EN = "魔王";    //    エネミーの名前
    final static int    TURN_PL = 0;        //    プレイヤーのターン
    final static int    TURN_EN = 1;        //    エネミーのターン

    //変数
    static int    playerLv = 20;        //    プレイヤーのLV
    static int    playerHp = 30;        //    プレイヤーのHP
    static int    playerMp = 30;        //    プレイヤーのMP
    static int    playerPow = 15;        //    プレイヤーの基礎攻撃力
    static int    playerMag = 20;        //    プレイヤーの基礎魔法力
    static int    enemyHp = 100;        //    エネミーのHP
    static int    enemyPow = 3;        //    エネミーの基礎攻撃力
    static int    checkTurn = 0;        //    現在のバトルターン識別
    static String    str = "メッセージ";        //    メッセージ用の文章
    static boolean    loopFlg = true;            //    メインループ用のフラグ

    //    メイン関数
    public static void main(String[] args) throws IOException
    {
        putStartMsg();                        //    冒頭メッセージを表示

        while( loopFlg ) {                    //    メインループ loopFlgがtrueなら実行
            if( checkTurn == TURN_PL ){
                selectCommand();            //    コマンドを求める
                if( enemyHp <= 0){            //    エネミーのHPが0になったらゲームクリア
                    loopFlg = false;
                    putGameClear();
                }else{
                    checkTurn = TURN_EN;    //    エネミーターンに移行
                }
            }else if( checkTurn == TURN_EN ){
                putMsg( "" );
                enemyAttack();                //    エネミーの攻撃
                if( playerHp <= 0 ){        //    プレイヤーのHPが0になったらゲームオーバー
                    loopFlg = false;
                    putGameOver();
                }else{
                    checkTurn = TURN_PL;    //    プレイヤーターンに移行
                }
            }
        }
    }

       //    メッセージ表示用の関数
    public static void putMsg( String str )
    {
        System.out.println( str );
    }

       //    コマンドを求める表示
    public static void selectCommand() throws IOException
    {
        putMsg( "********************************************************" );
        putStatus();    //    ステータス表示
        putMsg( "" );
        putMsg( " ▼どうする?" );
        putMsg( " 1. たたかう  2. かいふく  3. にげる" );
        System.out.print( ">" );
        exeAction();
    }

       //    ステータス表示
    public static void putStatus()
    {
        putMsg( " 【 " + NAME_PL + " LV:" + playerLv + " HP:"
                 + playerHp + " MP:" + playerMp + " | 魔王 HP:" + enemyHp + " 】" );
    }

       //    コマンド入力を判定して実行
    public static void exeAction() throws IOException
    {
        int    key = inputKey();
        switch( key ) {
            case '1':
                putMsg( "" );
                putMsg( "********************************************************" );
                playerAttack();
                break;
            case '2':
                putMsg( "" );
                putMsg( "********************************************************" );
                playerMagic();
                break;
            case '3':
                putMsg( "" );
                putMsg( "********************************************************" );
                playerEscape();
                break;
            default:
                putMsg( " 1 か 2 か 3 のキーを入力してください" );
                selectCommand();
        }
    }

       //    キー入力を受け付ける関数
    public static int inputKey() throws java.io.IOException
    {
        int    key = System.in.read();
        if( key == 10 || key == 13 ){
            return(inputKey());
        }
        return (key);
    }

       //    プレイヤーの「たたかう」
    public static void playerAttack()
    {
        java.util.Random rdm = new java.util.Random();
        int exeAction = rdm.nextInt( 3 );
        if ( exeAction == 0 ){
            int dmg = rdm.nextInt( 10 );
            dmg += playerPow;
            putMsg( " " + NAME_PL + "は" + NAME_EN + "をなぐりつけた!" );
            putMsg( " パコン!" );
            putMsg( " " + NAME_EN + "は " + dmg + " のダメージを受けた!" );
            enemyHp -= dmg;            //    HPが減る処理
            
        } else if( exeAction == 1 ){
            int dmg = rdm.nextInt( 20 ) + playerPow * 2;
            putMsg( " " + NAME_PL + "の会心のいちげき!" );
            putMsg( " すぱぱぱぱーーーん!!" );
            putMsg( " " + NAME_EN + "のズラがはじけ飛ぶ!" );
            putMsg( " " + NAME_EN + "に " + dmg + " のダメージ!" );
            enemyHp -= dmg;            //    HPが減る処理
        } else if( exeAction == 2 ){
            putMsg( " " + NAME_PL + "はtwitterをみている!" );
        }
    }

       //    プレイヤーの「回復魔法」
    public static void playerMagic()
    {
        putMsg( " " + NAME_PL + "は回復魔法を唱えた!" );
        if( playerMp < 10 ){
            putMsg( " ‥MPが足りない!" );
            return;
        }else{
            putMsg( " ぴろぴろぴろりん!" );
            putMsg( " " + NAME_PL + "のHPが " + playerMag + " 回復した!" );
            playerMp -= 8;                //    MPが減る処理
            playerHp += playerMag;        //    HPが回復する処理
            if( playerHp > 30 ){
                playerHp = 30;
            }
        }
    }

       //    プレイヤーの「逃げる」
    public static void playerEscape()
    {
        putMsg( " " + NAME_PL + "は逃げようとした!すたたたたた" );
        putMsg( " ババッ!" );
        putMsg( " " + NAME_EN + "は素早く回り込んだ!逃げられない!" );
    }

       //    エネミーの攻撃
    public static void enemyAttack()
    {
        java.util.Random rdm = new java.util.Random();
        int exeAction = rdm.nextInt( 5 );
        if( exeAction == 0 || exeAction == 1 ){
            int    dmg = rdm.nextInt( 3 ) + enemyPow;
            putMsg( " " + NAME_EN + "の攻撃!" );
            putMsg( " ズババン!" );
            putMsg( " " + NAME_PL + "に " + dmg + " のダメージ!" );
            playerHp -= dmg;        //    HPが減る処理
        }else if( exeAction == 2 ){
            int dmg = rdm.nextInt(10) + enemyPow * 2;
            putMsg( " " + NAME_EN + "の痛恨のいちげき!" );
            putMsg( " ドゴゴゴゴォン!!" );
            putMsg( " " + NAME_PL + "のお腹がたぷたぷ揺れる!" );
            putMsg( " " + NAME_PL + "に " + dmg + " のダメージ!" );
            playerHp -= dmg;        //    HPが減る処理
        }else if( exeAction == 3 ){
            int dmg = rdm.nextInt( 4 ) + 2;
            putMsg( " " + NAME_EN + "はピコ太郎のモノマネをしてきた!" );
            putMsg( " ‥まったく似ていない!" );
            putMsg( " " + NAME_PL + "はMPが " + dmg + " 減った!" );
            playerMp -= dmg;        //    MPが減る処理
                if( playerMp < 0 ){
                    playerMp = 0;
                }
        }else if( exeAction == 4 ){
            putMsg( " " + NAME_EN + "はメールに返信している!" );
        }
    }

    //    ゲーム冒頭のメッセージ
    public static void putStartMsg()
    {
        putMsg( "" );
        putMsg( "     『吉祥寺クエスト』" );
        putMsg( "" );
        putMsg( "********************************************************" );
        putMsg( " " + NAME_PL + "は買い物のために吉祥寺までフラフラやってきた" );
        putMsg( " ‥と、そのときだった" );
        putMsg( " " + NAME_PL + "の目の前に突如、" + NAME_EN + "が立ちふさがった!" );
    }

    //    ゲームクリアのメッセージ
    public static void putGameClear()
    {
        putMsg( " " + NAME_EN + "は力尽き、満足げな表情をして崩れ落ちた" );
        putMsg( "" );
        putMsg( " " + NAME_PL + "は" + NAME_EN + "を倒した!" );
        putMsg( "" );
        putMsg( " これで吉祥寺に平和が戻るだろう" );
        putMsg( "" );
        putMsg( "     おしまい" );
        putMsg( "********************************************************" );
    }

       //    ゲームオーバーのメッセージ
    public static void putGameOver()
    {
        putMsg( "" );
        putMsg( " " + NAME_PL + "は魔王に敗れ力尽きた‥" );
        putMsg( "" );
        putMsg( " その後、吉祥寺は火の海と化したという" );
        putMsg( "" );
        putMsg( "    GAME OVER" );
        putMsg( "********************************************************" );
    }
}

まず関数とwhile、if、switchとキー入力の受け付けを覚えた後に乱数の与え方を覚え、乱数を使って行動パターンを増やして、確率は同じ行動を複数含めることで無理矢理実現している。

プログラム自体が初めてに近い状態から休日5~6日間くらいでできた感じ。
ここまでの習得はかなり楽だと思う。
ウインドウを表示して画像を表示してそれら表示を描き変えて‥となると突然難易度が跳ね上がる。
なぜなら、ウインドウ周りの実装のためにswingといった標準ライブラリを使うことになり、クラスのインスタンスを作成するかコンストラクタを使うかといったあたりのルールの理解が大変だからだ。

ということで作ったのはRPGのバトルっぽいものであり、真面目なメッセージにしてもつまらないと思いおちゃらけてみたが、いかんせん文章回しのセンスの無さが光る。

しかしひとまず基礎の基礎は学べたように思うので、次のステップとしてはこれをちゃんとウインドウに表示させ、敵画像を用意し、メッセージは1文字ずつ表示させつつ文末でキー入力を受け付けるようにして待機させ、攻撃時には効果音を入れたり、瀕死時には文字の色を変えたりできればと思う。

欲を言えばウインドウを揺らしたりもしたいが‥