PageRenderTime 40ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/app/modles/Game.scala

https://bitbucket.org/jmuthya/hangman
Scala | 117 lines | 88 code | 29 blank | 0 comment | 7 complexity | 4b2e9d3c750e106c6e15377c9e307223 MD5 | raw file
  1. package models
  2. import scala.io._
  3. import collection.mutable
  4. import models.MongoDBSetup.mongoDB
  5. import com.mongodb.casbah.Imports._
  6. import scala.util.Random
  7. object Game {
  8. def getPhrases_Guesses(fileString: Iterator[String]):( List[String], List[Int])= {
  9. var phrases : List[String]= List()
  10. var guesses : List[Int] = List()
  11. for (line <- fileString){
  12. phrases = phrases:::List(line.split("[|]")(0))
  13. guesses = guesses ::: List(line.split("[|]")(1).trim.toInt)
  14. }
  15. (phrases, guesses)
  16. }
  17. def create (id:Long, phrase_1: List[String], guesses_1 : List[Int], current_phrase : String, guesses_left:Int) {
  18. val game = MongoDBObject("game_id" -> id, "phrase" -> MongoDBList(phrase_1), "guesses" -> MongoDBList(guesses_1), "current_phrase"->"", "current_guess"-> "_", "guesses_left" ->0, "letters_guessed"->"", "suggestions"->"")
  19. mongoDB += game
  20. }
  21. def save (id: Long, fileString: Iterator[String] ){
  22. val phrase_guesses: (List[String], List[Int]) = Game.getPhrases_Guesses(fileString)
  23. Game.create(id,phrase_guesses._1, phrase_guesses._2, "", 0)
  24. }
  25. def guess_letter(id:Long, letter: Char){
  26. val d = MongoDBObject("game_id"->id)
  27. val cursor = models.MongoDBSetup.mongoDB.findOne(d).getOrElse(throw new Exception)
  28. if (!cursor.get("current_phrase").toString.contains(letter)){
  29. cursor.update("guesses_left", cursor.get("guesses_left").toString.toInt-1:java.lang.Integer)
  30. }
  31. cursor.update("letters_guessed", cursor.get("letters_guessed").toString + " " + letter)
  32. val current_phrase = cursor.get("current_phrase").toString.split(" ")
  33. val current_guess = cursor.get("current_guess").toString.replace(" ", "").split(";")
  34. val simillar = (current_phrase, current_guess).zipped.map((x,y) => (x,y).zipped.map((k,j) => if (k.toLower == letter) k else j))
  35. val final_string = simillar.map(x=>x.map(y=>y + " ")).map(x=>x.reduce((k,j)=> k + j)).reduce((a,b) => a + ";" + b)
  36. cursor.update("current_guess", final_string)
  37. models.MongoDBSetup.mongoDB += cursor
  38. }
  39. def read_from_file(file_name: String):String ={
  40. Source.fromFile(file_name).mkString
  41. }
  42. def train_bigram_model(data: String)={
  43. var m = mutable.Map[Char, Map[Char, Int]]().withDefaultValue(Map[Char, Int]().withDefaultValue(0))
  44. val len = data.length
  45. for (x <- 1 until len){
  46. val c: Int = m(data(x-1))(data(x)) + 1
  47. m(data(x-1)) += (data(x)-> c )
  48. }
  49. m
  50. }
  51. def max_letter(id : Long,c:Char,m : mutable.Map[Char, Map[Char, Int]]) = {
  52. val new_map = m(c)
  53. val sorted_new_map = new_map.toList.sortBy(-_._2)
  54. var suggestions = ""
  55. for (x <- 0 until 5) {
  56. suggestions += sorted_new_map(x)._1 + " "
  57. }
  58. val d = MongoDBObject("game_id"->id)
  59. val cursor = models.MongoDBSetup.mongoDB.findOne(d).getOrElse(throw new Exception)
  60. cursor.update("suggestions", suggestions)
  61. models.MongoDBSetup.mongoDB += cursor
  62. }
  63. def suggest_letter(id: Long, l: Char){
  64. val m = train_bigram_model(read_from_file("training/train.txt"))
  65. val d = MongoDBObject("game_id"->id)
  66. val cursor = models.MongoDBSetup.mongoDB.findOne(d)
  67. val current_guess = "." + cursor.get("current_guess").toString().replace(";", ".")
  68. max_letter(id,l, m)
  69. }
  70. def generate_random_phrase(id: Long) {
  71. val d = MongoDBObject("game_id"->id)
  72. val n = MongoDBObject("guesses_left"->100)
  73. val cursor = models.MongoDBSetup.mongoDB.findOne(d).getOrElse(throw new Exception)
  74. val phrases = cursor.get("phrase").asInstanceOf[com.mongodb.BasicDBList]
  75. val guesses = cursor.get("guesses").asInstanceOf[com.mongodb.BasicDBList]
  76. val phrases_1 = phrases(0).asInstanceOf[com.mongodb.BasicDBList]
  77. val guesses_1 = guesses(0).asInstanceOf[com.mongodb.BasicDBList]
  78. val length = phrases_1.length
  79. val random_index = Random.nextInt(length)
  80. val current_phrase = phrases_1(random_index)
  81. val current_guess = current_phrase.toString.split(" ").map(_.length).map(x=> "_ " *x ).reduce((x:String, y:String) => x + ";" + y)
  82. val current_guesses = guesses_1(random_index)
  83. cursor.update("guesses_left", current_guesses)
  84. cursor.update("current_phrase", current_phrase.toString)
  85. cursor.update("current_guess", current_guess)
  86. models.MongoDBSetup.mongoDB += cursor
  87. }
  88. }