Advertisement
Guest User

Untitled

a guest
Feb 3rd, 2015
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 6.82 KB | None | 0 0
  1. import scala.util.Random
  2.  
  3. /**
  4.  * Created by koko on 26/01/15.
  5.  */
  6. trait Direction
  7.  
  8. object Up extends Direction
  9.  
  10. object Down extends Direction
  11.  
  12. object Left extends Direction
  13.  
  14. object Right extends Direction
  15.  
  16. object Start15 extends Direction
  17.  
  18. object Start2048 extends Direction
  19.  
  20.  
  21. abstract class Game {
  22.  
  23.   def start(): Unit
  24.  
  25.   def print(board: Iterable[Int]): Unit = {
  26.     val listToString = board.map(elem => "%2d".format(elem)).map(elem => if (elem == " 0") "  " else elem)
  27.     listToString.sliding(4, 4).map(line => line.mkString(" | ", " | ", " | ")).foreach(line => println(line))
  28.   }
  29.  
  30.   def selectionOfGame2(input: String): Unit = {
  31.  
  32.     while (true) {
  33.       val string = Console.readLine("Вы прошли эту игру!!!\n Играть заново : введите 'replay'" +
  34.         " \n Выбрать другую игру: введите 'otherGame' ")
  35.       this.input(string) match {
  36.         case Some(g) => g.start()
  37.         case None => println("Ты ебанулся, такой игры нету!")
  38.       }
  39.     }
  40.  
  41.   }
  42.  
  43.   def input(input: String): Option[Game] = {
  44.     input match {
  45.       case "15" => Some(new Game15())
  46.       case "2048" => Some(new Game2048())
  47.       case x => None
  48.     }
  49.   }
  50.  
  51.  
  52.  
  53.   def parseInput(input: String): Option[Direction] = {
  54.     input match {
  55.       case "j" => Some(Down)
  56.       case "k" => Some(Up)
  57.       case "h" => Some(Left)
  58.       case "l" => Some(Right)
  59.       case x =>
  60.         println("wrong input")
  61.         None
  62.     }
  63.   }
  64. }
  65.  
  66. class Game15 extends Game {
  67.  
  68.   def start(): Unit = {
  69.     val board = shuffleBoard(winBoard, 1)
  70.     play(board)
  71.   }
  72.  
  73.   val n = 4
  74.   type Board = List[Int]
  75.   val winBoard = (1 to n * n - 1).toList :+ 0
  76.  
  77.  
  78.   def play(b: Board): Unit = {
  79.  
  80.     print(b)
  81.     parseInput(Console.readLine()) match {
  82.       case Some(d) =>
  83.         val moved = move(b, d)
  84.         if (moved != winBoard) {
  85.           play(moved)
  86.         }
  87.  
  88.         else if (b == winBoard) {
  89.           print(b)
  90.           println("Win")
  91.         }
  92.  
  93.       case None =>
  94.         println("h - Left\nk - Up\nj - Down\nl - Right")
  95.         play(b)
  96.     }
  97.   }
  98.  
  99.  
  100.   def shuffleBoard(b: Board, moves: Int): Board = {
  101.     if (moves == 0) {
  102.       b
  103.     }
  104.     else {
  105.       val d = Random.shuffle(List(Up, Down, Left, Right)).head
  106.       val moved = move(b, d)
  107.       shuffleBoard(moved, moves - 1)
  108.     }
  109.   }
  110.  
  111.   def move(b: Board, d: Direction): Board = {
  112.     d match {
  113.       case Up => moveU(b)
  114.       case Down => moveD(b)
  115.       case Left => moveL(b)
  116.       case Right => moveR(b)
  117.     }
  118.   }
  119.  
  120.   def moveD(b: Board): Board = {
  121.     val index = b.indexOf(0)
  122.     val down = index + n
  123.     if (index <= 11) {
  124.       swap(b, index, down)
  125.     }
  126.     else b
  127.   }
  128.  
  129.   def moveU(b: Board): Board = {
  130.     val index = b.indexOf(0)
  131.     val up = index - n
  132.     if (index > n - 1) {
  133.       swap(b, index, up)
  134.     }
  135.     else b
  136.   }
  137.  
  138.   def moveL(b: Board): Board = {
  139.     val index = b.indexOf(0)
  140.     val left = index - 1
  141.     if (index % n != 0) {
  142.       swap(b, index, left)
  143.     }
  144.     else b
  145.   }
  146.  
  147.   def moveR(b: Board): Board = {
  148.     val index = b.indexOf(0)
  149.     val right = index + 1
  150.     if (index % n != 3) {
  151.       swap(b, index, right)
  152.     }
  153.     else b
  154.   }
  155.  
  156.   def swap(board: Board, idx1: Int, idx2: Int): Board = {
  157.     val elem1 = board(idx1)
  158.     val elem2 = board(idx2)
  159.     board.updated(idx1, elem2).updated(idx2, elem1)
  160.   }
  161.  
  162.  
  163. }
  164.  
  165. class Game2048 extends Game {
  166.   def start(): Unit = {
  167.     play()
  168.   }
  169.  
  170.   type Board = Array[Int]
  171.   val length = 4
  172.   val board: Board = Array.fill(length * length)(0)
  173.   val winBoard: Board = Array.fill(length * length)(2)
  174.  
  175.  
  176.   def play(): Unit = {
  177.  
  178.     print(board)
  179.     parseInput(Console.readLine()) match {
  180.       case Some(d) =>
  181.         move(board, d)
  182.         if (board != winBoard) {
  183.           play()
  184.         }
  185.  
  186.         else if (board == winBoard) {
  187.  
  188.           println("Win")
  189.         }
  190.  
  191.       case None =>
  192.         println("h - Left\nj - Up\nh - Left\nl - Right")
  193.         play()
  194.     }
  195.   }
  196.  
  197.  
  198.   def zeroTo2(b: Board): Unit = {
  199.     val index = Random.nextInt(15)
  200.     val indexResult = b(index)
  201.     if (indexResult == 0) {
  202.       b.update(index, 2)
  203.     }
  204.     else zeroTo2(b)
  205.   }
  206.  
  207.  
  208.  
  209.   def move(b: Board, d: Direction): Unit = {
  210.     d match {
  211.       case Right => moveRight(b)
  212.       case Left => moveLeft(b)
  213.       case Up => moveUp(b)
  214.     }
  215.   }
  216.  
  217.  
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226.  
  227.  def moveUp(b: Board): Unit = {
  228.     for (r <- 0 to 3) {
  229.  
  230.       for (i <- leftIndex(r) to leftIndex(r) by + 4) {
  231.  
  232.         val sum = b.slice(leftIndex(r), i + 5).sum > 0
  233.  
  234.         while (b(i) == 0 && sum) {
  235.           for (j <- i to leftIndex(r) + 4 by - 4) {
  236.             b.update(j, b(j - 4))
  237.             b.update(j - 4, 0)
  238.           }
  239.         }
  240.  
  241.         if (i != leftIndex(r) && b(i) == b(i - 4)) {
  242.           val result = b(i) + b(i - 4)
  243.           b.update(i - 4, result)
  244.           b.update(i , 0)
  245.         }
  246.  
  247.         else if (i != 12&& i != 13&& i != 13&& i != 14&& i != 15 && b(i) == b(i + 4)) {
  248.           val result = b(i) + b(i + 4)
  249.           b.update(i, result)
  250.           b.update(i + 4, 0)
  251.  
  252.         }
  253.  
  254.       }
  255.     }
  256.     zeroTo2(b)
  257.   }
  258.  
  259.  
  260.   def leftIndex(row: Int): Int = {
  261.     row * length
  262.   }
  263.  
  264.   def rightIndex(row: Int): Int ={
  265.     (row * length) + (length - 1)
  266.   }
  267.  
  268.   def move1(b: Board, from: Int => Int, to: Int => Int, by: Int, hod: Int): Unit = {
  269.     val step = Math.abs(by)
  270.     for (r <- 0 to 3) {
  271.       for (i <- from(r) to to(r) by by ) {
  272.         val sum = b.slice(i + step, from(r) + length).sum > 0
  273.         while (b(i) == 0 && sum ) {
  274.           for (j <- i to to(r) + hod by by) {
  275.             b.update(j, b(j + step))
  276.             b.update(j + step, 0)
  277.           }
  278.         }
  279.  
  280.         if (i != to(r) && b(i) == b(i + step) ) {
  281.           val result = b(i) + b(i + 1)
  282.           b.update(i, result)
  283.           b.update(i + step, 0)
  284.         }
  285.  
  286.         else if ( i != from(r) && b(i) == b(i - step)) {
  287.           val result = b(i) + b(i - step)
  288.           b.update(i - step , result)
  289.           b.update(i, 0)
  290.         }
  291.  
  292.       }
  293.     }
  294.     zeroTo2(b)
  295.   }
  296.  
  297.   def moveRight(b: Board): Unit = move1(b, rightIndex, leftIndex, -1, 1)
  298.   def moveLeft(b: Board): Unit = move1(b, leftIndex, rightIndex, 1, 2)
  299.  
  300. }
  301.  
  302.  
  303. object Main {
  304.  
  305.   def main(args: Array[String]): Unit = {
  306.     while (true) {
  307.       val string = Console.readLine("Выберите игру :\n Пятнашки - введите '15' \n 2048 - введите '2048' ")
  308.       this.selectionOfGame(string) match {
  309.         case Some(g) => g.start()
  310.         case None => println("Ты ебанулся, такой игры нету!")
  311.       }
  312.     }
  313.   }
  314.  
  315.  
  316.   def selectionOfGame(input: String): Option[Game] = {
  317.     input match {
  318.       case "15" => Some(new Game15())
  319.       case "2048" => Some(new Game2048())
  320.       case x => None
  321.     }
  322.   }
  323.  
  324.  
  325. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement