خادم ويب أساسي

لأكون صادقًا، كان عليّ أن أبحث في 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\\\");        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"}}
"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > تحدي أفعى المعركة #جافا

تحدي أفعى المعركة #جافا

تم النشر بتاريخ 2024-08-21
تصفح:593

في هذه السلسلة سأشارك التقدم الذي أحرزته في تحدي البرمجة الذي فرضته على نفسي: إنشاء 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");
        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] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3