Rumah  >  Artikel  >  Java  >  Battlesnake Challenge # Java

Battlesnake Challenge # Java

WBOY
WBOYasal
2024-08-06 20:36:20377semak imbas

Dalam siri ini, saya akan berkongsi kemajuan saya dengan cabaran pengaturcaraan saya sendiri: bina Battlesnake dalam sebanyak mungkin bahasa pengaturcaraan yang berbeza.

Semak siaran pertama untuk pengenalan ringkas kepada siri ini.

Anda juga boleh mengikuti perkembangan saya di GitHub.

Jawa

Java ialah bahasa Perusahaan, logik perniagaan banyak sistem pejabat belakang yang besar tertulis di dalamnya.
Saya telah menulis banyak kod Java pada masa lalu, tetapi Python dan JavaScript telah mengambil tempatnya dalam aktiviti pengaturcaraan kontemporari saya.
Oleh kerana Java boleh digunakan untuk menulis perisian yang sangat mudah dibaca dan teguh (IDE Java cenderung mempunyai sokongan pemfaktoran semula yang hebat), saya masih merasakan ia adalah bahasa yang sesuai untuk sesetengah sistem.

Berbanding dengan pendahulunya, Java membawakan banyak penambahbaikan kepada pembangun (tentunya bergantung pada citarasa anda): pengurusan memori automatik, jenis koleksi terbina dalam dan perpustakaan standard yang luas. Walau bagaimanapun, bahasa itu kini berusia lebih 30 tahun dan terdapat beberapa tanda masa yang jelas, seperti tiada sokongan JSON dalam pustaka standard (tetapi ia mempunyai sokongan XML ?).

Bolehkah Java, kerana ia keluar dari kotak hari ini, masih digunakan untuk membina pelaksanaan Battlesnake yang bersih dan ringkas? Baca bersama untuk mengetahui.

Hello Persediaan dunia

Beginilah rupa Snake.java:

public class Snake {

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

}

Beginilah rupa Dockerfile:

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

Dan berikut ialah persediaan pembangunan dalam tindakan:

Pelayan web asas

Sejujurnya, saya terpaksa mencari Google ketersediaan pelayan web asas dalam perpustakaan standard Java. Ternyata terdapat pelayan HTTP dalam (berdasarkan nama pakej) yang mungkin merupakan salah satu bahagian tertua pustaka standard: com.sun.net.httpserver.HttpServer.


Menggunakan pelaksanaan pelayan sebenarnya agak mudah, berikut ialah kod awal saya untuk mengendalikan permintaan metadata 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));
    }

}

Logik permainan


Sebahagian penting kod logik permainan ada untuk menghuraikan data JSON yang masuk. Pustaka Java standard tidak mengandungi penghurai JSON dan pustaka penghurai biasa mengandungi beribu-ribu baris kod. Dengan banyak penggodaman saya dapat menghuraikan Battlesnake JSON, dan hanya JSON itu

.


Di bawah ialah empat daripada fungsi dalam kod yang berkaitan dengan penghuraian JSON (fungsi ini menghuraikan medan, objek dan tatasusunan):

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


Baki logik permainan adalah agak mudah, saya menggunakan kelas Koordinat asas untuk kebolehbacaan dan kepekatan yang lebih baik:

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

Saya pasti logik permainan boleh dipertingkatkan, mengapa tidak mencubanya? ?

Dan ini ialah kod lengkap dalam tindakan:

Battlesnake Challenge # Java

Kod penuh untuk C Battlesnake boleh didapati di sini di GitHub.

Maklum balas dihargai!

Saya harap anda suka membaca bersama dengan pengembaraan pengekodan saya.

Beri tahu saya dalam ulasan di bawah pendapat anda tentang kod di atas atau bahasa pengaturcaraan yang anda nantikan dalam siri ini.

Sehingga bahasa seterusnya!

Atas ialah kandungan terperinci Battlesnake Challenge # Java. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn