game.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "strconv"
  6. "github.com/gdamore/tcell/v2"
  7. )
  8. func updateScore(screen tcell.Screen, style tcell.Style, score int) {
  9. var x, y int
  10. _, y = screen.Size()
  11. x = 5
  12. for _, r := range []rune("[ Score: " + strconv.FormatInt(int64(score), 10) + " ]") {
  13. screen.SetContent(x, y-1, r, nil, style)
  14. x++
  15. }
  16. }
  17. func drawBox(s tcell.Screen, x1, y1, x2, y2 int, style tcell.Style) {
  18. if y2 < y1 {
  19. y1, y2 = y2, y1
  20. }
  21. if x2 < x1 {
  22. x1, x2 = x2, x1
  23. }
  24. // Fill background
  25. for row := y1; row <= y2; row++ {
  26. for col := x1; col <= x2; col++ {
  27. s.SetContent(col, row, ' ', nil, style)
  28. }
  29. }
  30. // Draw borders
  31. for col := x1; col <= x2; col++ {
  32. s.SetContent(col, y1, '═', nil, style)
  33. s.SetContent(col, y2, '═', nil, style)
  34. }
  35. for row := y1 + 1; row < y2; row++ {
  36. s.SetContent(x1, row, '║', nil, style)
  37. s.SetContent(x2, row, '║', nil, style)
  38. }
  39. // Only draw corners if necessary
  40. if y1 != y2 && x1 != x2 {
  41. s.SetContent(x1, y1, '╔', nil, style)
  42. s.SetContent(x2, y1, '╗', nil, style)
  43. s.SetContent(x1, y2, '╚', nil, style)
  44. s.SetContent(x2, y2, '╝', nil, style)
  45. }
  46. //drawText(s, x1+1, y1+1, x2-1, y2-1, style, text)
  47. updateScore(s, style, 10)
  48. }
  49. func main() {
  50. defaultStyle := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)
  51. var err error
  52. screen, err := tcell.NewScreen()
  53. if err != nil {
  54. log.Println("Error creating screen: ", err)
  55. }
  56. err = screen.Init()
  57. if err != nil {
  58. log.Fatalln("Error initializing screen: ", err)
  59. }
  60. x, y := screen.Size()
  61. screen.Clear()
  62. drawBox(screen, 0, 0, x-1, y-1, defaultStyle)
  63. quit := func() {
  64. // You have to catch panics in a defer, clean up, and
  65. // re-raise them - otherwise your application can
  66. // die without leaving any diagnostic trace.
  67. maybePanic := recover()
  68. screen.Fini()
  69. if maybePanic != nil {
  70. panic(maybePanic)
  71. }
  72. }
  73. defer quit()
  74. for {
  75. screen.Show()
  76. ev := screen.PollEvent()
  77. switch ev := ev.(type) {
  78. case *tcell.EventResize:
  79. x, y := screen.Size()
  80. drawBox(screen, 0, 0, x-1, y-1, defaultStyle)
  81. fmt.Println("size=ok:", checkSize(screen))
  82. screen.Sync()
  83. case *tcell.EventKey:
  84. //fmt.Println("Key: ",ev.Rune())
  85. if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
  86. return
  87. } else if ev.Rune() == 'q' || ev.Rune() == 'Q' {
  88. return
  89. } else if ev.Key() == tcell.KeyCtrlL {
  90. screen.Sync()
  91. } else if ev.Rune() == 'C' || ev.Rune() == 'c' {
  92. screen.Clear()
  93. }
  94. }
  95. }
  96. }