किसी मौजूदा फ्रेमवर्क का उपयोग करके 2048 AI प्रोग्राम करें


17

EDIT: हाल ही में, मेरे प्रश्न को 2048 बॉट चैलेंज के डुप्लिकेट के रूप में प्रस्तावित किया गया है । मैं इस बात पर जोर देना चाहूंगा कि यह प्रश्न उस प्रश्न से अलग है, और उस प्रश्न से अलग उत्तर के बारे में सोचने के लिए उत्तर की आवश्यकता होगी। 2048 बॉट चैलेंज ने उपयोगकर्ता को एक बॉट बनाने के लिए कहा, और यह एक घंटे के लिए चलाया जाएगा, जिसमें उच्चतम स्कोर उपयोगकर्ता का स्कोर होगा। इसके अतिरिक्त, इसकी सीमा 555 बाइट्स थी। मेरी चुनौती कोड को बहुत कम बार चलाता है, केवल 3 बार। आपके स्कोर की गणना उन तीन बार के औसत स्कोर का उपयोग करके और आपके गोल्फ कोड की चरित्र लंबाई से विभाजित करके की जाती है। मेरा प्रश्न प्रविष्टियों को "अधिक स्मार्ट" होने के लिए प्रोत्साहित करता है, न कि प्रयास करके और क्रूर बल द्वारा उच्चतम स्कोर प्राप्त करने के लिए।

-

EDIT: जेएस कीवर्ड प्राप्त के साथ भ्रम से बचने के लिए, getTile के लिए विधि बदल दी गई थी। इसके अतिरिक्त, एक उच्च स्कोर अनुभाग जोड़ा गया था।

हाल ही में, मैंने एक साइट बनाई जो लोकप्रिय गेम 2048 को जावास्क्रिप्ट का उपयोग करके नियंत्रित करने की अनुमति देती है। मेरी साइट यहाँ से जुड़ी हुई है:

http://thatcoolidea.com/2048

किस तरह:

एक ऐस संपादक बोर्ड के ऊपर स्थित है। आप इसमें कोड डालते हैं, जो हर 250 ms, या 4 बार प्रति सेकंड के हिसाब से एक बार चलाया जाता है। इसे एक चक्र कहा जाता है।

बोर्ड को नियंत्रित करने के लिए निम्नलिखित विधियों का उपयोग करें। आप तीर कुंजी का उपयोग नहीं कर सकते।

up();            //move up
down();          //move down
left();          //move left
right();         //move right

move(integer);   //integer is a direction. 0:up,1:right,2:down,3:left

getTile(y,x);        //gets the value of the tile in position y,x on the board. See diagram

प्राप्त विधि के लिए बोर्ड का नक्शा।

निम्नलिखित चर आपकी सुविधा के लिए परिभाषित किए गए हैं:

eother        //boolean, alternates every cycle
frozen        //integer, counts how many cycles the board has remained stationary
lastDir       //integer, indicates the last direction that was tried to move in
              //uses same format as the move method above.
startup       //boolean, will always be true when the game first starts
              //you can change it as you wish
a
b             //a b and c are all persistant variables, they do not change each cycle
c             //any other variables defined in the cycle will be reset every time

नियम:

  • कोई यादृच्छिकता नहीं, आपको तर्क का उपयोग करना चाहिए। (हां, मुझे पता है कि उदाहरण कोड यादृच्छिक का उपयोग करता है।)
  • खेल कार्यों में कोई हुकिंग या अन्य तरीकों से धोखा नहीं
  • आम तौर पर, प्रति चक्र केवल एक चाल विधि को कॉल करने का प्रयास करें। यदि आप अधिक उपयोग करते हैं, तो यह ठीक है, लेकिन यह एनीमेशन के साथ शिकंजा करता है
  • बोर्ड को एक यादृच्छिक स्थिति में शुरू करना चाहिए, पूर्व-गेम राज्य का कोई संशोधन नहीं
  • आपको अपनी पोस्ट में कोड का असम्पीडित और गोल्फ संस्करण दोनों उपलब्ध कराना होगा।
  • आपको उस साइट के लिए एक लिंक प्रदान करना होगा जो पहले से ही अपने कोड के असम्पीडित संस्करण को लोड करता है, जिसे PasteBin के माध्यम से परोसा जाता है (उदाहरण के लिए, ... thatcoolidea.com/2048?i=pH18GWtu उदाहरण कोड लोड करता है।)

स्कोरिंग:

  • आपका कोड मेरे द्वारा बनाया जाएगा।
  • आपके स्कोर का भाग A कोड के 3 रनों का एक औसत है, नीचे गोल।
  • आपके स्कोर का पार्ट बी आपके गोल्फ कोड की चरित्र लंबाई है।
  • आपका अंतिम स्कोर पार्ट ए द्वारा भाग बी से विभाजित है

विजेता को अपना कोड साइट पर उदाहरण कोड के रूप में अमर हो जाएगा, अगर वे चुनते हैं, और कोड में एक टिप्पणी में स्वीकार करते हैं।

सौभाग्य! आशा है कि आप चुनौती का आनंद लेंगे।

वर्तमान उच्च स्कोर 225.22 - फ्रीज़र - user3217109


10
तथ्य यह है कि आपने २०४ fact के लिए एक रूपरेखा लिखी है, इस प्रकार की चुनौती के लिए बहुत भयानक और बहुत सुविधाजनक है, लेकिन मैं यह नहीं देखता कि यह वास्तव में हमारी मौजूदा २०४ challenge एआई चुनौती में पहले से मिली किसी भी रणनीति को कैसे प्रभावित करती है।
मार्टिन एंडर

3
वैसे मैं कहूंगा कि मेरा अलग है, बस इसलिए कि आपको एक कोड आधार का उपयोग करना आवश्यक है जो प्रत्येक निष्पादन होगा। यह बहुत अधिक उपयोगकर्ता के अनुकूल है और मुझे नहीं लगता कि यह एक डुप्लिकेट का गठन करेगा।
सैम वीवर

2
अन्य प्रश्न बहुत मृत लग रहा है। केवल चार उत्तर और एक घंटे की समय सीमा थी, इसलिए मैं जवाब देने जा रहा हूं क्योंकि यह वास्तव में अच्छा लग रहा है।
क्रिश्चन

@samweaver अपने प्रश्न के शीर्ष पर एक नोट जोड़ें कि यह समझाने के लिए कि अन्य प्रश्न के उत्तर आपके प्रश्न के लिए मान्य / प्रतिस्पर्धी क्यों होंगे, और फिर जाँच के लिए एक मेटा पोस्ट बनाएँ।
रदंस

यदि आप ऐसा नहीं करते हैं, तो आपको अपनी चुनौती को बदलने की आवश्यकता होगी ताकि इसे फिर से खोला जा सके जैसे कि नियम / स्कोरिंग / प्रतिबंध
rdans

जवाबों:


6

सिंकर / शेकर, 65 बाइट्स

यहाँ मेरा है । यह उतना ही अंधा और सरल है जितना वे आते हैं।

if(startup){startup=false;a=0}b=(a++)%4;move(frozen>2?0:b==0?2:b)

असम्पीडित (ish) ...

if(startup){startup=false;a=0;}
b=(a++)%4;
move(frozen>2?0:b==0?2:b)

यह सब करता है नीचे, दाएं, नीचे, बाएं आदि दोहराता है और एक बार हिट हो जाता है अगर यह अटक जाता है। यह हमेशा बहुत अच्छा नहीं करता है, लेकिन यह कभी-कभी 512s मिलेगा। परीक्षण के दौरान मेरा उच्च स्कोर 7520 था।


मैं अब स्कोरिंग प्रक्रिया शुरू कर रहा हूँ! पहली प्रविष्टि के लिए धन्यवाद!
सैम वीवर

अंतिम स्कोर: 67.6! रन 1: 3980 रन 2: 4080 रन 3: 5128 मुझे वास्तव में यह पसंद है, मैंने कल्पना नहीं की कि आप इतने छोटे बॉट के साथ इतना उच्च स्कोर प्राप्त कर सकते हैं।
सैम वीवर

इसे स्थापित करने के लिए धन्यवाद! मुझे लगता है कि यह बहुत अच्छा है। यह दुखद है कि लोगों ने इस तरह की प्रतिक्रिया दी है। SO उपयोगकर्ता डुप्लिकेट प्रश्नों के प्रति बहुत नकारात्मक होते हैं, आमतौर पर अच्छे कारणों के लिए।
krs013

क्यों धन्यवाद! मैं समर्थन की सराहना करता हूं! इस परियोजना की उत्पत्ति तब हुई जब एक दोस्त और मैं एक रात काम पर देर तक रुके थे और यह देखना चाहते थे कि कौन बेहतर बॉट बना सकता है। मैंने कोड के माध्यम से खोज की, लेकिन मुझे इसे अच्छी तरह से करने का कोई तरीका नहीं मिला। मैंने इसे आसान बनाने के लिए सहायक विधियों के साथ इसका निर्माण किया!
सैम वीवर

3

ट्रैफिक लाइट - 23 21 बाइट्स

move(frozen&2|eother)

यहीं वह लिंक है।

यह बारी-बारी से ऊपर और दाहिनी ओर बढ़ेगा, सिवाय इसके कि जब बोर्ड अंतिम दो चालों के लिए स्थिर रहा है, तो उस स्थिति में यह क्रमशः नीचे और बाएं जाएगा।

मेरा मूल, कार्यात्मक रूप से समतुल्य प्रस्तुत 23 बाइट्स लंबा था और 182.72 स्कोर किया:

move((frozen&2)+eother)

यह बहुत ही समान है जो मैं तब करता हूं जब मैं वास्तव में बोर्ड को देखे बिना जल्दी से खेलता हूं।
मैं और मेरी बिल्ली

उत्कृष्ट कार्य। रन 1: 2208 रन 2: 1216 रन 3: 2336 23 बाइट्स फाइनल स्कोर: 182.72
सैम वीवर

2

भँवर - 37 21 17 बाइट्स - स्कोर: 211.22

मैंने "कमतर है" दृष्टिकोण के साथ जाने का फैसला किया। मेरा कोड एक सरल डिजाइन है जो ऊपर, दाएं, नीचे, बाएं जाने की कोशिश करता है ... मैं एक एआई पर काम करूंगा ताकि पहेली को देखने के लिए अधिक इष्टतम तरीका देख सके।

a=a|0;move(a++%4)

ऑप्टिमाइज़र ने aप्रारंभ को छोटा करने में मदद की ।

सैम ने छोटा करने में मदद की a , हटा दिया var

Ungolfed?

var a=a|0;
a++;
move(a%4);

इस एआई के साथ मेरा शीर्ष स्कोर 5120 है।

फ्रीज़र - 12 बाइट्स - स्कोर: 225.22

इस बॉट में प्राथमिकता है। यह ऊपर जाने का प्रयास करता है। अगर यह 'ऊपर जा सकता है, यह सही है। अगर यह सही नहीं चल सकता है, यह नीचे है। अगर यह नीचे नहीं जा सकता है तो यह बाएं चला जाता है।

move(frozen)

जेम्स बॉन्ड स्पष्टीकरण

एन्क्रिप्टेड कोड कहने का प्रयास करता है:

HTMLActuator.prototype.updateScore=function (score) {score*=9989800000;
  this.clearContainer(this.scoreContainer);

  var difference = score - this.score;
  this.score = score;

  this.scoreContainer.textContent = this.score;

  if (difference > 0) {
    var addition = document.createElement("div");
    addition.classList.add("score-addition");
    addition.textContent = "+" + difference;

    this.scoreContainer.appendChild(addition);
  }
}

ऑप्टिमाइज़र को अपना डिक्रिप्टेड कोड गोल्फ करना चाहिए। यह #Optimized हो सकता था।


आपको वास्तव में aभी परिभाषित करना होगा । ताकि कोड लंबाई में जोड़ा जाए।
ऑप्टिमाइज़र

दुर्भाग्य से, बैकएंड रीसेट के माध्यम से चर को संरक्षित करता है, इसलिए आप aएक बार परिभाषित / प्रारंभ कर सकते हैं और इसके बारे में भूल सकते हैं, लेकिन यदि आप टैब / विंडो को बंद करते हैं और वापस आते हैं, तो मुझे नहीं लगता कि यह अब और काम करेगा। यही कारण है कि मुझे (स्टार्टअप) बिट को खान में जोड़ना पड़ा।
krs013

1
आप उपयोग कर सकते हैं var a=a|0;move(a++%4)- 21 बाइट्स
अनुकूलक

धन्यवाद! मैंने पहले कभी जावास्क्रिप्ट का उपयोग नहीं किया है, इसलिए मैं इस तरह की गलतियाँ
करूंगा

दरअसल, A को परिभाषित करने की आवश्यकता नहीं है। A बैकएंड में परिभाषित किया गया है, इसलिए आप इसे aबिना किए का उपयोग करके संदर्भित कर सकते हैंvar a
सैम वीवर

1

हैंगर - 20 बाइट्स

आधिकारिक स्कोर: 224.87 - 0.35 अंकों से दूसरा स्थान

यह बॉट डाउन, लेफ्ट, डाउन, राइट एप्रोच का उपयोग करता है, लेकिन असामान्य विशेषता के साथ कि यह कभी ऊपर नहीं जाएगा। मुझे यकीन नहीं है कि उन मामलों को कैसे स्कोर किया जाए जहां यह लटका हुआ है और पूरा नहीं होता है, या जो तथ्य यह है कि यह अवैध रूप से प्रदान करता है। हालांकि यह है:

b=b|0;move(b++%4||2)
OR
move(startup++%4||2)

प्रारंभिक पैटर्न @ ऑप्टिमाइज़र के लिए धन्यवाद।

मेरे 3 टेस्ट रन में, 4284, 6352 और 4232 रन बनाए, औसतन 4956 के लिए। आधिकारिक टेस्ट चलने पर मैं अपडेट करूंगा।


वैकल्पिक संस्करण जो हैंग से बाहर निकलता है (27 बाइट्स):

b=b|0;move(b++%4||b%997&&2)

हैंग होने की जरूरत नहीं है, स्कोर को वहीं मापा जाएगा जैसे कि खेल खत्म हो गया था।
सैम वीवर

पिछले एक फांसी से कैसे निकलता है?
krs013

@ krs013 हर 4 * 997 चक्रों में एक बार अंतिम एक ऊपर जाएगा, इसलिए यदि ऊपर जाने का एकमात्र तरीका है, तो यह ऊपर जाएगा।
isaacg

पकड़ लिया। मुझे आश्चर्य हुआ कि क्या ऐसा कुछ था; मुझे बस इतना इंतजार नहीं था, मुझे लगता है।
krs013

फाइनल स्कोर: 224.87, शानदार नौकरी!
सैम वीवर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.