이 시리즈에서는 가능한 한 다양한 프로그래밍 언어로 Battlesnake를 구축하는 자체 프로그래밍 과제의 진행 상황을 공유하겠습니다.
이 시리즈에 대한 짧은 소개는 첫 번째 게시물을 확인하세요.
GitHub에서도 제 진행 상황을 보실 수 있습니다.
Java는 기업의 언어로 많은 대규모 백오피스 시스템의 비즈니스 로직이 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 표준 라이브러리에서 기본 웹 서버를 사용할 수 있는지 Google에 검색해야 했습니다. (패키지 이름을 기준으로 볼 때) 표준 라이브러리에서 가장 오래된 부분 중 하나인 com.sun.net.httpserver.HttpServer에 HTTP 서버가 있는 것으로 나타났습니다.
서버 구현을 사용하는 것은 실제로 매우 간단합니다. 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 파서가 포함되어 있지 않으며 일반적인 파서 라이브러리에는 수천 줄의 코드가 포함되어 있습니다.
많은 해킹을 통해 Battlesnake JSON을 파싱하고 해당 JSON만
다음은 JSON 구문 분석과 관련된 코드의 함수 4개입니다(이러한 함수는 필드, 객체 및 배열을 구문 분석합니다).
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, '[', ']'); }
게임 로직의 나머지 부분은 매우 간단합니다. 가독성과 간결성을 높이기 위해 기본 Coordinate 클래스를 사용했습니다.
private Coordinate nearestFood(String board, Coordinate head) { String foodJson = getArray(board, "food"); Set<Coordinate> 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); }
게임 로직이 개선될 수 있다고 확신하는데, 한번 시도해 보는 것은 어떨까요? ?
작동 중인 전체 코드는 다음과 같습니다.
C Battlesnake의 전체 코드는 여기 GitHub에서 확인할 수 있습니다.
저의 코딩 모험을 함께 읽어보시길 바랍니다.
위 코드에 대해 어떻게 생각하는지, 또는 이 시리즈에서 어떤 프로그래밍 언어를 기대하는지 아래 댓글을 통해 알려주세요.
다음 언어까지!
위 내용은 배틀스네이크 챌린지 # 자바의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!