ईमानदारी से कहूं तो, मुझे जावा मानक लाइब्रेरी में एक बुनियादी वेब सर्वर की उपलब्धता के लिए गूगल करना पड़ा। यह पता चला है कि इसमें एक HTTP सर्वर है (पैकेज नाम के आधार पर) जो शायद मानक लाइब्रेरी के सबसे पुराने हिस्सों में से एक है: com.sun.net.httpserver.HttpServer।
सर्वर कार्यान्वयन का उपयोग करना वास्तव में काफी सरल है, यहां बैटलस्नेक मेटाडेटा अनुरोध को संभालने के लिए मेरा प्रारंभिक कोड है:
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 डेटा को पार्स करने के लिए है। मानक जावा लाइब्रेरी में JSON पार्सर नहीं होता है, और एक विशिष्ट पार्सर लाइब्रेरी में कोड की हजारों लाइनें होती हैं।
बहुत सारे हैक्स के साथ मैं बैटलस्नेक 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); }
मुझे यकीन है कि गेम लॉजिक में सुधार किया जा सकता है, इसे क्यों न आज़माएं? ?
और यह क्रियान्वित संपूर्ण कोड है:
सी बैटलस्नेक का पूरा कोड यहां 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"}}इस श्रृंखला में मैं अपनी स्व-लगाई गई प्रोग्रामिंग चुनौती के साथ अपनी प्रगति साझा करूंगा: यथासंभव विभिन्न प्रोग्रामिंग भाषाओं में एक बैटलस्नेक बनाएं।
इस श्रृंखला के संक्षिप्त परिचय के लिए पहली पोस्ट देखें।
आप GitHub पर मेरी प्रगति का अनुसरण भी कर सकते हैं।
जावा उद्यमों की भाषा है, कई बड़े बैक-ऑफ़िस सिस्टम के व्यावसायिक तर्क इसमें लिखे गए हैं।
मैंने अतीत में बहुत सारे जावा कोड लिखे हैं, लेकिन पायथन और जावास्क्रिप्ट ने मेरी समकालीन प्रोग्रामिंग गतिविधियों में इसका स्थान ले लिया है।
क्योंकि जावा का उपयोग बहुत ही पठनीय और मजबूत सॉफ़्टवेयर लिखने के लिए किया जा सकता है (जावा आईडीई में बढ़िया रीफैक्टरिंग समर्थन होता है), मुझे अभी भी लगता है कि यह कुछ प्रणालियों के लिए सही भाषा है।
अपने पूर्ववर्तियों की तुलना में, जावा डेवलपर्स के लिए बहुत सारे सुधार लेकर आया (बेशक, आपकी पसंद के आधार पर): स्वचालित मेमोरी प्रबंधन, अंतर्निहित संग्रह प्रकार और एक व्यापक मानक लाइब्रेरी। हालाँकि, भाषा अब 30 वर्ष से अधिक पुरानी हो चुकी है, और उस समय के कुछ स्पष्ट संकेत हैं, जैसे कि मानक लाइब्रेरी में कोई JSON समर्थन नहीं है (लेकिन इसमें XML समर्थन है?)।
क्या जावा, जैसा कि यह आज आउट-ऑफ़-द-बॉक्स आता है, अभी भी एक स्वच्छ और संक्षिप्त बैटलस्नेक कार्यान्वयन के निर्माण के लिए उपयोग किया जा सकता है? जानने के लिए पढ़ें।
Snake.java इस तरह दिखता है:
public class Snake { public static void main(String args[]) { System.out.println("Hello world!"); } }
डॉकरफ़ाइल इस प्रकार दिखती है:
FROM eclipse-temurin:17-jdk RUN mkdir /app WORKDIR /app COPY Snake.java . RUN javac Snake.java CMD ["java", "Snake"]
और यहां क्रियाशील विकास सेटअप है:
ईमानदारी से कहूं तो, मुझे जावा मानक लाइब्रेरी में एक बुनियादी वेब सर्वर की उपलब्धता के लिए गूगल करना पड़ा। यह पता चला है कि इसमें एक HTTP सर्वर है (पैकेज नाम के आधार पर) जो शायद मानक लाइब्रेरी के सबसे पुराने हिस्सों में से एक है: com.sun.net.httpserver.HttpServer।
सर्वर कार्यान्वयन का उपयोग करना वास्तव में काफी सरल है, यहां बैटलस्नेक मेटाडेटा अनुरोध को संभालने के लिए मेरा प्रारंभिक कोड है:
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 डेटा को पार्स करने के लिए है। मानक जावा लाइब्रेरी में JSON पार्सर नहीं होता है, और एक विशिष्ट पार्सर लाइब्रेरी में कोड की हजारों लाइनें होती हैं।
बहुत सारे हैक्स के साथ मैं बैटलस्नेक 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 मुझे यकीन है कि गेम लॉजिक में सुधार किया जा सकता है, इसे क्यों न आज़माएं? ?
और यह क्रियान्वित संपूर्ण कोड है:
सी बैटलस्नेक का पूरा कोड यहां GitHub पर पाया जा सकता है।
प्रतिक्रिया की सराहना की गई!
मुझे आशा है कि आपको मेरे कोडिंग एडवेंचर्स के साथ पढ़ना पसंद आएगा।
नीचे टिप्पणियों में मुझे बताएं कि आप उपरोक्त कोड के बारे में क्या सोचते हैं, या आप इस श्रृंखला में किन प्रोग्रामिंग भाषाओं की प्रतीक्षा कर रहे हैं।
अगली भाषा तक!
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3