Un servidor web básico

Para ser honesto, tuve que buscar en Google la disponibilidad de un servidor web básico en la biblioteca estándar de Java. Resulta que hay un servidor HTTP (según el nombre del paquete) en lo que probablemente sea una de las partes más antiguas de la biblioteca estándar: com.sun.net.httpserver.HttpServer.

Usar la implementación del servidor es bastante sencillo, aquí está mi código inicial para manejar la solicitud de metadatos de 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 del juego

Una parte importante del código lógico del juego está ahí para analizar los datos JSON entrantes. La biblioteca Java estándar no contiene un analizador JSON y una biblioteca de análisis típica contiene miles de líneas de código.
Con muchos trucos pude analizar el JSON de Battlesnake, y solo ese JSON.

A continuación se muestran cuatro de las funciones en el código relacionadas con el análisis JSON (estas funciones analizan campos, objetos y matrices):

    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, \\'[\\', \\']\\');    }

El resto de la lógica del juego es bastante sencillo. Utilicé una clase de Coordinate básica para mejorar la legibilidad y la concisión:

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);    }

Estoy seguro de que la lógica del juego se puede mejorar, ¿por qué no intentarlo? ?

Y este es el código completo en acción:

\\\"Battlesnake

El código completo de C Battlesnake se puede encontrar aquí en GitHub.

¡Se agradecen los comentarios!

Espero que te guste leer mis aventuras de programación.

Déjame saber en los comentarios a continuación qué piensas sobre el código anterior o qué lenguajes de programación estás esperando en esta serie.

¡Hasta el 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"}}
"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Desafío de la serpiente de batalla # Java

Desafío de la serpiente de batalla # Java

Publicado el 2024-08-21
Navegar:384

En esta serie compartiré mi progreso con mi desafío de programación autoimpuesto: construir un Battlesnake en tantos lenguajes de programación diferentes como sea posible.

Consulta la primera publicación para ver una breve introducción a esta serie.

También puedes seguir mi progreso en GitHub.

Java

Java es el lenguaje de las empresas, la lógica empresarial de muchos grandes sistemas administrativos está escrita en él.
He escrito mucho código Java en el pasado, pero Python y JavaScript han ocupado su lugar en mis actividades de programación contemporáneas.
Debido a que Java se puede utilizar para escribir software muy legible y robusto (los IDE de Java tienden a tener un gran soporte de refactorización), sigo pensando que es el lenguaje adecuado para algunos sistemas.

En comparación con sus predecesores, Java trajo a los desarrolladores muchas mejoras (dependiendo de su gusto, por supuesto): administración automática de memoria, tipos de colecciones integradas y una extensa biblioteca estándar. Sin embargo, el lenguaje tiene ahora más de 30 años y hay algunos signos claros de los tiempos, como que no hay soporte para JSON en la biblioteca estándar (¿pero sí tiene soporte para XML?).

¿Se puede seguir utilizando Java, tal como viene listo para usar hoy, para crear una implementación de Battlesnake limpia y concisa? Siga leyendo para descubrirlo.

Hola mundo Configuración

Así es como se ve Snake.java:

public class Snake {

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

}

Así es como se ve el Dockerfile:

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

Y aquí está la configuración de desarrollo en acción:

Un servidor web básico

Para ser honesto, tuve que buscar en Google la disponibilidad de un servidor web básico en la biblioteca estándar de Java. Resulta que hay un servidor HTTP (según el nombre del paquete) en lo que probablemente sea una de las partes más antiguas de la biblioteca estándar: com.sun.net.httpserver.HttpServer.

Usar la implementación del servidor es bastante sencillo, aquí está mi código inicial para manejar la solicitud de metadatos de 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 del juego

Una parte importante del código lógico del juego está ahí para analizar los datos JSON entrantes. La biblioteca Java estándar no contiene un analizador JSON y una biblioteca de análisis típica contiene miles de líneas de código.
Con muchos trucos pude analizar el JSON de Battlesnake, y solo ese JSON.

A continuación se muestran cuatro de las funciones en el código relacionadas con el análisis JSON (estas funciones analizan campos, objetos y matrices):

    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, '[', ']');
    }

El resto de la lógica del juego es bastante sencillo. Utilicé una clase de Coordinate básica para mejorar la legibilidad y la concisión:

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 



Estoy seguro de que la lógica del juego se puede mejorar, ¿por qué no intentarlo? ?

Y este es el código completo en acción:

Battlesnake Challenge # Java

El código completo de C Battlesnake se puede encontrar aquí en GitHub.

¡Se agradecen los comentarios!

Espero que te guste leer mis aventuras de programación.

Déjame saber en los comentarios a continuación qué piensas sobre el código anterior o qué lenguajes de programación estás esperando en esta serie.

¡Hasta el próximo idioma!

Declaración de liberación Este artículo se reproduce en: https://dev.to/robvanderleek/battlesnake-challenge-4-java-13gg?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3