मुझे कैसे पता चलेगा कि मेरी पहेली खेल हमेशा संभव है?


68

मैंने एक पहेली गेम बनाया है जहाँ लक्ष्य सभी सफेद टाइलों से छुटकारा पाना है। आप इसे प्रश्न के अंत में आज़मा सकते हैं।

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

function newgame() {
 moves = 0;
    document.getElementById("moves").innerHTML = "Moves: "+moves;

  for (var i = 0; i < 25; i++) {
   if (Math.random() >= 0.5) {
$(document.getElementsByClassName('block')[i]).toggleClass("b1 b2")
   }
}
}
newgame();
function toggle(a,b) {  
  moves += 1;
  document.getElementById("moves").innerHTML = "Moves: "+moves;
$(document.getElementsByClassName('block')[a+(b*5)]).toggleClass("b1 b2");

if (a<4) {$(document.getElementsByClassName('block')[(a+1)+(b*5)]).toggleClass("b1 b2")}
  
  
if (a>0) {$(document.getElementsByClassName('block')[(a-1)+(b*5)]).toggleClass("b1 b2")}
  
  
if (b<4) {$(document.getElementsByClassName('block')[a+((b+1)*5)]).toggleClass("b1 b2")}
  
if (b>0) {$(document.getElementsByClassName('block')[a+((b-1)*5)]).toggleClass("b1 b2")}
}
body {
  background-color: #000000;
}

.game {
  float: left;
  background-color: #000000;
  width: 300px;
  height: 300px;
  overflow: hidden;
  overflow-x: hidden;
  user-select: none;
  display: inline-block;
}

.container {
  border-color: #ffffff;
  border-width: 5px;
  border-style: solid;
  border-radius: 5px;
  width: 600px;
  height: 300px;
  text-align: center;
}

.side {
  float: left;
  background-color: #000000;
  width: 300px;
  height: 300px;
  overflow: hidden;
  overflow-x: hidden;
  user-select: none;
  display: inline-block;
}

.block {
  transition: background-color 0.2s;
  float: left;
}

.b1:hover {
  background-color: #444444;
  cursor: pointer;
}

.b2:hover {
  background-color: #bbbbbb;
  cursor: pointer;
}

.row {
  width: 300px;
  overflow: auto;
  overflow-x: hidden;
}

.b1 {
  display: inline-block;
  height: 50px;
  width: 50px;
  background-color: #000000;
  border-color: #000000;
  border-width: 5px;
  border-style: solid;
}




.b2 {
  display: inline-block;
  height: 50px;
  width: 50px;
  background-color: #ffffff;
  border-color: #000000;
  border-width: 5px;
  border-style: solid;
}



.title {
  width: 200px;
  height: 50px;
  color: #ffffff;
  font-size: 55px;
  font-weight: bold;
  font-family: Arial;
  display: table-cell;
  vertical-align: middle;
}

.button {
  cursor: pointer;
  width: 200px;
  height: 50px;
  background-color: #000000;
  border-color: #ffffff;
  border-style: solid;
  border-width: 5px;
  color: #ffffff;
  font-size: 25px;
  font-weight: bold;
  font-family: Arial;
  display: table-cell;
  vertical-align: middle;
  border-radius: 5px;
  transition: background-color 0.3s, color 0.3s;
}

.button:hover {
  background-color: #ffffff;
  color: #000000;
}

.sidetable {
  padding: 30px 0px;
  height: 200px;
}


