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.
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.
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:
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)); } }
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:
Kod penuh untuk C Battlesnake boleh didapati di sini di GitHub.
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!