diff --git a/snake.go b/snake.go index edee654..395322f 100644 --- a/snake.go +++ b/snake.go @@ -35,6 +35,8 @@ func initSnake(snakex *int, snakey *int) Snake { func drawSnake(screen tcell.Screen, style tcell.Style, snake *Snake) { + var tail []rune + // Reverse tail, chop of the excesses, snake.tail = ReverseSlice(snake.tail) if len(snake.tail) > snake.length { @@ -43,9 +45,32 @@ func drawSnake(screen tcell.Screen, style tcell.Style, snake *Snake) { // reverse it back to the original order, replace the tail in `snake` snake.tail = ReverseSlice(snake.tail) + for i, j := range snake.tail { + // The Tail end + if i == 0 { + left := getDirection(j, snake.tail[i+1]) + right := getDirection(j, snake.tail[i+1]) + tail = append(tail, getLineType(left, right)) + + // The Bit behind the head + } else if i == len(snake.tail)-1 { + left := getDirection(j, snake.tail[i-1]) + right := getDirection(j, snake.head) + tail = append(tail, getLineType(left, right)) + + // The body of the snake + } else { + left := getDirection(j, snake.tail[i-1]) + right := getDirection(j, snake.tail[i+1]) + tail = append(tail, getLineType(left, right)) + + } + + } + // Draw the body - for _, segment := range snake.tail { - screen.SetContent(segment.x, segment.y, '+', nil, style) + for i, segment := range snake.tail { + screen.SetContent(segment.x, segment.y, tail[i], nil, style) } // Draw the head, make sure it is on top of everything @@ -109,3 +134,41 @@ func validateDirection(snake *Snake, direction int) bool { return true } } + +func getDirection(from Position, to Position) int { + + var direction int + + if from.x-to.x == 1 { + direction = Left + } else if from.x-to.x == -1 { + direction = Right + } else if from.y-to.y == 1 { + direction = Up + } else if from.y-to.y == -1 { + direction = Down + } + + return direction +} + +func getLineType(from int, to int) rune { + + var lineType rune + + if (from == Left && to == Down) || (from == Down && to == Left) { + lineType = '┐' + } else if (from == Up && to == Right) || (from == Right && to == Up) { + lineType = '└' + } else if (from == Left && to == Right) || (from == Right && to == Left) { + lineType = '─' + } else if (from == Left && to == Up) || (from == Up && to == Left) { + lineType = '┘' + } else if (from == Right && to == Down) || (from == Down && to == Right) { + lineType = '┌' + } else if (from == Up && to == Down) || (from == Down && to == Up) { + lineType = '│' + } + + return lineType +}