ソースを参照

#7 Moved score into its own struct. Print score and reason of death at game over.

Sacha Ligthert 2 年 前
コミット
763ed9b38a
5 ファイル変更46 行追加20 行削除
  1. 11 13
      game.go
  2. 25 3
      main.go
  3. 2 2
      render.go
  4. 2 2
      snake.go
  5. 6 0
      types.go

+ 11 - 13
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()

+ 25 - 3
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")
+	}
 
 }

+ 2 - 2
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++
 	}

+ 2 - 2
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,

+ 6 - 0
types.go

@@ -20,3 +20,9 @@ type Snake struct {
 	length    int
 	direction int
 }
+
+type Score struct {
+	score        int
+	scoreCounter int
+	reason       int
+}