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:
- Uma goroutine que recebe os comandos dos usuários
- Outra goroutine que processa cada comando
- 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.