Um servidor web básico

Para ser honesto, tive que pesquisar no Google a disponibilidade de um servidor web básico na biblioteca padrão Java. Acontece que há um servidor HTTP (com base no nome do pacote) que é provavelmente uma das partes mais antigas da biblioteca padrão: com.sun.net.httpserver.HttpServer.

Usar a implementação do servidor é bastante simples, aqui está meu código inicial para lidar com a solicitação de metadados do Battlesnake:

import com.sun.net.httpserver.HttpServer;import com.sun.net.httpserver.HttpHandler;import com.sun.net.httpserver.HttpExchange;import java.io.IOException;import java.io.OutputStream;import java.net.InetSocketAddress;public class Snake {    static class BattleSnakeHandler implements HttpHandler {        public void handle(HttpExchange exchange) throws IOException {            String response = \\\"{\\\\\\\"apiversion\\\\\\\": \\\\\\\"1\\\\\\\", \\\"                  \\\"\\\\\\\"author\\\\\\\": \\\\\\\"\\'robvanderleek\\\\\\\", \\\\\\\"version\\\\\\\": \\\\\\\"1.0\\\\\\\", \\\"                  \\\"\\\\\\\"color\\\\\\\": \\\\\\\"#b07219\\\\\\\", \\\\\\\"head\\\\\\\": \\\\\\\"safe\\\\\\\", \\\"                  \\\"\\\\\\\"tail\\\\\\\": \\\\\\\"sharp\\\\\\\"}\\\";            exchange.sendResponseHeaders(200, response.length());            OutputStream os = exchange.getResponseBody();            os.write(response.getBytes());            os.close();        }    }    public static void main(String args[]) throws IOException {        int port = Integer.parseInt(            System.getenv().getOrDefault(\\\"PORT\\\", \\\"3000\\\"));        HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);        server.createContext(\\\"/\\\", new BattleSnakeHandler());        server.setExecutor(null);        server.start();        System.out.println(            String.format(\\\"Starting Battlesnake server on port: %d\\\", port));    }}

Lógica do jogo

Uma parte significativa do código lógico do jogo existe para analisar os dados JSON recebidos. A biblioteca Java padrão não contém um analisador JSON e uma biblioteca de analisador típica contém milhares de linhas de código.
Com muitos hacks consegui analisar o Battlesnake JSON, e apenas aquele JSON.

Abaixo estão quatro das funções no código relacionadas à análise JSON (essas funções analisam campos, objetos e matrizes):

    private String getField(String json, String name) {        String needle = \\'\\\"\\'   name   \\'\\\"\\';        return json.substring(json.indexOf(needle)   needle.length()   1);    }    private String getBalanced(String json, String name, char open,            char close) {        String start = getField(json, name);        int idx = 0, indent = 0;        do {            if (start.charAt(idx) == open) {                indent  ;            } else if (start.charAt(idx) == close) {                indent--;            }            idx  ;        } while (indent > 0);        return start.substring(0, idx);    }    private String getObject(String json, String name) {        return getBalanced(json, name, \\'{\\', \\'}\\');    }    private String getArray(String json, String name) {        return getBalanced(json, name, \\'[\\', \\']\\');    }

O restante da lógica do jogo é bastante simples, usei uma classe básica Coordinate para melhor legibilidade e concisão:

private Coordinate nearestFood(String board, Coordinate head) {        String foodJson = getArray(board, \\\"food\\\");        Set food = getCoordinates(foodJson);        double distance = Double.MAX_VALUE;        int x = 255, y = 255;        for (Coordinate f: food) {            double d = Math.sqrt(Math.pow(head.x - f.x, 2)                      Math.pow(head.y - f.y, 2));            if (d < distance) {                distance = d;                x = f.x;                y = f.y;            }        }        return new Coordinate(x, y);    }

Tenho certeza de que a lógica do jogo pode ser melhorada, por que não tentar? ?

E este é o código completo em ação:

\\\"Battlesnake

O código completo do C Battlesnake pode ser encontrado aqui no GitHub.

Feedback apreciado!

Espero que você goste de ler junto com minhas aventuras de codificação.

Deixe-me saber nos comentários abaixo o que você pensa sobre o código acima ou quais linguagens de programação você espera nesta série.

Até o próximo idioma!

","image":"http://www.luping.net/uploads/20240821/172420380466c5431c8b56d.gif","datePublished":"2024-08-21T09:30:04+08:00","dateModified":"2024-08-21T09:30:04+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Desafio Battlesnake#Java

Desafio Battlesnake#Java

Publicado em 2024-08-21
Navegar:632

Nesta série, compartilharei meu progresso com meu desafio de programação auto-imposto: construir um Battlesnake em tantas linguagens de programação diferentes quanto possível.

Confira a primeira postagem para uma breve introdução a esta série.

Você também pode acompanhar meu progresso no GitHub.

Java

Java é a linguagem das empresas, a lógica de negócios de muitos grandes sistemas de back-office está escrita nela.
Já escrevi muito código Java no passado, mas Python e JavaScript ocuparam seu lugar em minhas atividades de programação contemporâneas.
Como Java pode ser usado para escrever software muito legível e robusto (IDEs Java tendem a ter ótimo suporte de refatoração), ainda sinto que é a linguagem certa para alguns sistemas.

Em comparação com seus antecessores, Java trouxe muitas melhorias aos desenvolvedores (dependendo do seu gosto, é claro): gerenciamento automático de memória, tipos de coleção integrados e uma extensa biblioteca padrão. No entanto, a linguagem já tem mais de 30 anos e há alguns sinais claros dos tempos, como nenhum suporte JSON na biblioteca padrão (mas tem suporte XML?).

O Java, como sai da caixa hoje, ainda pode ser usado para construir uma implementação limpa e concisa do Battlesnake? Leia para descobrir.

Olá mundo Configuração

Esta é a aparência do Snake.java:

public class Snake {

    public static void main(String args[]) {
        System.out.println("Hello world!");
    }

}

Esta é a aparência do Dockerfile:

FROM eclipse-temurin:17-jdk
RUN mkdir /app
WORKDIR /app
COPY Snake.java .
RUN javac Snake.java
CMD ["java", "Snake"]

E aqui está a configuração de desenvolvimento em ação:

Um servidor web básico

Para ser honesto, tive que pesquisar no Google a disponibilidade de um servidor web básico na biblioteca padrão Java. Acontece que há um servidor HTTP (com base no nome do pacote) que é provavelmente uma das partes mais antigas da biblioteca padrão: com.sun.net.httpserver.HttpServer.

Usar a implementação do servidor é bastante simples, aqui está meu código inicial para lidar com a solicitação de metadados do Battlesnake:

import com.sun.net.httpserver.HttpServer;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpExchange;
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class Snake {

    static class BattleSnakeHandler implements HttpHandler {
        public void handle(HttpExchange exchange) throws IOException {
            String response = "{\"apiversion\": \"1\", "  
                "\"author\": \"'robvanderleek\", \"version\": \"1.0\", "  
                "\"color\": \"#b07219\", \"head\": \"safe\", "  
                "\"tail\": \"sharp\"}";
            exchange.sendResponseHeaders(200, response.length());
            OutputStream os = exchange.getResponseBody();
            os.write(response.getBytes());
            os.close();
        }
    }

    public static void main(String args[]) throws IOException {
        int port = Integer.parseInt(
            System.getenv().getOrDefault("PORT", "3000"));
        HttpServer server = HttpServer.create(new InetSocketAddress(port), 0);
        server.createContext("/", new BattleSnakeHandler());
        server.setExecutor(null);
        server.start();
        System.out.println(
            String.format("Starting Battlesnake server on port: %d", port));
    }

}

Lógica do jogo

Uma parte significativa do código lógico do jogo existe para analisar os dados JSON recebidos. A biblioteca Java padrão não contém um analisador JSON e uma biblioteca de analisador típica contém milhares de linhas de código.
Com muitos hacks consegui analisar o Battlesnake JSON, e apenas aquele JSON.

Abaixo estão quatro das funções no código relacionadas à análise JSON (essas funções analisam campos, objetos e matrizes):

    private String getField(String json, String name) {
        String needle = '"'   name   '"';
        return json.substring(json.indexOf(needle)   needle.length()   1);
    }

    private String getBalanced(String json, String name, char open,
            char close) {
        String start = getField(json, name);
        int idx = 0, indent = 0;
        do {
            if (start.charAt(idx) == open) {
                indent  ;
            } else if (start.charAt(idx) == close) {
                indent--;
            }
            idx  ;
        } while (indent > 0);
        return start.substring(0, idx);
    }

    private String getObject(String json, String name) {
        return getBalanced(json, name, '{', '}');
    }

    private String getArray(String json, String name) {
        return getBalanced(json, name, '[', ']');
    }

O restante da lógica do jogo é bastante simples, usei uma classe básica Coordinate para melhor legibilidade e concisão:

private Coordinate nearestFood(String board, Coordinate head) {
        String foodJson = getArray(board, "food");
        Set food = getCoordinates(foodJson);
        double distance = Double.MAX_VALUE;
        int x = 255, y = 255;
        for (Coordinate f: food) {
            double d = Math.sqrt(Math.pow(head.x - f.x, 2)  
                    Math.pow(head.y - f.y, 2));
            if (d 



Tenho certeza de que a lógica do jogo pode ser melhorada, por que não tentar? ?

E este é o código completo em ação:

Battlesnake Challenge # Java

O código completo do C Battlesnake pode ser encontrado aqui no GitHub.

Feedback apreciado!

Espero que você goste de ler junto com minhas aventuras de codificação.

Deixe-me saber nos comentários abaixo o que você pensa sobre o código acima ou quais linguagens de programação você espera nesta série.

Até o próximo idioma!

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/robvanderleek/battlesnake-challenge-4-java-13gg?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3