首頁  >  文章  >  Java  >  戰蛇挑戰#Java

戰蛇挑戰#Java

WBOY
WBOY原創
2024-08-06 20:36:20378瀏覽

在本系列中,我將分享我在自我施加的程式設計挑戰方面取得的進展:用盡可能多的不同程式語言建立 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"]

這是正在運行的開發設定:

一個基本的網頁伺服器

說實話,我必須在 Google 上搜尋 Java 標準庫中基本 Web 伺服器的可用性。事實證明,(根據套件名稱)有一個 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 解析器,典型的解析器函式庫包含數千行程式碼。 經過大量的修改,我能夠解析 Battlesnake JSON,並且只有那個 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<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 上找到。

感謝回饋!

我希望您喜歡閱讀我的程式設計冒險。

請在下面的評論中告訴我您對上述程式碼的看法,或您期待本系列中的哪些程式語言。

直到下一種語言!

以上是戰蛇挑戰#Java的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn