Re:ゼロから始める文系プログラマ

未経験がプログラミングを通して人生を変える

【Kotlin入門⑦】KotlinでRPGプログラムを作る


スポンサードリンク
 

f:id:ShotaNukumizu_1000:20210627142712p:plain

おはようございます。Shotaです。

今回の記事では、Kotlinのオブジェクト指向の概念を応用して、コーディングだけで動くKotlinのRPGプログラムを作ろうと思います。

本題に入る前に、今回の記事の内容は以下の内容の知識があることを前提として説明します。まだ理解できていない方はこちらの過去記事を参照ください。

【過去の記事】

shotanukumizu-1000.hatenablog.com

shotanukumizu-1000.hatenablog.com

それでは早速、本題に入りましょう。



設計する具体的なプログラムの概要

今回実装するKotlinプログラムの内容は次の通りです。

  • キャラクターの基本ステータスを作る。基本ステータスの項目は名前(String)、HP(int)、攻撃力(int)、守備力(int)

  • キャラクターの基本パラメータを掲載するメソッドを作る

  • 攻撃、逃げるメソッドを作る

  • 攻撃するとき、攻撃したキャラクターの攻撃力から攻撃を受けた相手の守備力を引いた値でダメージを計算する。もし攻撃力が守備力の数値以下であればダメージは0とする

  • 攻撃する前にすでに対象のキャラのhpが0のとき、「〇〇(キャラクター名)は死んでいます」と表示

  • 攻撃した後のキャラのhpが0のとき、「〇〇(キャラクター名)は死んだ」と表示

以上の内容に沿った簡単なRPGプログラムをKotlin言語でコーディングしていきます。


実装


キャラクターの基本ステータス

class Character constructor(name:String, hp:Int, attack:Int, defense: Int) {
    val name = name
    var hp = hp
    val attack = attack
    val defense = defense
}

まず最初にCharacterクラスを作成します。基本ステータスはキャラクターにデフォルトで備わっているので、コンストラクタで表現します。

名前は変数nameString型、HP、攻撃力、守備力はそれぞれhpattackdefenseですべてInt型と定義します。

変数ですが、HPだけは変動するので変数名にvarを書きます。それ以外の変数は定数として扱いますのでvalをその前に書きます。


キャラクターの基本パラメータを表示するメソッド

次にキャラクターの基本パラメータを表示するメソッドを書きます。関数名はshow_statusとして、以下のように書きます。

fun show_status():Unit {
    println("name: $name, hp:$hp, attack: $attack, defense: $defense")
}

今回の場合は変数名ではなく変数の値を出力したいので、変数名に$を置きます。ちなみに今作った関数は返り値を出さないので関数名の最後に:をつけてUnitと書きます。(コードの可読性を上げるため)

先程書いた関数のコードはCharacterクラスのメソッドとして扱うので、クラスの中にこのようにしてコーディングします。

class Character constructor(name:String, hp:Int, attack:Int, defense: Int) {
    val name = name
    var hp = hp
    val attack = attack
    val defense = defense

    fun show_status():Unit {
        println("name: $name, hp:$hp, attack: $attack, defense: $defense")
    }
}

これをmain関数で以下のようにして実行してみましょう。

class Character constructor(name:String, hp:Int, attack:Int, defense: Int) {
    val name = name
    var hp = hp
    val attack = attack
    val defense = defense

    fun show_status():Unit {
        println("name: $name, hp: $hp, attack: $attack, defense: $defense")
    }
}

fun main() {
    val man = Character("shota", 15, 7, 7) // インスタンスの作成
    man.show_status() //メソッドの実行
}

▼実行結果

name: shota, hp: 15, attack: 7, defense: 7

このように基本パラメータを出力できました。


逃げるコマンドの実装

逃げるコマンドを実装するのは簡単です。関数runを作って以下のように定義するだけです。

fun run() {
    println("$name runs.")
}

これをCharacterクラスの中において実行すれば簡単に逃げるコマンドを実装できます。

