LoginSignup
8
4

More than 3 years have passed since last update.

Scalaで湯婆婆と+αを実装してみる

Posted at

元ネタ

@NemesisさんのJavaで湯婆婆を実装してみるに便乗してみました。

 Scalaいいよね

Scalaの言語仕様もりもりで書くのはアドベントカレンダーのネタとして取っておきたいのでとりあえず動くコード

コード

import scala.sys.exit
import scala.util.Random

class Human() {
    var name: String = _
    var age: Int = Random.nextInt(100)
    var isPig: Boolean = _
}

class Contract(User: Human) {
    val sc = new java.util.Scanner(System.in)
    var isContract: Boolean = false
    var signatureName: String = ""

    def signature(): Unit = {
        signatureName = sc.next()
        User.name = this.signatureName
        isContract = true
    }
}

class Adults extends Human {
    var hasCreditCard: Boolean = _
    var isEatPermission: Boolean = _
}

class Yubaba(var User: Human) extends Adults {
    name = "yubaba"

    def initMessage(): Unit = {
        println("契約書だよ。そこに名前を書きな。")
        val contract = new Contract(User)
        contract.signature()
        if (contract.signatureName == "") {
            println("なんだいここで働きたくないのかい")
            exit()
        }
        println("フン。" + contract.signatureName + "というのかい。贅沢な名だねぇ。")
    }

    def changeName(): Unit = {
        val newNameIndex: Int = Random.nextInt(User.name.length)
        User.name = User.name.substring(newNameIndex, newNameIndex + 1)
        println("今からお前の名前は" + User.name + "だ。いいかい、" + User.name + "だよ。分かったら返事をするんだ、" + User.name + "!!")
    }
}

class Father extends Adults {
    name = "papa"
    hasCreditCard = true
    isEatPermission = false

    def eatFoods(): Unit = {
        if (hasCreditCard && !isEatPermission) isPig = true else isPig = false
    }
}

class Mother(var fiancee: Father) extends Adults {
    name = "mama"

    def eatFoods(): Unit = {
        if (fiancee.hasCreditCard && !fiancee.isEatPermission) isPig = true else isPig = false
    }
}

object Main {
    def main(args: Array[String]): Unit = {
        val sen = new Human
        val father = new Father()
        val mother = new Mother(father)
        val yubaba = new Yubaba(sen)

        father.eatFoods()
        mother.eatFoods()

        yubaba.initMessage()
        yubaba.changeName()
    }
}

Human型

人間をObjectとして人間にしたかったので人間の型をつくりました。

class Human() {
    var name: String = _
    var age: Int = Random.nextInt(100)
    var isPig: Boolean = _
}

年齢は乱数で決めます。
豚かどうか確かめるための値も持たせました。
(千が実は豚かもしれないので)

Adults型とパパとママ

パパとママを実装したかったので大人型をつくりました。

class Adults extends Human {
    var hasCreditCard: Boolean = _
    var isEatPermission: Boolean = _
}

今のところはパパとママ用に作ったので、飯を食う用の許可とクレジットカードの有無を実装しました。
将来的にはもっと増えてくかも?

class Father extends Adults {
    name = "papa"
    hasCreditCard = true
    isEatPermission = false

    def eatFoods(): Unit = {
        if (hasCreditCard && !isEatPermission) isPig = true else isPig = false
    }
}

class Mother(var fiancee: Father) extends Adults {
    name = "mama"

    def eatFoods(): Unit = {
        if (fiancee.hasCreditCard && !fiancee.isEatPermission) isPig = true else isPig = false
    }
}

本題のパパとママです。
パパはクレジットカードを持っていて且つ許可がないときにご飯を食べると豚にさせられます。
ママはパパが上の条件を満たしているときにご飯を食べると豚にさせられます。
これだけです。内部的にはありますが、今回の動作にはなんの影響もありません

(一応湯婆婆も大人なのでAdults型を継承しています。)

湯婆婆

とりあえず元の記事でも上げられていた"名前の入力が空白だった場合"はifで処理しておきました。一回しっかりエラーハンドリングしたんですが、前述したネタのために適当に実装しました。

if (contract.signatureName == "") {
    println("なんだいここで働きたくないのかい")
    exit()
}

最後に

深夜テンションで書いたので結構ガバあります。
マサカリ投げないで><

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4