Advertisement
Guest User

Untitled

a guest
Apr 16th, 2014
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 2.22 KB | None | 0 0
  1. object Chess {
  2.  
  3.  
  4.   sealed trait Figure {
  5.     def isThreat(p1: Pos, p2: Pos): Boolean
  6.  
  7.     def getColor: Color
  8.   }
  9.  
  10.   sealed trait Color
  11.  
  12.   case object Black extends Color
  13.  
  14.   case object White extends Color
  15.  
  16.   case class Pos(x: Int, y: Int)
  17.  
  18.  
  19.   case class Queen(color: Color) extends Figure {
  20.     def isThreat(p1: Pos, p2: Pos): Boolean = {
  21.       p1.x == p2.x || p1.y == p2.y || Math.abs(p1.x - p2.x) == Math.abs(p1.y - p2.y)
  22.     }
  23.  
  24.     def getColor: Color = color
  25.   }
  26.  
  27.   case class Pawn(color: Color) extends Figure {
  28.     def isThreat(p1: Pos, p2: Pos): Boolean = {
  29.       val isThreatToBlackByY = p1.y == p2.y + 1 && color == White
  30.       val isThreatToWhiteByY = p1.y == p2.y - 1 && color == Black
  31.       (isThreatToBlackByY || isThreatToWhiteByY) && Math.abs(p1.x - p2.x) == 1
  32.     }
  33.     def getColor: Color = color
  34.   }
  35.  
  36.   type Board = List[(Pos, Figure)]
  37.  
  38.  
  39.   def getBoards(figures: List[Figure], size: Int): List[Board] = {
  40.     def extend(left: List[Figure]): List[Board] =
  41.       left match {
  42.         case Nil => List(List())
  43.         case f :: fs =>
  44.           for {
  45.             board <- extend(fs)
  46.             x <- 1 to size
  47.             y <- 1 to size
  48.             p = Pos(x, y)
  49.             if board.forall {
  50.               case (pos, figure) => p != pos && (!f.isThreat(p, pos) || f.getColor == figure.getColor)
  51.             }
  52.           } yield (p, f) :: board
  53.       }
  54.     extend(figures)
  55.   }
  56.  
  57.   def main(args: Array[String]) {
  58.     val figures = List(Pawn(Black), Pawn(White))
  59.     val size = 2
  60.     for (board <- getBoards(figures, size)) {
  61.       println("----- board ------")
  62.       printBoard(board, size)
  63.     }
  64.   }
  65.  
  66.   def printBoard(b: Board, size: Int) {
  67.     for (x <- 1 to size) {
  68.       for (y <- 1 to size)
  69.         b.find {
  70.           case (pos, _) => pos.x == x && pos.y == y
  71.         } match {
  72.           case None => print(" XX")
  73.           case Some((pos, figure)) => {
  74.             val symbol = figure match {
  75.               case Queen(_) => "Q"
  76.               case Pawn(_) => "P"
  77.               case _ => "?"
  78.             }
  79.             val color = if (figure.getColor == White) "W"
  80.             else "B"
  81.             print(s" ${symbol}${color}")
  82.           }
  83.         }
  84.       println()
  85.     }
  86.   }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement