数字当てゲーム

30分プログラム、その706。ヒット&ブローという数字当てゲームを作ってみました。
元々は二人用のゲームで

  • 互いに4桁の数字を決める
  • お互いに4桁数字を言い合う
  • 場所と数字が一致すればヒット、数字だけがならボールと答える

というルールです。

最初、ゲームの名前が分からなくて、「ハングマン (ゲーム) - Wikipediaに似たゲーム」と呼んでいたので、そういうクラス名になっています。気にしないでください。

使い方

$ fsc HangMan.scala
$ scala Main
input 4 digit number > 1111
hit: 3, ball: 1
input 4 digit number > 1234
hit: 1, ball: 0
input 4 digit number > 5678
hit: 0, ball: 1
input 4 digit number > 6785
hit: 0, ball: 1
input 4 digit number > 1167
hit: 3, ball: 0
input 4 digit number > 1116
hit: 3, ball: 0
input 4 digit number > 1117
hit: 4, ball: 0
CLEAR!!

ソースコード

class Response(val hit : Int,
	       val ball : Int){
  override def toString =
     "hit: " + hit + ", ball: " + ball
}

object Main {
  def main(args : Array[String]) {
    var hangman = new HangMan

    while(true){
      print("input 4 digit number > ")
      val s = readLine.toList
      (hangman check s) match {
	case None =>
	  println("Error")
	case Some(x) => {
	  println(x)
	  if(x.hit == 4) {
	    println("CLEAR!!")
	    hangman = new HangMan
	  }
	}
      }
    }
  }
}

class HangMan {
  val answer = Math.floor(Math.random * 9999).toInt.toString.toList

  // カンニング
  def peek = answer

  def check(input : List[Char]) : Option[Response] = {
    if(input.size != 4)
      None
    else {
      val res = (answer zip input).foldLeft((0,0)) { (res, in) =>
	if( in._1 == in._2 )
	  (res._1 + 1, res._2)
	else if( answer contains in._2 )
	  (res._1, res._2 + 1)
	else
	  res
      }
      Some(new Response(res._1, res._2))
    }
  }
}