#moves {
  width: 200px;
  height: 50px;
  color: #aaaaaa;
  font-size: 30px;
  font-weight: bold;
  font-family: Arial;
  display: table-cell;
  vertical-align: middle;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<center>
  <div class="container">
  
  
  <div class="game"><div class="row"><div onclick="toggle(0,0);" class="block b1"></div><div onclick="toggle(1,0);" class="block b1"></div><div onclick="toggle(2,0);" class="block b1"></div><div onclick="toggle(3,0);" class="block b1"></div><div onclick="toggle(4,0);" class="block b1"></div></div><div class="row"><div onclick="toggle(0,1);" class="block b1"></div><div onclick="toggle(1,1);" class="block b1"></div><div onclick="toggle(2,1);" class="block b1"></div><div onclick="toggle(3,1);" class="block b1"></div><div onclick="toggle(4,1);" class="block b1"></div></div><div class="row"><div onclick="toggle(0,2);" class="block b1"></div><div onclick="toggle(1,2);" class="block b1"></div><div onclick="toggle(2,2);" class="block b1"></div><div onclick="toggle(3,2);" class="block b1"></div><div onclick="toggle(4,2);" class="block b1"></div></div><div class="row"><div onclick="toggle(0,3);" class="block b1"></div><div onclick="toggle(1,3);" class="block b1"></div><div onclick="toggle(2,3);" class="block b1"></div><div onclick="toggle(3,3);" class="block b1"></div><div onclick="toggle(4,3);" class="block b1"></div></div><div class="row"><div onclick="toggle(0,4);" class="block b1"></div><div onclick="toggle(1,4);" class="block b1"></div><div onclick="toggle(2,4);" class="block b1"></div><div onclick="toggle(3,4);" class="block b1"></div><div onclick="toggle(4,4);" class="block b1"></div></div></div>
    
    <div class="side">
      <center class="sidetable">
        <div class="title">Tiles</div>
        <br>
        <div class="button" onclick="newgame()">New Game</div>
        <br><br>
        <div id="moves">Moves: 0</div>
      </center>
    </div>
    
  </div>
    </center>


9
यदि आप इस तरह के पहेली खेल में रुचि रखते हैं, तो साइमन टाथम के पोर्टेबल पहेली संग्रह पर एक नज़र डालें । इस प्रकार के अलावा (जिसे वहां फ्लिप कहा जाता है), आप कई जापानी और अन्य पहेलियों के वेरिएंट पा सकते हैं। सब कुछ बीएसडी लाइसेंस के तहत है और शायद एक दिलचस्प पढ़ा है।
डब्बू

10
कैसे रिवर्स इंजीनियरिंग के बारे में यह? एक खाली बोर्ड से शुरू करें, फिर स्वचालित करें, यादृच्छिक वर्गों पर 20 क्लिक करें। इस तरह आप जानते हैं कि अंत में एक समाधान होना चाहिए।
AJFaraday

3
मैं खेलना जारी रखना चाहता हूं, लेकिन आपके सवाल के कारण, मैं वास्तव में जीत पाऊंगा या नहीं, इसकी अनिश्चितता मुझ पर खा रही है! मज़ा खेल :)
MrDuk

@MrDuk codepen.io/qwertyquerty/pen/WMGwVW यहां तैयार प्रोजेक्ट है! यह एक तय है, और पॉलिश है। मैंने एक इलेक्ट्रॉन ऐप भी बनाया है।
क्वर्टी

@Qwerty जब मैंने आपके पेन को पूर्ण पृष्ठ दृश्य में देखने का प्रयास किया, तो मुझे संदेश मिला "इस पेन के मालिक को पूर्ण पृष्ठ दृश्य को सक्षम करने के लिए अपने ईमेल पते को सत्यापित करने की आवश्यकता है।" कृपया CodePen पर अपना ईमेल पता सत्यापित करें ताकि मैं पूरी विंडो में आपके खेल का आनंद ले सकूँ! :)
Stephenwade

जवाबों:


161

यह एक प्रकार का खेल है जहां एक ही चाल दो बार प्रदर्शन करने पर बोर्ड को अपनी पिछली स्थिति में उलट देता है। तो यह सुनिश्चित करने के लिए कि एक बोर्ड सॉल्व है, रिवर्स में खेलकर उत्पन्न करें। एक हल (खाली) बोर्ड के साथ शुरू करें, फिर प्रोग्रामेटिक रूप से "क्लिक करना" शुरू करें या तो एक निश्चित संख्या में या जब तक बोर्ड में सफेद वर्गों की वांछित संख्या न हो। एक समाधान तो बस उल्टे क्रम में एक ही चाल प्रदर्शन करने के लिए है। अन्य छोटे समाधान मौजूद हो सकते हैं, लेकिन आपको कम से कम एक होने की गारंटी है।

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