fun main() {
    val man = Character("shota", 15, 7, 7) // インスタンスの作成
    man.run()
}

▼プログラムの全体像

class Character constructor(name:String, hp:Int, attack:Int, defense: Int) {
    val name = name
    var hp = hp
    val attack = attack
    val defense = defense

    fun show_status():Unit {
        println("name: $name, hp:$hp, attack: $attack, defense: $defense")
    }

    fun run() {
        println("$name runs.")
    }
}

fun main() {
    val man = Character("shota", 15, 7, 7) 
    man.run()
}

▼実行結果

shota runs.

このようにして逃げるコマンドを簡単に実装できます。


攻撃コマンドの実装

次は、攻撃コマンドの実装に入ります。実装する攻撃コマンドの詳細は次の通りです。

  • 攻撃するとき、攻撃したキャラクターの攻撃力から攻撃を受けた相手の守備力を引いた値でダメージを計算する。もし攻撃力が守備力の数値以下であればダメージは0とする

  • 攻撃する前にすでに対象のキャラのhpが0のとき、「〇〇(キャラクター名)は死んでいます」と表示

  • 攻撃した後のキャラのhpが0のとき、「〇〇(キャラクター名)は死んだ」と表示


これら3つの機能をKotlinプログラムで実装していきましょう。


ダメージ計算

  • 攻撃するとき、攻撃したキャラクターの攻撃力から攻撃を受けた相手の守備力を引いた値でダメージを計算する。もし攻撃力が守備力の数値以下であればダメージは0とする


まずはこちらの処理をKotlinプログラムで書いていこうと思います。これをプログラムに起こすと次の通りになります。

fun attack(self: Character, target: Character) {
    println("${self.name} attacks")
    var atk_point = self.attack - target.defense
    if (atk_point<= 0) {
        println("No damage.")
    } else {
        println("The Hit decreased by $atk_point")
    }
}


キャラクターのHPが0になっている場合の処理

  • 攻撃する前にすでに対象のキャラのhpが0のとき、「〇〇(キャラクター名)は死んでいます」と表示

  • 攻撃した後のキャラのhpが0のとき、「〇〇(キャラクター名)は死んだ」と表示


今度はこれらをKotlinプログラムで実装していきます。これらをKotlinプログラムに変換すると以下のようになります。

fun attack(self: Character, target: Character) {
    println("${self.name} attacks")
    if (target.hp <= 0) {
        println("The Character has been dead.")
    }
    var atk_point = self.attack - target.defense
    if (atk_point <= 0) {
        println("No damage.")
    } else {
        println("The Hit decreased by $atk_point")
    }
    if (target.hp == 0) {
        println("${target.name} defeated")
    }
}

この処理は基本的に条件分岐の構文を使ってコンソール上にprintln関数を使って書いているだけなので詳細は割愛します。


プログラムの全体像

今回の記事で紹介したプログラムの全体像は次のようになります。

class Character constructor(name: String, hp: Int, attack: Int, defense: Int) {
    val name = name
    var hp = hp
    val attack = attack
    val defense = defense

    fun show_status(): Unit {
        println("name: $name, hp:$hp, attack: $attack, defense: $defense")
    }

    fun attack(self: Character, target: Character) {
        println("${self.name} attacks")
        var atk_point = self.attack - target.defense
        if (target.defense <= 0) {
            println("No damage.")
        }
        else {
            println("The Hit decreased by $atk_point")
        }
        if (target.hp == 0) {
            println("${target.name} defeated")
        }
    }

    fun run() {
        println("$name runs.")
    }
}

fun main() {
    val man = Character("shota", 15, 7, 7)
    val enemy = Character("slime", 4, 8, 3)
    man.attack(man, enemy)
}


まとめ

今回はKotlinプログラムで簡単なRPGをコンソール上で実行するプログラムを書きました。

今回の記事を参考に、Kotlinについて興味を持ってくだされば幸いです。

今日の記事はこれで終了です。

ソースコード

github.com