| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- package main
- import (
- "log"
- "time"
- "github.com/gdamore/tcell/v2"
- )
- const (
- Left = iota
- Right
- Up
- Down
- )
- func initilize() (tcell.Screen, tcell.Style, error) {
- style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)
- var err error
- screen, err := tcell.NewScreen()
- if err != nil {
- log.Println("Error creating screen: ", err)
- }
- err = screen.Init()
- if err != nil {
- log.Fatalln("Error initializing screen: ", err)
- }
- return screen, style, err
- }
- func quit(screen tcell.Screen) {
- maybePanic := recover()
- screen.Fini()
- if maybePanic != nil {
- panic(maybePanic)
- }
- }
- 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 = 0
- var scoreCounter int = 1
- //var field [80][24]int
- // fill up the field:
- // 0: empty
- // 1: snake
- // 2: apple
- // 3: border
- // 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 apple Apple = placeApple(&snakex, &snakey)
- for {
- // Take input or sleep
- select {
- case press := <-keypresses:
- snakeDirection(press, &snakex, &snakey)
- lastpress = press
- case <-time.After(500 * time.Millisecond):
- snakeDirection(lastpress, &snakex, &snakey)
- }
- if snakex == apple.x && snakey == apple.y {
- apple = placeApple(&snakex, &snakey)
- score += scoreCounter
- scoreCounter++
- }
- // Call it quits once the snake hits the border.
- if snakex == 0 || snakex == screenx-1 {
- close(gamestate)
- return
- } else if snakey == 0 || snakey == screeny-1 {
- close(gamestate)
- 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)
- drawApple(screen, style, apple.x, apple.y)
- drawScore(screen, style, score)
- // Draw the screen
- screen.Show()
- }
- }
- func keyboardProcessor(screen tcell.Screen, keypresses chan int, gamestate chan int) {
- defer close(keypresses)
- for {
- // Poll for an event
- ev := screen.PollEvent()
- // Fetch the type, and check if any other actions are required.
- switch ev := ev.(type) {
- //case *tcell.EventResize:
- // x, y := screen.Size()
- // drawBox(screen, 0, 0, x-1, y-1, style)
- // updateScore(screen, style, snakex)
- // screen.Sync()
- case *tcell.EventKey:
- if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
- return
- } else if ev.Rune() == 'q' || ev.Rune() == 'Q' {
- return
- } else if ev.Key() == tcell.KeyCtrlL {
- screen.Sync()
- } else if ev.Rune() == 'C' || ev.Rune() == 'c' {
- screen.Clear()
- } else if ev.Key() == tcell.KeyLeft {
- keypresses <- Left
- } else if ev.Key() == tcell.KeyRight {
- keypresses <- Right
- } else if ev.Key() == tcell.KeyDown {
- keypresses <- Down
- } else if ev.Key() == tcell.KeyUp {
- keypresses <- Up
- }
- }
- // This function needs to know if the game is over.
- select {
- case <-time.After(10 * time.Millisecond):
- case _, ok := <-gamestate:
- if !ok {
- return
- }
- }
- }
- }
|