PlayPendium
Contraption · চিন্তার খাবার

যে লেভেল নিজেই প্রমাণ করে যে তার সমাধান আছে

গেমটি কখনও হাতে কোনো ধাঁধা তৈরি করে না। এটি একটি মাত্র সংখ্যা থেকে ধাঁধাটি গড়ে তোলে, তারপর আপনি সেটি দেখার আগেই নিজের বিরুদ্ধে সেই ধাঁধাটি খেলে নিশ্চিত হয়ে নেয় যে এটি অতি সহজও নয়, অসম্ভবও নয়।

আজকের তারিখ 1 সংখ্যা, হ্যাশ করে বীজে পরিণত
হয়ে ওঠে
দৈনিক ধাঁধা 1 সবার জন্য হুবহু একই মাঠ

ইংরেজিতে লেখা ও সম্পাদিত। এই বাংলা সংস্করণটি যন্ত্রানুবাদের মাধ্যমে তৈরি; যেখানে নির্ভুলতা গুরুত্বপূর্ণ, সেখানে ইংরেজি মূলটিই প্রামাণ্য। ইংরেজিতে মূল লেখাটি পড়ুন →

01 · একটি সংখ্যা থেকে সবকিছু

একটি বীজে ভাঁজ করা গোটা একটি জগৎ

একটি Contraption লেভেল কোথাও সংরক্ষিত থাকে না। গোলটি কোথায় বসে আছে বা তাকগুলি কীভাবে সাজানো, তার তালিকা দেওয়া কোনো ফাইল নেই। বরং গোটা লেভেলটি, বলের শুরুর জায়গা, গোলের অবস্থান, স্থির দেয়ালগুলির সংখ্যা ও বিন্যাস, আপনার হাতে তুলে দেওয়া যন্ত্রাংশের ভাণ্ডার, সবই একটি মাত্র শুরুর সংখ্যা থেকে গণনা করে বের করা হয়, যাকে বলা হয় সিড, অর্থাৎ বীজ। জেনারেটরকে একই বীজ দিন, আপনি বাইটে বাইটে একই ধাঁধা পাবেন। 1

এটি সম্ভব, কারণ জেনারেটরের "এলোমেলোতার" একমাত্র উৎস হল একটি ছোট নির্ধারক (ডিটারমিনিস্টিক) ছদ্ম-এলোমেলো সংখ্যা জেনারেটর। Contraption যেটি ব্যবহার করে সেটি হল mulberry32, টমি এটিঙ্গারের লেখা একটি সংক্ষিপ্ত 32-বিট জেনারেটর; এর স্বাক্ষরসূচক ধ্রুবক 0x6d2b79f5 দেখে আপনি এটিকে চিনে নিতে পারেন, যা প্রতিবার সংখ্যা তোলার সময় স্টেটের সঙ্গে যোগ করা হয়। 2 এটি দ্রুত, কয়েক লাইনেই ধরে যায়, আর সবচেয়ে বড় কথা, এটি মোটেই এলোমেলো নয়: এটি একটি স্থির গাণিতিক ধারা, যা কেবল ওলটপালট দেখায়। এটিকে একটি শুরু দিন, এটি চিরকাল একই সংখ্যার স্রোত তৈরি করবে। জেনারেটর তারপর সেই স্রোত পড়ে ঠিক করে কোথায় কী বসাবে।

02 · দৈনিক ধাঁধা

একটি তারিখ কীভাবে একটি ভাগ করা চ্যালেঞ্জ হয়ে ওঠে

দৈনিক (Daily) মোড এই নির্ধারকতাকে কাজে লাগিয়ে একটি সামাজিক কাজ করে। এর বীজ এলোমেলো নয়, এটি ক্যালেন্ডার থেকে তৈরি করা হয়। গেমটি সর্বজনীন সময়ে (UTC) আজকের তারিখ নেয়, সেটিকে "contraption:2026-7-28"-এর মতো একটি ছোট স্ট্রিংয়ে লেখে, আর সেই লেখাটিকে একটি হ্যাশ ফাংশনের মধ্য দিয়ে চালিয়ে একটি মাত্র 32-বিট সংখ্যায় ঘনীভূত করে। 1

