game.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package robots
  2. import (
  3. "fmt"
  4. "log"
  5. "math/rand"
  6. "github.com/gdamore/tcell/v2"
  7. )
  8. func GameInit() {
  9. game, err := initialize()
  10. if err != nil {
  11. log.Fatalln("Initilization error: ", err)
  12. }
  13. go game.gameDirector()
  14. game.keyboardProcessor()
  15. // Quit the screen
  16. quit(&game)
  17. // Give closure
  18. if game.gameover == 1 {
  19. fmt.Println("You got rekt by a robot")
  20. } else if game.gameover == 2 {
  21. fmt.Println("You took the easy way out")
  22. }
  23. fmt.Println("Score:", game.player.score)
  24. fmt.Println("Level: ", game.level)
  25. fmt.Println("Moves:", game.player.moves)
  26. fmt.Println("Teleports:", game.player.teleports)
  27. }
  28. func initialize() (Game, error) {
  29. var err error
  30. screen, err := tcell.NewScreen()
  31. if err != nil {
  32. log.Println("Error creating screen: ", err)
  33. }
  34. err = screen.Init()
  35. if err != nil {
  36. log.Fatalln("Error initializing screen: ", err)
  37. }
  38. style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)
  39. game := Game{
  40. screen: screen,
  41. style: style,
  42. keypresses: make(chan int),
  43. player: Player{
  44. position: Position{
  45. x: 40,
  46. y: 12,
  47. },
  48. score: 0,
  49. moves: 0,
  50. teleports: 0,
  51. },
  52. level: 1,
  53. gameover: 0,
  54. }
  55. game.initRobots()
  56. return game, err
  57. }
  58. func (game *Game) gameDirector() {
  59. defer quit(game)
  60. // TODO reorder this
  61. for game.gameover == 0 {
  62. // Clean the screen
  63. game.screen.Clear()
  64. // Draw robots??
  65. if len(game.robots) == 0 {
  66. game.level++
  67. game.cleanTrash()
  68. game.resetPlayer()
  69. game.initRobots()
  70. }
  71. // Draw starter conditions
  72. game.drawBox()
  73. game.drawPlayer()
  74. //game.drawCoords()
  75. game.drawRobots()
  76. // Draw my ex-wife
  77. game.drawTrash()
  78. // Draw stuff last
  79. game.drawScore()
  80. //game.drawDebug()
  81. // Draw the screen
  82. game.screen.Show()
  83. // Process input
  84. game.movePlayer(<-game.keypresses)
  85. // Move robots
  86. game.moveRobots()
  87. }
  88. }
  89. func (game *Game) keyboardProcessor() {
  90. defer close(game.keypresses)
  91. for game.gameover == 0 {
  92. // Poll for an event
  93. ev := game.screen.PollEvent()
  94. // Fetch the type, and check if any other actions are required.
  95. switch ev := ev.(type) {
  96. case *tcell.EventKey:
  97. // Keys to bug out
  98. if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
  99. game.gameover = 2
  100. return
  101. // Screen management
  102. } else if ev.Key() == tcell.KeyCtrlL {
  103. game.screen.Sync()
  104. // Player Movement
  105. } else if ev.Rune() == 'q' {
  106. game.keypresses <- upleft
  107. } else if ev.Rune() == 'e' {
  108. game.keypresses <- upright
  109. } else if ev.Rune() == 'z' {
  110. game.keypresses <- downleft
  111. } else if ev.Rune() == 'c' {
  112. game.keypresses <- downright
  113. } else if ev.Key() == tcell.KeyUp || ev.Rune() == 'w' {
  114. game.keypresses <- Up
  115. } else if ev.Key() == tcell.KeyRight || ev.Rune() == 'd' {
  116. game.keypresses <- Right
  117. } else if ev.Key() == tcell.KeyDown || ev.Rune() == 's' || ev.Rune() == 'x' {
  118. game.keypresses <- Down
  119. } else if ev.Key() == tcell.KeyLeft || ev.Rune() == 'a' {
  120. game.keypresses <- Left
  121. // Teleport the player
  122. } else if ev.Rune() == 't' {
  123. game.keypresses <- teleport
  124. }
  125. }
  126. }
  127. }
  128. func quit(game *Game) {
  129. maybePanic := recover()
  130. game.screen.Fini()
  131. if maybePanic != nil {
  132. panic(maybePanic)
  133. }
  134. }
  135. func (game *Game) randPos() Position {
  136. var pos Position
  137. x := 2 + rand.Intn(76)
  138. y := 2 + rand.Intn(21)
  139. pos.x = x
  140. pos.y = y
  141. return pos
  142. }