22
@ क्वर्टी: आपकी विशिष्ट समस्या के लिए, एक ही वर्ग को दो बार रद्द करने पर ही क्लिक करना है, इसलिए किसी भी वर्ग को एक से अधिक बार क्लिक करने का कोई कारण नहीं है। आप दोहराए बिना क्लिक करने के लिए कुछ निश्चित वर्गों का चयन करना चाहते हैं, या एक समाधान पर विचार कर सकते हैं जो बोर्ड पर प्रत्येक वर्ग के लिए एक XX% संभावना-क्लिक पर असाइन करता है। (एड: अच्छा जवाब, +1!)
जेफ बोमैन

3
मैंने पहले लगभग एक ही खेल बनाया है और इस दृष्टिकोण का उपयोग करके समाप्त हुआ। मैंने शुरुआत में एक एनीमेशन को शामिल किया, जिसमें हल की अवस्था में एक त्वरित अवस्था में अनसुलझी स्थिति को दिखाया गया था; यह काफी बढ़िया था।
जारेड गोगुएन

1
@JaredGoguen अजीब है, मैंने उसे जोड़ा और आपकी टिप्पणी देखने के लिए यहां वापस आया।
क्वर्टी

4
@JeffBowman वास्तव में, सॉल्वेबल गेम्स के सेट को 25-बिट मान के रूप में माना जा सकता है, प्रत्येक वर्ग के समान बिट जो कि फ़्लिप किए गए मॉड 2 की संख्या है। इसलिए 0 रेंज में एक यादृच्छिक संख्या उत्पन्न कर सकता है। .33,554,432 और फिर लघु क्रम में बोर्ड से प्रत्येक वर्ग के मूल्य की गणना करें।
मोंटी हार्डर 20

7
इसके लायक क्या है, जबकि यह गणितीय सवाल का सही उत्तर है कि इस समस्या का जवाब कैसे दिया जाए, यह आमतौर पर एक डिजाइन दृष्टिकोण से एक संदिग्ध अभ्यास है। इस तरह की पीढ़ी, बिना किसी विशेष योजना के, आम तौर पर उन पहेलियों की ओर ले जाती है जो किसी विशेष बिंदु या किसी भी एकीकृत विषयों के बिना बहुत 'समान' महसूस करती हैं। एक पहेली खेल के लिए दिलचस्प समस्या के उदाहरणों को 'प्रक्रियात्मक रूप से उत्पन्न करना' संभव है, लेकिन आमतौर पर आपकी पहेली की दिलचस्प विशेषताएं क्या होती हैं, इस पर बहुत अधिक ध्यान देने की आवश्यकता है।
स्टीवन स्टडनिक

92

जबकि उपरोक्त उत्तर चतुर हैं (और शायद मैं इसे वैसे भी कैसे करूँगा), यह विशेष खेल बहुत अच्छी तरह से जाना जाता है। इसे लाइट्स आउट कहा जाता है , और इसे गणितीय रूप से हल किया गया है। वहाँ एक समाधान है अगर और केवल अगर विभिन्न तत्वों के दो रकम (विकिपीडिया पृष्ठ पर दिए गए) शून्य मॉड 2 (यानी एक भी संख्या) में जोड़ें। सामान्य तौर पर थोड़ा रैखिक बीजगणित को किसी भी बोर्ड पर गेम के लिए समान समाधान की स्थिति देनी चाहिए।


2
यह पता लगने की तरह है कि यह पहले से ही बना हुआ है। मुझे लगा कि मैं किसी चीज़ पर हूँ।
क्वर्टी

39
@ क्वर्टी बहुत कम मूल विचार हैं, और आपको निश्चित रूप से सफल होने की आवश्यकता नहीं है (सीएफ रोवियो, किंग)।
ऑरेंजडॉग

14
यह विशेष गेम मौजूद है, लेकिन आप हमेशा विचार पर विस्तार कर सकते हैं! अधिक सुविधाएँ जोड़ें! जब आप कहीं क्लिक करते हैं तो क्या होता है, इसके लिए अलग-अलग नियम जोड़ें, जैसे रंग जो एक साथ जोड़ते हैं, यह किस दिशा में सक्रिय / निष्क्रिय किया गया था। विभिन्न "टूल" जोड़ें, जिनका आपको उपयोग करना है। गैर-आयताकार बोर्ड जोड़ें! बहुत मज़ा करने के लिए सामान। बस याद रखें कि एक चाल हमेशा खुद को उल्टा करना चाहिए।
एड मार्टी

7
@ ऑरेंजडॉग: यहां तक ​​कि 'लाइट्स आउट' भी मूल नहीं था, यह सिर्फ ब्रांड नाम है जो 90 के दशक में लोकप्रिय हुआ। उदाहरण के लिए विकिपीडिया लेख, इस और इस
ब्लूराज - डैनी पफ्लुगुएफ्ट

1
आप "उपरोक्त उत्तरों" के रूप में किन उत्तरों का उल्लेख कर रहे हैं? यह पूरी तरह से अस्पष्ट है, क्योंकि मेरी स्क्रीन पर, आपके ऊपर केवल एक ही उत्तर है। याद रखें कि उत्तर वोट और उपयोगकर्ता विकल्पों के आधार पर परिवर्तन के आदेश देते हैं। आपको हमेशा "ऊपर" किसी चीज़ का संदर्भ देने के बजाय विशिष्ट उत्तरों से लिंक करना चाहिए।
डेविड रिचेर्बी

13

अपनी पहेली बनाते समय दूसरे रास्ते पर जाएँ।

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

इस तरह से आपको कम से कम एक समाधान करने की गारंटी होगी: उपयोगकर्ता को उस स्तर को बनाने के लिए करना होगा जिसे आपने "AI" खिलाड़ी बनाया था।


7

एड और एलेक्जेंडर का अधिकार है।

लेकिन अगर आप करते हैं यह जानना चाहते हैं कि हर समाधान संभव है चाहता हूँ, वहाँ तरीके हैं।

संभावित पहेली की एक सीमित संख्या है

एक ही वर्ग पर दो बार क्लिक करने से एक ही परिणाम उत्पन्न होता है, क्योंकि उस पर क्लिक न करना, चाहे उनके बीच कितने भी क्लिक किए गए हों। इसका मतलब है कि प्रत्येक समाधान को प्रत्येक वर्ग को 'क्लिक किए गए' या 'क्लिक नहीं किए गए' के ​​बाइनरी मान देकर वर्णित किया जा सकता है। इसी तरह, प्रत्येक पहेली को प्रत्येक वर्ग को 'टॉगल' या 'टॉगल नहीं' का बाइनरी मान देकर वर्णित किया जा सकता है। इसका मतलब है कि 2 ^ 25 संभव पहेलियाँ हैं, और 2 ^ 25 संभव समाधान हैं। यदि आप यह साबित कर सकते हैं कि प्रत्येक समाधान एक अनोखी पहेली को हल करता है तो हर पहेली का समाधान होना चाहिए। इसी तरह, यदि आपको दो समाधान मिलते हैं जो एक ही पहेली को हल करते हैं तो हर पहेली का समाधान नहीं हो सकता है।

इसके अलावा, 2 ^ 25 33,554,432 है। यह काफी है, लेकिन यह एक असहनीय संख्या नहीं है। एक अच्छा एल्गोरिथ्म और एक सभ्य कंप्यूटर शायद कुछ ही घंटों में बल प्रदान कर सकता है, खासकर जब आप मानते हैं कि आधी पहेलियाँ दूसरे आधे के विपरीत हैं।


4
आधे से अधिक "व्युत्क्रम" हैं - क्षैतिज प्रतिबिंबों के अलावा, आपके पास ऊर्ध्वाधर प्रतिबिंब और घुमाव हैं।
क्लॉकवर्क-म्यूजियम

@ क्लॉकवर्क-म्यूज़ियम, हाँ, लेकिन इसके लिए एक सटीक संख्या की गणना करना कठिन है, क्योंकि जबकि असममित डिजाइनों को घुमाया जा सकता है और 8 क्रमपरिवर्तन में फ़्लिप किया जा सकता है, सममित डिज़ाइनों में कम क्रमपरिवर्तन होते हैं। इसलिए मैंने केवल सफेद / काले inverting का उल्लेख किया है, क्योंकि हर समाधान में ठीक 1 उलटा है। (हालांकि उस उलटा काम करने के लिए, आपको यह साबित करना होगा कि आप पूरे बोर्ड को फ्लिप कर सकते हैं)
आर्कनिस्ट लुपस

