|
|
@@ -14,6 +14,11 @@ const (
|
|
|
Down
|
|
|
)
|
|
|
|
|
|
+const (
|
|
|
+ Over = iota
|
|
|
+ Running
|
|
|
+)
|
|
|
+
|
|
|
func initilize() (tcell.Screen, tcell.Style, error) {
|
|
|
style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)
|
|
|
|
|
|
@@ -38,9 +43,12 @@ func quit(screen tcell.Screen) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func game_director(screen tcell.Screen, style tcell.Style, keypresses chan int) {
|
|
|
+func gameDirector(screen tcell.Screen, style tcell.Style, keypresses chan int, gamestate chan int) {
|
|
|
+
|
|
|
+ // Destined to die, even before I was born.
|
|
|
+ defer quit(screen)
|
|
|
|
|
|
- //var score int
|
|
|
+ //var score int = 0
|
|
|
//var scoreCounter int = 1
|
|
|
//var field [80][24]int
|
|
|
// fill up the field:
|
|
|
@@ -49,56 +57,59 @@ func game_director(screen tcell.Screen, style tcell.Style, keypresses chan int)
|
|
|
// 2: apple
|
|
|
// 3: border
|
|
|
|
|
|
- x, y := screen.Size()
|
|
|
- drawBox(screen, 0, 0, x-1, y-1, style)
|
|
|
-
|
|
|
- var snakex int = 3
|
|
|
- var snakey int = 12
|
|
|
- //var lastpress int
|
|
|
+ var screenx = 80
|
|
|
+ var screeny = 24
|
|
|
+ var snakex int = (screenx / 2) - 1
|
|
|
+ var snakey int = (screeny / 2) - 1
|
|
|
+ var lastpress int = 1
|
|
|
|
|
|
for {
|
|
|
|
|
|
- // Clean the screen
|
|
|
- screen.Clear()
|
|
|
-
|
|
|
- drawBox(screen, 0, 0, x-1, y-1, style)
|
|
|
- updateScore(screen, style, snakex)
|
|
|
-
|
|
|
+ // Take input or sleep
|
|
|
select {
|
|
|
case press := <-keypresses:
|
|
|
- if press == Left {
|
|
|
- snakex--
|
|
|
- } else if press == Right {
|
|
|
- snakex++
|
|
|
- } else if press == Up {
|
|
|
- snakey--
|
|
|
- } else if press == Down {
|
|
|
- snakey++
|
|
|
- }
|
|
|
- case <-time.After(1 * time.Second):
|
|
|
- snakex++
|
|
|
+ snakeDirection(press, &snakex, &snakey)
|
|
|
+ lastpress = press
|
|
|
+ case <-time.After(500 * time.Millisecond):
|
|
|
+ snakeDirection(lastpress, &snakex, &snakey)
|
|
|
}
|
|
|
|
|
|
- //updateSnakePos(&snakex, &snakey)
|
|
|
+ if snakex == 0 || snakex == screenx-1 {
|
|
|
+ gamestate <- Over
|
|
|
+ return
|
|
|
+ } else if snakey == 0 || snakey == screeny-1 {
|
|
|
+ gamestate <- Over
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // Clean the screen
|
|
|
+ screen.Clear()
|
|
|
+
|
|
|
+ // Draw the screen
|
|
|
+ drawBox(screen, 0, 0, screenx-1, screeny-1, style)
|
|
|
+ drawCoords(screen, style, &snakex, &snakey)
|
|
|
drawSnake(screen, style, snakex, snakey)
|
|
|
|
|
|
// Draw the screen
|
|
|
screen.Show()
|
|
|
|
|
|
- if snakex > 75 {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- time.Sleep(500 * time.Millisecond)
|
|
|
-
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
-func keyboardProcessor(screen tcell.Screen, keypresses chan int) {
|
|
|
+func keyboardProcessor(screen tcell.Screen, keypresses chan int, gamestate chan int) {
|
|
|
defer close(keypresses)
|
|
|
|
|
|
for {
|
|
|
+
|
|
|
+ select {
|
|
|
+ case state := <-gamestate:
|
|
|
+ if state == Over {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ case <-time.After(10 * time.Millisecond):
|
|
|
+ }
|
|
|
+
|
|
|
// Poll for an event
|
|
|
ev := screen.PollEvent()
|
|
|
|
|
|
@@ -110,7 +121,6 @@ func keyboardProcessor(screen tcell.Screen, keypresses chan int) {
|
|
|
// updateScore(screen, style, snakex)
|
|
|
// screen.Sync()
|
|
|
case *tcell.EventKey:
|
|
|
- //fmt.Println("Key: ",ev.Rune())
|
|
|
if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
|
|
|
return
|
|
|
} else if ev.Rune() == 'q' || ev.Rune() == 'Q' {
|
|
|
@@ -129,6 +139,7 @@ func keyboardProcessor(screen tcell.Screen, keypresses chan int) {
|
|
|
keypresses <- Up
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
|
|
|
}
|