Pular para o conteúdo principal

victorstein.dev

56/100 Dias de Golang - Jogo em UDP - Parte 2

Table of Contents

# Jogo em UDP - Parte 2

Nesse post focaremos em fazer algumas funções do server. Como criar as conexões inicias, salvar usuários, ver quais informações precisamos salvar de cada usuário e criar o grid.

Para iniciar o servidor UDP, muito simples. Já vimos isso em outro post também.

addr, _ := net.ResolveUDPAddr("udp", "0.0.0.0:8080")
conn, _ := net.ListenUDP("udp", addr)
defer conn.Close()

fmt.Println("Servidor iniciado na porta 8080...")

De modo geral, estou imaginando a função main com 3 rotinas principais:

  1. Uma goroutine que recebe os comandos dos usuários
  2. Outra goroutine que processa cada comando
  3. E um for loop que fica enviando dados para os usuário

Esse ponto 3 vai ser responsável por pegar os dados salvos e enviar para todos os usuários conectados.

Vamos crias as variáveis que vão salvar os dados:

Variáveis para definir o tamanho do grid e o estado atual do grid.

const arenaRows = 20
const arenaCols = 60

var grid = make([][]rune, arenaRows)

Dados do jogador e a lista de jogadores conectados. ID provavelemente será o IP da conexão, Char vai ser um símbolo, pensei em A, B, C, D, …, X e Y as coordenadas atuais do jogador e Addr o endereço da conexão

type Player struct {
	ID   string
	Char rune
	X, Y int
	Addr *net.UDPAddr
}

var players = make(map[string]*Player)

Vamos fazer um função inicial para renderizar o grid. Essa função faz um for sobre as linhas e as colunas e vai criando o nosso “mapa”, nas bordas coloquei o sinal de '*', como se fosse a representação de uma parede. E no restante das posições um '.'. E no final temos a criação do strings.Builder, que é uma estrutura otimizada para construir strings de forma eficiente, evitando múltiplas alocações de memória, entre cada linha temos um \n que quebra a linha.

func renderArena() string {

	for i := 0; i < arenaRows; i++ {
		grid[i] = make([]rune, arenaCols)
		for j := range grid[i] {

			if i == 0 {
				grid[i][j] = '*'
				continue
			}

			if i == arenaRows-1 {
				grid[i][j] = '*'
				continue
			}

			if j == 0 {
				grid[i][j] = '*'
				continue
			}

			if j == arenaCols-1 {
				grid[i][j] = '*'
				continue
			}

			grid[i][j] = '.'
		}
	}


   var sb strings.Builder
	for _, row := range grid {
		for _, cell := range row {
			sb.WriteRune(cell)
		}
		sb.WriteRune('\n')
	}

	return sb.String()


}

Amanhã vamos enviar esse grid para o usuário e capturar o envio do usuário.