一個基本的網頁伺服器

老實說,我必須在 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 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

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"}}
」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 戰蛇挑戰#Java

戰蛇挑戰#Java

發佈於2024-08-21
瀏覽:108

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



我確信遊戲邏輯可以改進,為什麼不嘗試呢? ?

這是完整的代碼:

Battlesnake Challenge # Java

C Battlesnake 的完整程式碼可以在 GitHub 上找到。

感謝回饋!

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

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

直到下一種語言!

版本聲明 本文轉載於:https://dev.to/robvanderleek/battlesnake-challenge-4-java-13gg?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何在 Serp 中排名 4
    如何在 Serp 中排名 4
    搜索引擎排名页面 (SERP) 是网站争夺可见性和流量的地方。到 2024 年,在 Google 和其他搜索引擎上的高排名仍然对在线成功至关重要。然而,SEO(搜索引擎优化)多年来已经发生了变化,并将继续发展。如果您想知道如何在 2024 年提高 SERP 排名,这里有一个简单的指南可以帮助您了解最...
    程式設計 發佈於2024-11-05
  • 如何使用多處理在 Python 進程之間共享鎖
    如何使用多處理在 Python 進程之間共享鎖
    在Python 中的進程之間共享鎖定當嘗試使用pool.map() 來定位具有多個參數(包括Lock() 物件)的函數時,它是對於解決子進程之間共享鎖的問題至關重要。由於 pickling 限制,傳統的 multiprocessing.Lock() 無法直接傳遞給 Pool 方法。 選項 1:使用 ...
    程式設計 發佈於2024-11-05
  • Type Script 中 readonly 和 const 的區別
    Type Script 中 readonly 和 const 的區別
    這兩個功能的相似之處在於它們都是不可分配的。 能具體解釋一下嗎? 在這篇文章中,我將分享它們之間的差異。 const 防止重新分配給變數。 在這種情況下,hisName 是一個不能重新分配的變數。 const hisName = 'Michael Scofield' hisN...
    程式設計 發佈於2024-11-05
  • 如何使用 Range 函式在 Python 中複製 C/C++ 循環語法?
    如何使用 Range 函式在 Python 中複製 C/C++ 循環語法?
    Python 中的 for 迴圈:擴展 C/C 迴圈語法在程式設計中,for 迴圈是迭代序列的基本結構。雖然 C/C 採用特定的循環初始化語法,但 Python 提供了更簡潔的方法。不過,Python 中有一種模仿 C/C 循環風格的方法。 實作循環運算:for (int k = 1; k <...
    程式設計 發佈於2024-11-05
  • TechEazy Consulting 推出全面的 Java、Spring Boot 和 AWS 培訓計畫並提供免費實習機會
    TechEazy Consulting 推出全面的 Java、Spring Boot 和 AWS 培訓計畫並提供免費實習機會
    TechEazy Consulting 很高興地宣布推出我們的綜合培訓計劃,專為希望轉向後端開發使用Java、Spring Boot的初學者、新手和專業人士而設計,以及AWS。 此4個月的帶薪培訓計劃之後是2個月的無薪實習,您可以在實際專案中應用您的新技能—無需任何額外的培訓費用。對於那些希望填補...
    程式設計 發佈於2024-11-05
  • Polyfills-填充物還是縫隙? (第 1 部分)
    Polyfills-填充物還是縫隙? (第 1 部分)
    幾天前,我們在組織的 Teams 聊天中收到一條優先訊息,內容如下:發現安全漏洞 - 偵測到 Polyfill JavaScript - HIGH。 舉個例子,我在一家大型銀行公司工作,你必須知道,銀行和安全漏洞就像主要的敵人。因此,我們開始深入研究這個問題,並在幾個小時內解決了這個問題,我將在下...
    程式設計 發佈於2024-11-05
  • 移位運算子與位元簡寫賦值
    移位運算子與位元簡寫賦值
    1。移位運算子 :向右移動。 >>>:無符號右移(零填充)。 2.移位運算子的一般語法 value > num-bits:將值位向右移動,保留符號位。 value >>> num-bits:透過在左側插入零將值位向右移動。 3.左移 每次左移都會導致該值的所有位元向左移動一位。 右側插入0...
    程式設計 發佈於2024-11-05
  • 如何使用 VBA 從 Excel 建立與 MySQL 資料庫的連線?
    如何使用 VBA 從 Excel 建立與 MySQL 資料庫的連線?
    VBA如何在Excel中連接到MySQL資料庫? 使用VBA連接到MySQL資料庫嘗試連接使用 VBA 在 Excel 中存取 MySQL 資料庫有時可能具有挑戰性。在您的情況下,您在嘗試建立連線時遇到錯誤。 若要使用 VBA 成功連線至 MySQL 資料庫,請依照下列步驟操作:Sub Connec...
    程式設計 發佈於2024-11-05
  • 測試自動化:使用 Java 和 TestNG 進行 Selenium 指南
    測試自動化:使用 Java 和 TestNG 進行 Selenium 指南
    测试自动化已成为软件开发过程中不可或缺的一部分,使团队能够提高效率、减少手动错误并以更快的速度交付高质量的产品。 Selenium 是一个用于自动化 Web 浏览器的强大工具,与 Java 的多功能性相结合,为构建可靠且可扩展的自动化测试套件提供了一个强大的框架。使用 Selenium Java 进...
    程式設計 發佈於2024-11-05
  • 我對 DuckDuckGo 登陸頁面的看法
    我對 DuckDuckGo 登陸頁面的看法
    「為什麼不穀歌一下呢?」是我在對話中得到的常見答案。谷歌的無所不在甚至催生了新的動詞「Google」。但是我寫的程式碼越多,我就越質疑我每天使用的數位工具。也許我對谷歌使用我的個人資訊的方式不再感到滿意。或者我們很多人依賴谷歌進行互聯網搜索和其他應用程序,說實話,我厭倦了在搜索某個主題或產品後彈出的...
    程式設計 發佈於2024-11-05
  • 為什麼 Turbo C++ 的「cin」只讀取第一個字?
    為什麼 Turbo C++ 的「cin」只讀取第一個字?
    Turbo C 的「cin」限制:僅讀取第一個單字在Turbo C 中,「cin」輸入運算符有一個處理字元數組時的限制。具體來說,它只會讀取直到遇到空白字元(例如空格或換行符)。嘗試讀取多字輸入時,這可能會導致意外行為。 請考慮以下 Turbo C 代碼:#include <iostream....
    程式設計 發佈於2024-11-05
  • 使用 Buildpack 建立 Spring Boot 應用程式的 Docker 映像
    使用 Buildpack 建立 Spring Boot 應用程式的 Docker 映像
    介绍 您已经创建了一个 Spring Boot 应用程序。它在您的本地计算机上运行良好,现在您需要将该应用程序部署到其他地方。在某些平台上,您可以直接提交jar文件,它将被部署。在某些地方,您可以启动虚拟机,下载源代码,构建并运行它。但是,大多数时候您需要使用容器来部署应用程序。大...
    程式設計 發佈於2024-11-05
  • 如何保護 PHP 程式碼免於未經授權的存取?
    如何保護 PHP 程式碼免於未經授權的存取?
    保護PHP 代碼免於未經授權的訪問保護PHP 軟體背後的智慧財產權對於防止其濫用或盜竊至關重要。為了解決這個問題,可以使用多種方法來混淆和防止未經授權的存取您的程式碼。 一個有效的方法是利用 PHP 加速器。這些工具透過快取頻繁執行的部分來增強程式碼的效能。第二個好處是,它們使反編譯和逆向工程程式碼...
    程式設計 發佈於2024-11-05
  • React:了解 React 的事件系統
    React:了解 React 的事件系統
    Overview of React's Event System What is a Synthetic Event? Synthetic events are an event-handling mechanism designed by React to ach...
    程式設計 發佈於2024-11-05
  • 為什麼在使用 Multipart/Form-Data POST 請求時會收到 301 Moved Permanently 錯誤?
    為什麼在使用 Multipart/Form-Data POST 請求時會收到 301 Moved Permanently 錯誤?
    Multipart/Form-Data POSTsMultipart/Form-Data POSTs嘗試使用multipart/form-data POST 資料時,可能會出現類似所提供的錯誤訊息遭遇。理解問題需要檢視問題的構成。遇到的錯誤是 301 Moved Permanently 回應,表示資...
    程式設計 發佈於2024-11-05

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3