ब्राउज़र गेम, नेटवर्क दृष्टिकोण के लिए बॉट

बॉट्स के बारे में लेख पढ़ने के बाद, मैंने जावा का उपयोग करके एक बॉट बनाने और नेटवर्क प्रोटोकॉल (अर्थात, कोई मैक्रोज़ या एएस में कार्यान्वयन नहीं) का उपयोग करने में अपने मामूली अनुभव को साझा करने का निर्णय लिया।

परिचय

लगभग आधे साल पहले मैं एक नहीं बल्कि लोकप्रिय VKontakte गेम - ज़ोंक से मिला था, गेम खुद Zilch dice गेम पर एक भिन्नता है, और आपको अपने प्रतिद्वंद्वी को पासा पर विभिन्न संयोजनों को फेंकने की तुलना में 10,000 अंक तेजी से स्कोर करने की आवश्यकता है।

ट्रेनिंग

बॉट लिखना शुरू करने से पहले, मैंने यह अध्ययन करने का फैसला किया कि गेम सर्वर के साथ कैसे संवाद करता है और इसके साथ डेटा का आदान-प्रदान करता है। ऐसा करने के लिए, एक काफी लोकप्रिय स्निफर - विंडशार्क - का उपयोग किया गया था।

विंडसरक शुरू करने के बाद, आपको गेम शुरू करने और कुछ गेम खेलने की आवश्यकता है। फिर Wireshark में ब्राउज़र और सर्वर के बीच संदेश ढूंढें और वार्ता का पूरा इतिहास खोलें।



नतीजतन, यह पता चला कि खेल पोर्ट 9337/9338 पर सर्वर के साथ संचार करता है और एलआईएसआर अनुरोधों का उपयोग करके इसके साथ आदान-प्रदान करता है। प्रमाणीकरण XML संदेशों के आदान-प्रदान के रूप में होता है जिसमें आपकी VKontakte जानकारी होती है (जैसा कि मैं समझता हूं, यह जानकारी VKontakte API के माध्यम से निकाली गई है)।

वर्तनी बॉट

मैंने जावा का उपयोग करके बॉट बनाने का निर्णय लिया, क्योंकि मैं स्वयं भाषा से बहुत परिचित हूं, और मैं स्विंग का उपयोग करके अनुभव लेखन अनुप्रयोगों को प्राप्त करना चाहता था।

चूंकि मैं एक्सएमएल को पार्स करने में समय बर्बाद नहीं करना चाहता था, इसलिए प्रमाणीकरण के लिए संदेश कठोर और माथे पर लागू किया गया था:
socket = new Socket(serverIP, port); out = new PrintWriter(socket.getOutputStream()); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.print("<msg t='sys'><body action='verChk' r='0'><ver v='161' /></body></msg>" + END_CHAR); out.flush(); while (!ZonkBotApp.getMessage(in).contains("apiOK")) {} out.print("XMLMESSAGE" + END_CHAR); //  out.flush(); 

JSON का उपयोग करके संदेश भेजने के लिए, जैक्सन जावा JSON- प्रोसेसर का उपयोग किया गया था।
फिर एक बॉट उदाहरण बनाया गया था, जिसके निर्माता को इनपुट और आउटपुटस्ट्रीम (सॉकेट के माध्यम से खोला गया) पारित किया गया था:
 public Bot(BufferedReader in, PrintWriter out) { inputStream = in; outputStream = out; } 

बॉट के पास सिर्फ एक तरीका है जो एक कमरा बनाता है और एक मैच जीतता है:
 public void playGame(JTextArea outConsole, int gameType, int aiType) 

बॉट का दूसरा घटक इसका मस्तिष्क था, जो एक सार्वजनिक विधि के साथ एक वर्ग है:
 public BotAction actionToDo(DiceThrow diceThrow, int aiType); 

इस पद्धति ने खेल में वर्तमान स्थिति, लक्ष्य को ध्यान में रखते हुए, शेष शॉट्स की संख्या, फेंक का वजन, आदि के आधार पर अगला समाधान लौटाया।

बॉट में एक बल्कि तपस्वी इंटरफ़ेस था जो सर्वर से जुड़ने, बुनियादी सेटिंग्स बनाने और बॉट लॉन्च करने की अनुमति देता था।



आगे का शोध

बॉट लिखने के बाद, मैंने इसे ठीक करने के लिए तंत्र से निपटने का फैसला किया। इसके लिए, बॉट के "दिमाग" के कई वेरिएंट लागू किए गए, जिनका उद्देश्य एक अलग गेम, आक्रामक, निष्क्रिय या एक निश्चित सीमा तक पहुंचना है। जैसा कि मैंने कोशिश नहीं की, लेकिन मैं बॉट को अंकों के लिए नहीं ला सका, सबसे अच्छी बात जो मैं कर सकता था वह 2000 के खेल के साथ 5% अंक का नुकसान था।

प्रारंभिक बिल्लियां बहुत खराब स्थिति में हैं (बॉट को एक साल पहले लिखा गया था), लेकिन अगर कोई इच्छा है, तो मैं उन्हें क्रम में रखने और इसे गीथब पर रखने की कोशिश करूंगा।

Source: https://habr.com/ru/post/In127444/


All Articles