> Java > java지도 시간 > 배틀스네이크 챌린지 # 자바

배틀스네이크 챌린지 # 자바

WBOY
풀어 주다: 2024-08-06 20:36:20
원래의
406명이 탐색했습니다.

이 시리즈에서는 가능한 한 다양한 프로그래밍 언어로 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);
    }
로그인 후 복사

게임 로직이 개선될 수 있다고 확신하는데, 한번 시도해 보는 것은 어떨까요? ?

작동 중인 전체 코드는 다음과 같습니다.

Battlesnake Challenge # Java

C Battlesnake의 전체 코드는 여기 GitHub에서 확인할 수 있습니다.

피드백을 보내주셔서 감사합니다!

저의 코딩 모험을 함께 읽어보시길 바랍니다.

위 코드에 대해 어떻게 생각하는지, 또는 이 시리즈에서 어떤 프로그래밍 언어를 기대하는지 아래 댓글을 통해 알려주세요.

다음 언어까지!

위 내용은 배틀스네이크 챌린지 # 자바의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