Advertisement
Guest User

Untitled

a guest
Feb 2nd, 2015
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 3.10 KB | None | 0 0
  1. abstract class Game {
  2.  
  3.   def start(): Unit
  4.  
  5.   def print(board: Iterable[Int]): Unit = {
  6.     val listToString = board.map(elem => "%2d".format(elem)).map(elem => if (elem == " 0") "  " else elem)
  7.     listToString.sliding(4, 4).map(line => line.mkString(" | ", " | ", " | ")).foreach(line => println(line))
  8.   }
  9.  
  10.   def selectionOfGame2(input: String): Unit = {
  11.  
  12.     while (true) {
  13.       val string = Console.readLine("Вы прошли эту игру!!!\n Играть заново : введите 'replay'" +
  14.         " \n Выбрать другую игру: введите 'otherGame' ")
  15.       this.input(string) match {
  16.         case Some(g) => g.start()
  17.         case None => println("Ты ебанулся, такой игры нету!")
  18.       }
  19.     }
  20.  
  21.   }
  22.  
  23.   def input(input: String): Option[Game] = {
  24.     input match {
  25.       case "15" => Some(new Game15())
  26.       case "2048" => Some(new Game2048())
  27.       case x => None
  28.     }
  29.   }
  30.  
  31.  
  32.   def parseInput(input: String): Option[Direction] = {
  33.     input match {
  34.       case "j" => Some(Down)
  35.       case "k" => Some(Up)
  36.       case "h" => Some(Left)
  37.       case "l" => Some(Right)
  38.       case x =>
  39.         println("wrong input")
  40.         None
  41.     }
  42.   }
  43. }
  44.  
  45. class Game15 extends Game {
  46.  
  47.   def start(): Unit = {
  48.     val board = shuffleBoard(winBoard, 1)
  49.     play(board)
  50.   }
  51.  
  52.   val n = 4
  53.   type Board = List[Int]
  54.   val winBoard = (1 to n * n - 1).toList :+ 0
  55.  
  56.  
  57.   def play(b: Board): Unit = {
  58.  
  59.     print(b)
  60.     parseInput(Console.readLine()) match {
  61.       case Some(d) =>
  62.         val moved = move(b, d)
  63.         if (moved != winBoard) {
  64.           play(moved)
  65.         }
  66.  
  67.         else if (b == winBoard) {
  68.           print(b)
  69.           println("Win")
  70.         }
  71.  
  72.       case None =>
  73.         println("h - Left\nj - Up\nh - Left\nl - Right")
  74.         play(b)
  75.     }
  76.   }
  77.  
  78.  
  79.   def shuffleBoard(b: Board, moves: Int): Board = {
  80.     if (moves == 0) {
  81.       b
  82.     }
  83.     else {
  84.       val d = Random.shuffle(List(Up, Down, Left, Right)).head
  85.       val moved = move(b, d)
  86.       shuffleBoard(moved, moves - 1)
  87.     }
  88.   }
  89.  
  90.   def move(b: Board, d: Direction): Board = {
  91.     d match {
  92.       case Up => moveU(b)
  93.       case Down => moveD(b)
  94.       case Left => moveL(b)
  95.       case Right => moveR(b)
  96.     }
  97.   }
  98.  
  99.   def moveD(b: Board): Board = {
  100.     val index = b.indexOf(0)
  101.     val down = index + n
  102.     if (index <= 11) {
  103.       swap(b, index, down)
  104.     }
  105.     else b
  106.   }
  107.  
  108.   def moveU(b: Board): Board = {
  109.     val index = b.indexOf(0)
  110.     val up = index - n
  111.     if (index > n - 1) {
  112.       swap(b, index, up)
  113.     }
  114.     else b
  115.   }
  116.  
  117.   def moveL(b: Board): Board = {
  118.     val index = b.indexOf(0)
  119.     val left = index - 1
  120.     if (index % n != 0) {
  121.       swap(b, index, left)
  122.     }
  123.     else b
  124.   }
  125.  
  126.   def moveR(b: Board): Board = {
  127.     val index = b.indexOf(0)
  128.     val right = index + 1
  129.     if (index % n != 3) {
  130.       swap(b, index, right)
  131.     }
  132.     else b
  133.   }
  134.  
  135.   def swap(board: Board, idx1: Int, idx2: Int): Board = {
  136.     val elem1 = board(idx1)
  137.     val elem2 = board(idx2)
  138.     board.updated(idx1, elem2).updated(idx2, elem1)
  139.   }
  140.  
  141.  
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement