老實說,我必須在 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\\\"); Setfood = 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 上找到。
我希望您喜歡閱讀我的程式設計冒險。
請在下面的評論中告訴我您對上述程式碼的看法,或您在本系列中期待哪些程式語言。
直到下一種語言!
","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"}}在本系列中,我將分享我在自我施加的程式設計挑戰方面的進展:用盡可能多的不同程式語言建立 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"); Setfood = 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 我確信遊戲邏輯可以改進,為什麼不嘗試呢? ?
這是完整的代碼:
C Battlesnake 的完整程式碼可以在 GitHub 上找到。
感謝回饋!
我希望您喜歡閱讀我的程式設計冒險。
請在下面的評論中告訴我您對上述程式碼的看法,或您在本系列中期待哪些程式語言。
直到下一種語言!
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3