হ্যাশটি হল FNV-1a, একটি সুপরিচিত নন-ক্রিপ্টোগ্রাফিক মিক্সার: এটি একটি স্থির অফসেট থেকে শুরু করে, দশমিকে 2166136261, বা 0x811c9dc5, আর প্রতিটি অক্ষরের জন্য অক্ষরটিকে একটি এক্সক্লুসিভ-অর দিয়ে মিশিয়ে নেয়, তারপর FNV মৌলিক সংখ্যা 16777619 দিয়ে গুণ করে। 3 তাতে এমন একটি সংখ্যা পড়ে থাকে যা একটি নির্দিষ্ট দিনের জন্য স্থির, অথচ এক দিন থেকে পরের দিনে আকাশ-পাতাল আলাদা, ফলে তারিখে এক অক্ষরের বদল বীজটিকে পুরোপুরি ছড়িয়ে দেয়। ক্যালেন্ডার যেহেতু সবার জন্য এক, বীজও তাই এক, আর ধাঁধাও তাই এক। পৃথিবীর দুই প্রান্তের দুই অপরিচিত মানুষ দৈনিক মোড খুলে হুবহু একই মাঠের মুখোমুখি হন, আর ঠিক এই কারণেই স্কোর তুলনা করার একটা অর্থ থাকে।

দৈনিক চ্যালেঞ্জটি ন্যায্য, কোনো সার্ভার সবাইকে একই লেভেল পাঠায় বলে নয়, বরং প্রত্যেকের কপি একই তারিখ থেকে স্বাধীনভাবে একই লেভেল আবার গণনা করে বের করে বলে।

03 · জেনারেটর নিজেকেই সন্দেহ করে

যে ধাঁধা নিজে নিজেই সমাধান হয়ে যায়, তাকে বাতিল করা

এলোমেলো জ্যামিতি সহজ; ভালো এলোমেলো জ্যামিতি সহজ নয়। যে জেনারেটর কেবল একটি গোল আর কয়েকটি তাক ছড়িয়ে দেয়, সে কখনও কখনও এমন লেভেল তৈরি করবে যেখানে উপর থেকে ছেড়ে দেওয়া বল নিজে থেকেই সোজা গোলে গিয়ে পড়ে। সেটি ধাঁধা নয়, সেটি একটি কাটসিন। তাই কোনো প্রার্থী জগৎকে মেনে নেওয়ার আগে Contraption একটি নিঃশব্দ পরীক্ষা চালায়, কোডে যার নাম preSolved: এটি একটিও যন্ত্রাংশ না বসিয়ে লেভেলটি সিমুলেট করে আর দেখে, খালি বলটি শুধু মাধ্যাকর্ষণেই গোলে পৌঁছে যায় কি না। যদি পৌঁছে যায়, লেভেলটি ফেলে দেওয়া হয় আর জেনারেটর আবার নতুন করে চেষ্টা করে। 1

ফিজিক্স ইঞ্জিন নিয়ে আপনি সাধারণত যেভাবে ভাবেন, এটি তার একটি সূক্ষ্ম উল্টোপথ। যে simulate() ফাংশনটি আপনার মেশিন চালিয়ে দেখায়, সেটিকেই তৈরির সময়ে ভিতরের দিকে ঘুরিয়ে লেভেলের নিজের কাঠিন্য যাচাই করতে লাগানো হয়। ইঞ্জিনটি একই সঙ্গে আপনার সমাধানের রেফারি এবং ধাঁধার মান-পরিদর্শক।

04 · ভিতরে গাঁথা এক ক্ষুদ্র সলভার

"একটি যন্ত্রাংশ দিয়ে কি এটি করা যায়?"

অতি-সহজ লেভেল বাতিল করা কাজের অর্ধেক মাত্র। অন্য বিপদটি হল অসম্ভব লেভেল, এমন জায়গায় গুঁজে রাখা একটি গোল, যেখানে যন্ত্রাংশের কোনো বিন্যাসই পৌঁছাতে পারে না। Contraption এর বিরুদ্ধে সুরক্ষা দেয় plausiblySolvable নামের একটি ছোট ব্রুট-ফোর্স (সব সম্ভাবনা ধরে ধরে যাচাই করা) সলভার দিয়ে। এটি চতুরভাবে ভাবে না। এটি কেবল চেষ্টা করে দেখে। 1

