Честно говоря, мне пришлось гуглить наличие базового веб-сервера в стандартной библиотеке 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\\\"); 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); }
Я уверен, что логику игры можно улучшить, почему бы не попробовать? ?
А это полный код в действии:
Полный код 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 на как можно большем количестве различных языков программирования.
Краткое введение в эту серию можно найти в первом посте.
Вы также можете следить за моим прогрессом на 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"); 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 Я уверен, что логику игры можно улучшить, почему бы не попробовать? ?
А это полный код в действии:
Полный код C Battlesnake можно найти здесь, на GitHub.
Обратная связь приветствуется!
Надеюсь, вам понравится читать мои приключения в области программирования.
Дайте мне знать в комментариях ниже, что вы думаете о приведенном выше коде или какие языки программирования вы ожидаете в этой серии.
До следующего языка!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3