| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- package robots
- import (
- "fmt"
- "log"
- "math/rand"
- "github.com/gdamore/tcell/v2"
- )
- func GameInit() {
- game, err := initialize()
- if err != nil {
- log.Fatalln("Initilization error: ", err)
- }
- go game.gameDirector()
- game.keyboardProcessor()
- // Quit the screen
- quit(&game)
- // Give closure
- if game.gameover == 1 {
- fmt.Println("You got rekt by a robot")
- } else if game.gameover == 2 {
- fmt.Println("You took the easy way out")
- }
- fmt.Println("Score:", game.player.score)
- fmt.Println("Level: ", game.level)
- fmt.Println("Moves:", game.player.moves)
- fmt.Println("Teleports:", game.player.teleports)
- }
- func initialize() (Game, error) {
- 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)
- }
- style := tcell.StyleDefault.Background(tcell.ColorReset).Foreground(tcell.ColorReset)
- game := Game{
- screen: screen,
- style: style,
- keypresses: make(chan int),
- player: Player{
- position: Position{
- x: 40,
- y: 12,
- },
- score: 0,
- moves: 0,
- teleports: 0,
- },
- level: 1,
- gameover: 0,
- }
- game.initRobots()
- return game, err
- }
- func (game *Game) gameDirector() {
- defer quit(game)
- // TODO reorder this
- for game.gameover == 0 {
- // Clean the screen
- game.screen.Clear()
- // Draw robots??
- if len(game.robots) == 0 {
- game.level++
- game.cleanTrash()
- game.resetPlayer()
- game.initRobots()
- }
- // Draw starter conditions
- game.drawBox()
- game.drawPlayer()
- //game.drawCoords()
- game.drawRobots()
- // Draw my ex-wife
- game.drawTrash()
- // Draw stuff last
- game.drawScore()
- //game.drawDebug()
- // Draw the screen
- game.screen.Show()
- // Process input
- game.movePlayer(<-game.keypresses)
- // Move robots
- game.moveRobots()
- }
- }
- func (game *Game) keyboardProcessor() {
- defer close(game.keypresses)
- for game.gameover == 0 {
- // Poll for an event
- ev := game.screen.PollEvent()
- // Fetch the type, and check if any other actions are required.
- switch ev := ev.(type) {
- case *tcell.EventKey:
- // Keys to bug out
- if ev.Key() == tcell.KeyEscape || ev.Key() == tcell.KeyCtrlC {
- game.gameover = 2
- return
- // Screen management
- } else if ev.Key() == tcell.KeyCtrlL {
- game.screen.Sync()
- // Player Movement
- } else if ev.Rune() == 'q' {
- game.keypresses <- upleft
- } else if ev.Rune() == 'e' {
- game.keypresses <- upright
- } else if ev.Rune() == 'z' {
- game.keypresses <- downleft
- } else if ev.Rune() == 'c' {
- game.keypresses <- downright
- } else if ev.Key() == tcell.KeyUp || ev.Rune() == 'w' {
- game.keypresses <- Up
- } else if ev.Key() == tcell.KeyRight || ev.Rune() == 'd' {
- game.keypresses <- Right
- } else if ev.Key() == tcell.KeyDown || ev.Rune() == 's' || ev.Rune() == 'x' {
- game.keypresses <- Down
- } else if ev.Key() == tcell.KeyLeft || ev.Rune() == 'a' {
- game.keypresses <- Left
- // Teleport the player
- } else if ev.Rune() == 't' {
- game.keypresses <- teleport
- }
- }
- }
- }
- func quit(game *Game) {
- maybePanic := recover()
- game.screen.Fini()
- if maybePanic != nil {
- panic(maybePanic)
- }
- }
- func (game *Game) randPos() Position {
- var pos Position
- x := 2 + rand.Intn(76)
- y := 2 + rand.Intn(21)
- pos.x = x
- pos.y = y
- return pos
- }
|