নির্দিষ্টভাবে বললে, এটি মাঠের উপর অবস্থানের একটি গ্রিড ধরে একটি মাত্র র‌্যাম্প ঝাড়ু দেওয়ার মতো করে সরিয়ে নিয়ে যায়, আর প্রতিটি জায়গায় সেটিকে চারটি আলাদা ভঙ্গিতে হেলিয়ে চেষ্টা করে। ওই প্রতিটি পরীক্ষামূলক স্থাপনার জন্য এটি পুরো সিমুলেশন চালায় আর প্রশ্ন করে: ওই একটি র‌্যাম্প কি বলটিকে ঘরে পৌঁছে দিল? যে মুহূর্তে কোনো একটি স্থাপনা সফল হয়, লেভেলটিকে সমাধানযোগ্য ঘোষণা করে আপনার কাছে পাঠিয়ে দেওয়া হয়। পুরো ঝাড়ু দেওয়ার পরেও যদি কোনোটিই কাজ না করে, জেনারেটর লেভেলটি বাতিল করে একটি নতুন বীজ নিয়ে চেষ্টা করাই পছন্দ করে।

এক-যন্ত্রাংশ সলভারের অনুসন্ধান: মোটা দাগের একটি গ্রিড, প্রতিটিতে চারটি হেলান
ঝাড়ু-প্যারামিটারপরিসরঅর্থ
র‌্যাম্প X15 → 85, ধাপ 14মাঠ জুড়ে কলাম
র‌্যাম্প Y30 → 120, ধাপ 18মাঠ বরাবর নিচের দিকে সারি
চেষ্টা করা কোণ4±0.45 এবং ±0.8 রেডিয়ান
প্রতি স্থাপনায় পরীক্ষা1টি পূর্ণ সিমুলেশনবল কি গোলে পৌঁছায়?

এটি ঠিক কী প্রমাণ করে, সে বিষয়ে সৎ থাকা জরুরি, কারণ কোডটিও এ ব্যাপারে সৎ: মন্তব্যে এটিকে বলা হয়েছে "সস্তা সম্ভাব্যতা যাচাই … সর্বাঙ্গীণ নয়।" যে লেভেল পাশ করে, তার অন্তত একটি স্থূল এক-র‌্যাম্প সমাধান নিশ্চিতভাবেই আছে। যে লেভেল ফেল করে, সেটি হয়তো একটি ফ্যান, একটি গিয়ার, বা গ্রিড যা কখনও চেষ্টা করেনি এমন কোনো চতুরতর র‌্যাম্প দিয়ে তবু সমাধান করা যেত, তাই জেনারেটর ব্যর্থতাকে অসম্ভবতার প্রমাণ হিসেবে ধরে না। এটি প্রথম যে অ-তুচ্ছ জগৎটি পেয়েছিল সেটিকে ফলব্যাক (বিকল্প) হিসেবে রেখে দেয়, আর চল্লিশটি চেষ্টা পেরিয়ে গেলেও যদি পরিষ্কার এক-যন্ত্রাংশ সমাধান না মেলে, অনন্তকাল ঘুরপাক না খেয়ে সেই ফলব্যাকটিই পাঠিয়ে দেয়। ফলাফল একটি বাস্তববাদী নিশ্চয়তা: কখনও বিনামূল্যের জয় নয়, প্রায় সবসময়ই ভিতরে ঢোকার একটি সত্যিকারের পথ, আর "নিখুঁত" লেভেলের জন্য কখনও অন্তহীন অপেক্ষা নয়। 1

05 · গভীর ভাবনাটি

জেনারেট-অ্যান্ড-টেস্ট, বুদ্ধিমত্তার সবচেয়ে বিনয়ী রূপ

