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)); }}
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\\\"); Setfood = 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:
O código completo do C Battlesnake pode ser encontrado aqui no GitHub.
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"}}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 é 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.
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:
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)); } }
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"); Setfood = 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:
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!
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