game.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package main
  2. import (
  3. "log"
  4. "time"
  5. "github.com/gdamore/tcell/v2"
  6. )
  7. const (
  8. Left = iota
  9. Right
  10. Up
  11. Down
  12. )
  13. func initilize() (tcell.Screen, tcell.Style, error) {
  14. style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)
  15. var err error
  16. screen, err := tcell.NewScreen()
  17. if err != nil {
  18. log.Println("Error creating screen: ", err)
  19. }
  20. err = screen.Init()
  21. if err != nil {
  22. log.Fatalln("Error initializing screen: ", err)
  23. }
  24. return screen, style, err
  25. }
  26. func quit(screen tcell.Screen) {
  27. maybePanic := recover()
  28. screen.Fini()
  29. if maybePanic != nil {
  30. panic(maybePanic)
  31. }
  32. }
  33. func game_director(screen tcell.Screen, style tcell.Style, keypresses chan int) {
  34. //var score int
  35. //var scoreCounter int = 1
  36. //var field [80][24]int
  37. // fill up the field:
  38. // 0: empty
  39. // 1: snake
  40. // 2: apple
  41. // 3: border
  42. x, y := screen.Size()
  43. drawBox(screen, 0, 0, x-1, y-1, style)
  44. var snakex int = 3
  45. var snakey int = 12
  46. //var lastpress int
  47. for {
  48. // Clean the screen
  49. screen.Clear()
  50. drawBox(screen, 0, 0, x-1, y-1, style)
  51. updateScore(screen, style, snakex)
  52. select {
  53. case press := <-keypresses:
  54. if press == Left {
  55. snakex--
  56. } else if press == Right {
  57. snakex++
  58. } else if press == Up {
  59. snakey--
  60. } else if press == Down {
  61. snakey++
  62. }
  63. case <-time.After(1 * time.Second):
  64. snakex++
  65. }
  66. //updateSnakePos(&snakex, &snakey)
  67. drawSnake(screen, style, snakex, snakey)
  68. // Draw the screen
  69. screen.Show()
  70. if snakex > 75 {
  71. return
  72. }
  73. time.Sleep(500 * time.Millisecond)
  74. }
  75. }
  76. func keyboardProcessor(screen tcell.Screen, keypresses chan int) {
  77. defer close(keypresses)
  78. for {
  79. // Poll for an event
  80. ev := screen.PollEvent()
  81. // Fetch the type, and check if any other actions are required.
  82. switch ev := ev.(type) {
  83. //case *tcell.EventResize:
  84. // x, y := screen.Size()
  85. // drawBox(screen, 0, 0, x-1, y-1, style)
  86. // updateScore(screen, style, snakex)
  87. // screen.Sync()
  88. case *tcell.EventKey:
  89. //fmt.Println("Key: ",ev.Rune())
  90. if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
  91. return
  92. } else if ev.Rune() == 'q' || ev.Rune() == 'Q' {
  93. return
  94. } else if ev.Key() == tcell.KeyCtrlL {
  95. screen.Sync()
  96. } else if ev.Rune() == 'C' || ev.Rune() == 'c' {
  97. screen.Clear()
  98. } else if ev.Key() == tcell.KeyLeft {
  99. keypresses <- Left
  100. } else if ev.Key() == tcell.KeyRight {
  101. keypresses <- Right
  102. } else if ev.Key() == tcell.KeyDown {
  103. keypresses <- Down
  104. } else if ev.Key() == tcell.KeyUp {
  105. keypresses <- Up
  106. }
  107. }
  108. }
  109. }