একটু পিছিয়ে দাঁড়িয়ে দেখলে, Contraption-এর লেভেল নির্মাতা একটি অতি পুরোনো ও অতি সাধারণ সমস্যা-সমাধান ধাঁচের পরিচ্ছন্ন উদাহরণ: জেনারেট অ্যান্ড টেস্ট, অর্থাৎ তৈরি করো আর যাচাই করো। এলোমেলোভাবে একটি প্রার্থী প্রস্তাব করুন; আপনার শর্তগুলির সঙ্গে সেটি মিলিয়ে দেখুন; পাশ করলে রাখুন, ফেল করলে বাতিল করে আবার প্রস্তাব করুন। অগণিত গেমের প্রসিডিউরাল কনটেন্টের পিছনে, বিবর্তনমূলক গণনার অনেকটার পিছনে, আর একটু চোখ কুঁচকে দেখলে স্বয়ং প্রাকৃতিক নির্বাচনের পিছনেও এই লুপটিই আছে: মিউটেশন প্রস্তাব করে, পরিবেশ যাচাই করে, যারা টিকে যায় তারা থেকে যায়। 4

Contraption-এর সংস্করণটিকে যা সুন্দর করে তোলে তা হল, এখানে পরীক্ষাটি খেলার উপযোগিতার কোনো সস্তা প্রতিনিধি নয়, এটিই হল খেলার উপযোগিতা। জেনারেটর তাক গুনে বা দূরত্ব মেপে অনুমান করে না একটি লেভেল ন্যায্য কি না। এটি আক্ষরিক অর্থেই লেভেলটি খেলে, দুবার: একবার খালি অবস্থায়, যাতে নিশ্চিত হওয়া যায় এটি মুফতে পাওয়া কিছু নয়, আর একবার একটি অনুসন্ধানী র‌্যাম্প দিয়ে, যাতে নিশ্চিত হওয়া যায় একটি পথ আছে। যে নির্ধারক পদার্থবিদ্যা আপনার সমাধানের বিচার করবে, সেই পদার্থবিদ্যাই ধাঁধাটিকে যাচাই করেছে। আলাদা কোনো "লেভেল ভ্যালিডেটর" নেই যা আসল নিয়ম থেকে সরে যেতে পারে, কারণ নিয়মের সেট একটিই, আর সেটিই সবকিছুর জন্য ব্যবহৃত হয়।

আর যেহেতু সবটাই নির্ধারক, এই যাচাই দুই দিক থেকেই ভাগ্যমুক্ত। দৈনিক বীজ ষড়যন্ত্র করে এক খেলোয়াড়কে অন্যের চেয়ে সহজ মাঠ তুলে দিতে পারে না, আর কাউকে অন্যায্য মাঠও দিতে পারে না, কারণ লেভেলটি একটি চ্যালেঞ্জ হয়ে ওঠার আগেই ইতিমধ্যে খেলা হয়ে টিকে গেছে, গেমটির দ্বারা, নিজেরই বিরুদ্ধে।

Sources & notes
  1. Seed-to-level generation, the preSolved rejection test, the plausiblySolvable one-ramp solver (grid ranges, four angles, up to 40 attempts, fallback world), and the daily-seed date string are all read directly from Contraption's own game engine and random-number code. Grounded in the game's code, not invented.
  2. mulberry32 is a compact 32-bit pseudo-random generator by Tommy Ettinger; it advances its state with the constant 0x6d2b79f5 and has a period of 2³². Author's reference gist (with his own later caveats on its equidistribution). gist.github.com/tommyettinger/46a874533244883189143505d203312c
  3. "Fowler–Noll–Vo hash function." Wikipedia, the 32-bit FNV offset basis is 2166136261 (0x811c9dc5) and the FNV prime is 16777619 (0x01000193); FNV-1a XORs each byte into the hash first and then multiplies by the prime. en.wikipedia.org/wiki/Fowler–Noll–Vo_hash_function
  4. On generate-and-test / "generation followed by evaluation" as a general search and problem-solving strategy, and its kinship with procedural generation and evolutionary methods. See "Procedural generation," Wikipedia. en.wikipedia.org/wiki/Procedural_generation
  5. Further reading on Procedural generation, [2410.15644] Procedural Content Generation in Games: A Survey with Insights on Emerging LLM Integration. arxiv.org.
  6. Further reading on Procedural generation, Procedural Content Generation in Games: A Survey with Insights on Emerging LLM Integration. doi.org.
  7. Further reading on Procedural generation, "Procedural City Generation with Combined Architectures for Real-time V" by Gr. open.clemson.edu.
Was this worth reading?
← Back to Contraption
PlayPendium · About · Contact · Privacy · Terms · Cookies · Accessibility · Copyright · Browse all games · Inspirations · © 2026