game.go 3.6 KB

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