यह पता चला है, के रूप में रॉबर्ट Mastragostino ने अपने जवाब में उल्लेख किया है, यह वास्तव में एक प्रसिद्ध, अच्छी तरह से अध्ययन की गई समस्या है। प्रत्येक सॉल्व करने योग्य पहेली के ठीक 4 समाधान हैं, और अधिकांश रैंडम बोर्ड सॉल्व नहीं हैं। उस सभी स्थान को खोजना मज़ेदार हो सकता है, लेकिन चूँकि वहाँ पहले से ही एक प्रमाण मौजूद है ( math.ksu.edu/math551/math551a.f06/lights_out.pdf ) आप कुछ डॉट उत्पाद भी कर सकते हैं और कुछ में ही उत्तर दे सकते हैं। माइक्रोसेकंड। :)
ग्रैंडऑपनर

गणित का समय: यदि आप सभी समरूपताओं को ध्यान में रखते हुए, अलग-अलग बोर्डों की संख्या की गणना करना चाहते हैं , तो बर्नसाइड की लेम्मा जाने का तरीका है: 16 समरूपताएं हैं (एक तुच्छ, तीन घुमाव, चार प्रतिबिंब, और फिर उन 8 में से प्रत्येक को ऑन / ऑफ के व्युत्क्रम के साथ जोड़ा गया), और उन समरूपताओं में से प्रत्येक के लिए कुछ संख्या में बोर्ड पूरी तरह से अपरिवर्तित हैं। यदि आप प्रति समरूपता में पूरी तरह से अपरिवर्तित बोर्डों का औसत लेते हैं, तो यह अलग-अलग बोर्डों की संख्या के बराबर है।
आर्थर

1
@PeterTaylor परिणामों को चलाने के लिए निश्चित रूप से सिम्युलेटर को कोड करने में अधिक समय लगेगा।
corsiKa

4

सामान्यीकृत उत्तर:

  1. आकार (# चाल) x (# रोशनी) का एक मैट्रिक्स बनाएँ।
  2. एक पंक्ति में 1 को रखें यदि उस पंक्ति के अनुरूप चाल बनाते हुए उस स्तंभ के समान प्रकाश उत्पन्न होता है, तो अन्यथा।
  3. मैट्रिक्स पर गॉस-जॉर्डन उन्मूलन (मोडुलो 2) करें।
  4. यदि मैट्रिक्स के परिणामस्वरूप प्रत्येक कॉलम में एक एकल 1 होता है, और प्रत्येक पंक्ति में एक एकल 1 होता है, तो प्रत्येक ग्रिड सॉल्व करने योग्य होता है।

1

दूसरों ने पहले से ही यह पता लगाने के तरीकों का उल्लेख किया है कि क्या आपकी बेतरतीब ढंग से बनाई गई पहेली हल है। सवाल यह है कि आप भी पूछ रहे होंगे, क्या आप वास्तव में बेतरतीब ढंग से उत्पन्न पहेलियाँ चाहते हैं।

बेतरतीब ढंग से बनाई गई पहेलियों में सभी एक ही मूल दोष हैं: उनकी कठिनाई बहुत अप्रत्याशित है। आपके द्वारा प्राप्त की जाने वाली संभावित पहेलियाँ पहले से हल की गई, तुच्छ (समाधान स्पष्ट) से लेकर कठिन (समाधान स्पष्ट नहीं) तक असंभव (पहेली बिल्कुल भी हल करने योग्य नहीं है) तक हो सकती है। क्योंकि कठिनाई अप्रत्याशित है, यह खिलाड़ी के लिए एक असंतोषजनक अनुभव के लिए बनाता है, खासकर यदि वे एक पंक्ति में कई पहेलियाँ करते हैं। वे एक चिकनी कठिनाई वक्र प्राप्त करने की अत्यधिक संभावना नहीं रखते हैं, जो उन्हें पहेली के आधार पर ऊब या निराश कर सकता है।

यादृच्छिक पीढ़ी की एक और समस्या यह है कि पहेली को शुरू करने में लगने वाला समय अप्रत्याशित है। सामान्यतया, आप तुरंत एक सॉल्व करने योग्य पज़ल (लगभग) प्राप्त करने जा रहे हैं, लेकिन कुछ बुरी किस्मत के साथ, आपकी बेतरतीब ढंग से बनाई गई पहेलियाँ अनकची पज़ल्स की एक लकीर पर समाप्त हो सकती हैं।

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

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