[Leetcode/scala] 353. 贪吃蛇

请你设计一个 贪吃蛇游戏,该游戏将会在一个 屏幕尺寸 = 宽度 x 高度 的屏幕上运行。如果你不熟悉这个游戏,可以 点击这里 在线试玩。

起初时,蛇在左上角的 (0, 0) 位置,身体长度为 1 个单位。

你将会被给出一个 (行, 列) 形式的食物位置序列。当蛇吃到食物时,身子的长度会增加 1 个单位,得分也会 +1。

食物不会同时出现,会按列表的顺序逐一显示在屏幕上。比方讲,第一个食物被蛇吃掉后,第二个食物才会出现。

当一个食物在屏幕上出现时,它被保证不能出现在被蛇身体占据的格子里。

对于每个 move() 操作,你需要返回当前得分或 -1(表示蛇与自己身体或墙相撞,意味游戏结束)。

示例:

给定 width = 3, height = 2, 食物序列为 food = [[1,2],[0,1]]。

Snake snake = new Snake(width, height, food);

初始时,蛇的位置在 (0,0) 且第一个食物在 (1,2)。

|S| | |
| | |F|

snake.move(“R”); -> 函数返回 0

| |S| |
| | |F|

snake.move(“D”); -> 函数返回 0

| | | |
| |S|F|

snake.move(“R”); -> 函数返回 1 (蛇吃掉了第一个食物,同时第二个食物出现在位置 (0,1))

| |F| |
| |S|S|

snake.move(“U”); -> 函数返回 1

| |F|S|
| | |S|

snake.move(“L”); -> 函数返回 2 (蛇吃掉了第二个食物)

| |S|S|
| | |S|

snake.move(“U”); -> 函数返回 -1 (蛇与边界相撞,游戏结束)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-snake-game
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


这道题很简单, 但是我想说这题可以很好的感受到scala中利用case class,以及“操作符重载”(scala中并没有操作符, 操作符是一个函数,就好比+和a是一样的, 只是定义了+的函数)带来的简洁性。

class SnakeGame(_width: Int, _height: Int, _food: Array[Array[Int]]) {
    case class Pos(x:Int, y:Int){
        def +(that:Pos):Pos = Pos(x+that.x, y + that.y)
    }
    def inBound(p:Pos):Boolean = p.x >= 0 && p.y >= 0 && p.y < _width && p.x < _height
    var snake = List(Pos(0,0))
    var food = _food.toList.map{case Array(x,y) => Pos(x,y)}
    val dir = List('U', 'L', 'R', 'D')
    val delta = List(Pos(-1, 0), Pos(0, -1), Pos(0, 1), Pos(1, 0))    
    def valid(snake:List[Pos]):Boolean = snake.distinct.length == snake.length
    def move(d: String): Int = {
        val shift = delta(dir.indexOf(d.head))
        if(food.nonEmpty && food.head == snake.head + shift){
            snake ::= food.head 
            food = food.tail
            if(valid(snake)) snake.length -1 else -1
        }
        else if(!inBound(snake.head + shift)) -1 
        else {
            snake =(snake.head+shift)::(snake.dropRight(1)) //map {x => x + shift}
            if(valid(snake)) snake.length -1 else -1
        }
    }

}

你可能感兴趣的:([Leetcode/scala] 353. 贪吃蛇)