Базовый веб-сервер

Честно говоря, мне пришлось гуглить наличие базового веб-сервера в стандартной библиотеке Java. Оказывается, есть HTTP-сервер (судя по названию пакета), который, вероятно, является одной из старейших частей стандартной библиотеки: com.sun.net.httpserver.HttpServer.

Использовать реализацию сервера на самом деле довольно просто, вот мой исходный код для обработки запроса метаданных 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));    }}

Логика игры

Значительная часть кода игровой логики предназначена для анализа входящих данных JSON. Стандартная библиотека Java не содержит анализатора JSON, а типичная библиотека анализатора содержит тысячи строк кода.
С помощью множества хаков мне удалось разобрать JSON Battlesnake, и только этот JSON.

Ниже приведены четыре функции в коде, связанные с анализом JSON (эти функции анализируют поля, объекты и массивы):

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

Остальная логика игры довольно проста, я использовал базовый класс координат для лучшей читабельности и краткости:

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

Я уверен, что логику игры можно улучшить, почему бы не попробовать? ?

А это полный код в действии:

\\\"Battlesnake

Полный код C Battlesnake можно найти здесь, на GitHub.

Обратная связь приветствуется!

Надеюсь, вам понравится читать мои приключения в области программирования.

Дайте мне знать в комментариях ниже, что вы думаете о приведенном выше коде или какие языки программирования вы ожидаете в этой серии.

До следующего языка!

","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"}}
«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Battlesnake Challenge # Java

Battlesnake Challenge # Java

Опубликовано 21 августа 2024 г.
Просматривать:752

В этой серии я поделюсь своим прогрессом в решении поставленной перед собой задачи по программированию: создать Battlesnake на как можно большем количестве различных языков программирования.

Краткое введение в эту серию можно найти в первом посте.

Вы также можете следить за моим прогрессом на GitHub.

Ява

Java — это язык предприятий, на нем написана бизнес-логика многих крупных бэк-офисных систем.
В прошлом я писал много кода на Java, но Python и JavaScript заняли свое место в моей современной программной деятельности.
Поскольку Java можно использовать для написания очень читаемого и надежного программного обеспечения (Java IDE, как правило, имеет отличную поддержку рефакторинга), я все же считаю, что это подходящий язык для некоторых систем.

По сравнению со своими предшественниками, Java принесла разработчикам множество улучшений (в зависимости от вашего вкуса, конечно): автоматическое управление памятью, встроенные типы коллекций и обширную стандартную библиотеку. Однако языку уже более 30 лет, и есть некоторые явные признаки времени, такие как отсутствие поддержки JSON в стандартной библиотеке (но есть поддержка XML?).

Можно ли использовать Java в том виде, в каком она сегодня выходит из коробки, для создания чистой и лаконичной реализации Battlesnake? Читайте дальше, чтобы узнать.

Привет, мир! Настройка

Вот как выглядит Snake.java:

public class Snake {

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

}

Вот как выглядит Dockerfile:

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

А вот схема разработки в действии:

Базовый веб-сервер

Честно говоря, мне пришлось гуглить наличие базового веб-сервера в стандартной библиотеке Java. Оказывается, есть HTTP-сервер (судя по названию пакета), который, вероятно, является одной из старейших частей стандартной библиотеки: com.sun.net.httpserver.HttpServer.

Использовать реализацию сервера на самом деле довольно просто, вот мой исходный код для обработки запроса метаданных 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));
    }

}

Логика игры

Значительная часть кода игровой логики предназначена для анализа входящих данных JSON. Стандартная библиотека Java не содержит анализатора JSON, а типичная библиотека анализатора содержит тысячи строк кода.
С помощью множества хаков мне удалось разобрать JSON Battlesnake, и только этот JSON.

Ниже приведены четыре функции в коде, связанные с анализом JSON (эти функции анализируют поля, объекты и массивы):

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

Остальная логика игры довольно проста, я использовал базовый класс координат для лучшей читабельности и краткости:

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 



Я уверен, что логику игры можно улучшить, почему бы не попробовать? ?

А это полный код в действии:

Battlesnake Challenge # Java

Полный код C Battlesnake можно найти здесь, на GitHub.

Обратная связь приветствуется!

Надеюсь, вам понравится читать мои приключения в области программирования.

Дайте мне знать в комментариях ниже, что вы думаете о приведенном выше коде или какие языки программирования вы ожидаете в этой серии.

До следующего языка!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/robvanderleek/battlesnake-challenge-4-java-13gg?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3