下はMain.scalaです。ハイライターがScala無かったので、JavaScriptになってます。
import java.util.Random
object Main {
def main(args: Array[String]): Unit = {
val msg: java.util.Hashtable[String, String] = new java.util.Hashtable[String, String]
//val msg = collection.mutable.HashMap.empty[String, String]
//msg.put("yama","山は")
msg.put("you", "あなた")
msg.put("comp", "コンピュータ")
msg.put("took", "%sが,山 %d から%d個取った\n")
msg.put("take", "石を取って!(1〜%d) > ")
msg.put("cond", "現在の石の数: %d, %d, %d\n\n")
msg.put("win", "%sの勝ち\n")
val rnd: Random = new Random
val bVal: Boolean = rnd.nextBoolean
val env: Env = new Env(Array[Int](2, 4, 5), bVal, msg)
env.print
System.out.printf("%sが先攻\n", if (bVal) {
msg.get("you")
}
else {
msg.get("comp")
})
while (env.num(0) > 0 || env.num(1) > 0 || env.num(2) > 0) {
env.read
env.eval
env.print
}
System.out.printf(msg.get("win"), if (env.turn) {
msg.get("you")
}
else {
msg.get("comp")
})
}
}
下はEnv.scalaですが、やはりJavaScriptになってます。
import java.util
import java.util.{Random, Scanner}
import scala.util.control.Breaks
class Env(var num: Array[Int], var turn: Boolean, var msg:util.Hashtable[String, String]) {
this.msg = msg
private val scanner = new Scanner(System.in)
private var x: Int = -1
private var y: Int = -1
def read: Env = {
val b1 = new Breaks
if (!this.turn) {
this
} else {
b1.breakable {
while (true) {
System.out.printf("山は?(1~3) > ")
this.y = scanner.nextInt() - 1
System.out.printf(this.msg.get("take"), if (this.num(this.y) > 3) 3
else this.num(this.y))
this.x = scanner.nextInt
if (this.x > 0 && this.x <= this.num(this.y))
b1.break()
}
}
this
}
}
def eval: Env = {
val b1 = new Breaks
if (!this.turn) {
b1.breakable {
while (true) {
val rnd2: Random =new Random()
this.y = rnd2.nextInt(3)
val rnd: Random = new Random
this.x = rnd.nextInt(3) + 1
if (this.x <= this.num(this.y))
b1.break()
}
}
}
this.num(this.y) -= this.x
this.turn = !this.turn
this
}
def print: Env = {
if (this.turn && !(this.y == -1)) System.out.printf(this.msg.get("took"), this.msg.get("comp"), this.y + 1, this.x)
System.out.printf(this.msg.get("cond"), this.num(0),this.num(1), this.num(2))
this
}
}