カテゴリー
Scala

小学生向け、簡単計算問題

import scala.util.control.Breaks

object Main {
  def main(args: Array[String]): Unit = {
    val b1 = new Breaks

    val msg: java.util.Hashtable[String, String] = new java.util.Hashtable[String, String]
    msg.put("monument", "2つの数字は")
    msg.put("answer", "答えは? ")
    msg.put("good", " 正解!\n\n")
    msg.put("no", " 残念!\n\n")
    msg.put("cond", "%d と %d の、")

    val jk: Array[Jyouken] = new Array[Jyouken](4)
    jk(0) = new Jyouken("+", 1, 1)
    jk(1) = new Jyouken("-", 1, 1)
    jk(2) = new Jyouken("*", 1, 1)
    jk(3) = new Jyouken("/", 1, 1)
    val kekka = Array(0,0)

    b1.breakable {
      while (true) {
        for (i <- 1 to 8) {
          val env: Env = new Env(msg, jk((i - 1) / 2), kekka)
          env.read.eval.print
          if (kekka(1) >= 3) b1.break()
        }
        printf("レベルアップします!\n\n")
        jk.foreach(x => x.levelup)
      }
    }
    printf("正解数 %5d, 誤回答 %5d", kekka(0), kekka(1))
  }
}
import java.util
import java.util.{Random, Scanner}

class Env(var msg:util.Hashtable[String, String],val jk:Jyouken, var kekka:Array[Int]){
  private val scanner = new Scanner(System.in)
  private var x :Int = 0
  private var y :Int = 0
  private var z :Int = 0
  private var rVal: Boolean = false

  def read: Env = {
    val w1 = jk.getitibanme * 10
    val w2 = jk.getnibanme * 10
    val keisan =
      jk.en match {
        case "+" => "足し算 "
        case "-" => "引き算 "
        case "*" => "掛け算 "
        case "/" => "割り算 "
      }
    printf("%s", keisan)
    printf(this.msg.get("monument"))
    val rnd2: Random = new Random()
    y = rnd2.nextInt(w2)
    val rnd: Random = new Random
    x = rnd.nextInt(w1)
    if (jk.en == "/"){
      if (x == 0 || y == 0) {
        x += 1; y += 1
      }
    }

    if (jk.en == "-" || jk.en == "/"){
      if (y > x){
        val work = x; x = y; y = work
      }
    }
    printf("%3d, %3d の", x, y)
    this
  }

  def eval: Env = {
    printf(this.msg.get("answer"))
    z = scanner.nextInt()
    rVal =
      jk.en match {
        case "+" => if (z == x + y) true else false
        case "-" => if (z == x - y) true else false
        case "*" => if (z == x * y) true else false
        case "/" => if (z == x / y) true else false
      }
    this
  }

  def print:Env = {
    printf(this.msg.get("cond"), x, y)
    val siki =
      jk.en match {
        case "+" => "和は"
        case "-" => "差は"
        case "*" => "積は"
        case "/" => "商は"
      }
    printf("%s %3d", siki, z)

    if (rVal) {
      printf(this.msg.get("good"))
      kekka(0) += 1
    } else {
      printf(this.msg.get("no"))
      kekka(1) += 1
    }
    this
  }
}
class Jyouken(val en:String, val iti: Int, val ni: Int){
  private val enzan: String = en
  private var itibanme: Int = iti
  private var nibanme: Int = ni

  def levelup: Jyouken = {
    if (enzan == "+" || enzan == "-" || enzan == "/") {
      itibanme += 1; nibanme += 1
    } else {
      itibanme += 1; nibanme = 1
    }
    this
  }
  def getitibanme: Int = itibanme
  def getnibanme: Int = nibanme
}

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

inserted by FC2 system