Advertisement
Guest User

Untitled

a guest
May 25th, 2019
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.30 KB | None | 0 0
  1. package exercises
  2.  
  3. import examples.States._
  4.  
  5. // Написать крестики-нолики
  6. // На вход список клетка - игрок
  7. // По списку проходим последовательно
  8. // Если клетка, на которую пытаемся сходить - занята,
  9. // ничего не происходит, ход сгорает, идём дальше
  10. // Пустой инпут - ничья
  11. // Вывести рез-т игры для заданных входных данных
  12. // while, return и var запрещены
  13. // try catch не использовать
  14. // 5 баллов
  15.  
  16. object States {
  17.  
  18. sealed trait Player
  19.  
  20. case object X extends Player
  21.  
  22. case object O extends Player
  23.  
  24. sealed trait Cell
  25.  
  26. case object AA extends Cell
  27.  
  28. case object AB extends Cell
  29.  
  30. case object AC extends Cell
  31.  
  32. case object BA extends Cell
  33.  
  34. case object BB extends Cell
  35.  
  36. case object BC extends Cell
  37.  
  38. case object CA extends Cell
  39.  
  40. case object CB extends Cell
  41.  
  42. case object CC extends Cell
  43.  
  44. case class Game(cells: Map[Cell, Player] = Map())
  45.  
  46. type GameState = State[Game, (Cell, Player)]
  47.  
  48. val winMsg: Player => String = (plr: Player) => s"Der Spieler $plr hat gewonnen"
  49. val standOffMsg = "Unentschieden"
  50.  
  51. def getGame(inp: List[(Cell, Player)], gm: Game): Game = Game(inp.reverse.toMap)
  52.  
  53.  
  54. def getLast(inp: List[(Cell, Player)]): (Cell, Player) = {
  55. if (inp.isEmpty) {
  56. (CC, O)
  57. }
  58. else inp.last
  59. }
  60.  
  61. def play(input: List[(Cell, Player)]): GameState = new GameState(game => (getLast(input), getGame(input, game)))
  62.  
  63. def helpFunc(d: List[List[Cell]], g: Game): List[Player] = {
  64. d.foldLeft(Nil: List[Player]) { (acc, next) =>
  65. if (acc contains g.cells(next.head)) acc
  66. else g.cells(next.head) :: acc
  67. }.reverse
  68. }
  69.  
  70. def getCheck(wins: List[List[Cell]], g: Game): Option[Player] = {
  71. val d = wins.filter((l: List[Cell]) => g.cells.contains(l(0)) && g.cells.contains(l(1)) && g.cells.contains(l(2))).
  72. filter((l: List[Cell]) => g.cells(l(0)) == g.cells(l(1)) && g.cells(l(1)) == g.cells(l(2)) && g.cells(l(0)) == g.cells(l(2)))
  73. val s = helpFunc(d, g)
  74. if (s.length > 1 || s.isEmpty) {
  75. None
  76. }
  77. else {
  78. Option(s.head)
  79. }
  80. }
  81.  
  82. def getWinner(g: Game): Option[Player] = {
  83. val wins1 = List(AA, BB, CC)
  84. val wins2 = List(AA, AB, AC)
  85. val wins3 = List(BA, BB, BC)
  86. val wins4 = List(CA, CB, CC)
  87. val wins5 = List(CA, BB, AC)
  88. val wins6 = List(AA, BA, CA)
  89. val wins7 = List(AB, BB, CB)
  90. val wins8 = List(AC, BC, CC)
  91. val wins: List[List[Cell]] = List(wins1, wins2, wins3, wins4, wins5, wins6, wins7, wins8)
  92. getCheck(wins, g)
  93. }
  94.  
  95. def result(g: Game): String = {
  96. if (g.cells.isEmpty) {
  97. "Unentschieden"
  98. }
  99. else {
  100. getWinner(g) match {
  101. case Some(i) => s"Der Spieler $i hat gewonnen"
  102. case None => "Unentschieden"
  103. }
  104. }
  105. }
  106.  
  107. def main(args: Array[String]): Unit = {
  108. val game = Game()
  109. val p = List((AA, X), (AB, X), (AC, X), (BA, O), (BB, O), (BC, O))
  110. val (_, gm) = play(p).run(game)
  111.  
  112. val a = result(gm)
  113. val b = winMsg(O)
  114.  
  115. val p2 = List()
  116.  
  117. val (_, gm2) = play(p2).run(game)
  118.  
  119. val c = result(gm2)
  120. val d = standOffMsg
  121. }
  122.  
  123.  
  124. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement