From 763ed9b38ab7c51f5eda38e4d5061f786cd6c0cf Mon Sep 17 00:00:00 2001 From: Sacha Ligthert Date: Fri, 24 Nov 2023 22:17:19 +0100 Subject: [PATCH] #7 Moved score into its own struct. Print score and reason of death at game over. --- game.go | 24 +++++++++++------------- main.go | 28 +++++++++++++++++++++++++--- render.go | 4 ++-- snake.go | 4 ++-- types.go | 6 ++++++ 5 files changed, 46 insertions(+), 20 deletions(-) diff --git a/game.go b/game.go index 8eb17a8..b00ad0c 100644 --- a/game.go +++ b/game.go @@ -31,26 +31,19 @@ func quit(screen tcell.Screen) { } } -func gameDirector(screen tcell.Screen, style tcell.Style, keypresses chan int, gamestate chan int) { +func gameDirector(screen tcell.Screen, style tcell.Style, keypresses chan int, gamestate chan int, score *Score) { // Destined to die, even before I was born. defer quit(screen) - var score int = 0 - var scoreCounter int = 1 - // Board size var screenx = 80 var screeny = 24 - // Have snake start at the center of the board - var snakex int = (screenx / 2) - 1 - var snakey int = (screeny / 2) - 1 - // Last direction we went in var lastpress int = 1 - var snake Snake = initSnake(&snakex, &snakey) + var snake Snake = initSnake((screenx/2)-1, (screeny/2)-1) var apple Apple = placeApple(&snake) for { @@ -68,22 +61,25 @@ func gameDirector(screen tcell.Screen, style tcell.Style, keypresses chan int, g if snake.head.x == apple.x && snake.head.y == apple.y { apple = placeApple(&snake) - score += scoreCounter - scoreCounter++ - snake.length = 3 + score + score.score += score.scoreCounter + score.scoreCounter++ + snake.length = 3 + score.score } // Call it quits once the snake hits the border. if snake.head.x == 0 || snake.head.x == screenx-1 { + score.reason = 2 close(gamestate) return } else if snake.head.y == 0 || snake.head.y == screeny-1 { + score.reason = 2 close(gamestate) return } // Check if head intersects with any parts of the body if hitsTail(&snake, snake.head.x, snake.head.y) { + score.reason = 3 close(gamestate) return } @@ -105,7 +101,7 @@ func gameDirector(screen tcell.Screen, style tcell.Style, keypresses chan int, g } -func keyboardProcessor(screen tcell.Screen, keypresses chan int, gamestate chan int) { +func keyboardProcessor(screen tcell.Screen, keypresses chan int, gamestate chan int, score *Score) { defer close(keypresses) for { @@ -117,8 +113,10 @@ func keyboardProcessor(screen tcell.Screen, keypresses chan int, gamestate chan switch ev := ev.(type) { case *tcell.EventKey: if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC { + score.reason = 1 return } else if ev.Rune() == 'q' || ev.Rune() == 'Q' { + score.reason = 1 return } else if ev.Key() == tcell.KeyCtrlL { screen.Sync() diff --git a/main.go b/main.go index 59fb89d..969aa14 100644 --- a/main.go +++ b/main.go @@ -2,6 +2,7 @@ package main import ( + "fmt" "log" ) @@ -12,19 +13,40 @@ func main() { keypresses := make(chan int) gamestate := make(chan int) + // Score tracker + score := Score{ + score: 0, + scoreCounter: 1, + reason: 0, + } + // Initialize tcell and clean up when needed. screen, style, err := initilize() if err != nil { log.Fatalln("Initlization error: ", err) } - defer quit(screen) + //defer quit(screen) // Spawn the Game Director in its own go routine // We give it channels to control... - go gameDirector(screen, style, keypresses, gamestate) + go gameDirector(screen, style, keypresses, gamestate, &score) // A simple function that captures keyboard presses... // ...and sends it to the GameDirector. - keyboardProcessor(screen, keypresses, gamestate) + keyboardProcessor(screen, keypresses, gamestate, &score) + + // Quit the screen + quit(screen) + + // Print the score + fmt.Println("Score: ", score.score) + switch score.reason { + case 1: + fmt.Println("Reason: You quit") + case 2: + fmt.Println("Reason: You hit a wall") + case 3: + fmt.Println("Reason: You ate your tail") + } } diff --git a/render.go b/render.go index 3f2ece8..0eb89e1 100644 --- a/render.go +++ b/render.go @@ -7,9 +7,9 @@ import ( ) // drawScore Print the score -func drawScore(screen tcell.Screen, style tcell.Style, score int) { +func drawScore(screen tcell.Screen, style tcell.Style, score *Score) { var x, y int = 5, 24 - for _, r := range []rune("[ Score: " + strconv.FormatInt(int64(score), 10) + " ]") { + for _, r := range []rune("[ Score: " + strconv.FormatInt(int64(score.score), 10) + " ]") { screen.SetContent(x, y-1, r, nil, style) x++ } diff --git a/snake.go b/snake.go index 395322f..2e84bdb 100644 --- a/snake.go +++ b/snake.go @@ -5,8 +5,8 @@ import ( ) // initSnake Initialize the snake -func initSnake(snakex *int, snakey *int) Snake { - var x, y int = *snakex, *snakey +func initSnake(snakex int, snakey int) Snake { + var x, y int = snakex, snakey snake := Snake{ head: Position{ x: x, diff --git a/types.go b/types.go index b04b6ef..18d08c0 100644 --- a/types.go +++ b/types.go @@ -20,3 +20,9 @@ type Snake struct { length int direction int } + +type Score struct { + score int + scoreCounter int + reason int +}