لأكون صادقًا، كان عليّ أن أبحث في Google عن توفر خادم ويب أساسي في مكتبة Java القياسية. اتضح أن هناك خادم 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 في الماضي، لكن Python وJavaScript أخذتا مكانهما في أنشطتي البرمجية المعاصرة.
نظرًا لأنه يمكن استخدام Java لكتابة برامج قوية وسهلة القراءة (تميل Java IDEs إلى الحصول على دعم كبير لإعادة البناء)، ما زلت أشعر أنها اللغة المناسبة لبعض الأنظمة.
بالمقارنة مع سابقاتها، جلبت 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 القياسية. اتضح أن هناك خادم 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