Hindi kailanman nagsusulat ang laro ng palaisipan nang mano-mano. Pinatutubo nito ang isa mula sa iisang numero, at pagkatapos ay nilalaro nito ang palaisipang iyon laban sa sarili nito upang matiyak na hindi ito napakadali at hindi rin imposible bago mo pa man ito makita.
Isinulat at in-edit sa Ingles. Ang bersyong Filipino na ito ay ginawa sa pamamagitan ng machine translation; kung saan mahalaga ang katumpakan, ang orihinal na Ingles ang awtoritatibo. Basahin ang orihinal sa Ingles →
Ang isang antas ng Contraption ay hindi nakaimbak kahit saan. Walang file na naglilista kung nasaan ang goal o kung paano nakaayos ang mga ledge. Sa halip, ang buong antas, ang simula ng bola, ang posisyon ng goal, ang bilang at pagkakalagay ng mga nakapirming pader, ang imbentaryo ng mga bahaging ibinibigay sa iyo, ay kinukuwenta mula sa iisang panimulang numero na tinatawag na seed. Ibigay sa generator ang parehong seed at makukuha mo, byte kada byte, ang parehong palaisipan. 1
Posible iyon dahil ang tanging pinagmumulan ng "randomness" ng generator ay isang maliit at deterministikong pseudo-random number generator. Ang ginagamit ng Contraption ay ang mulberry32, isang compact na 32-bit generator na isinulat ni Tommy Ettinger, makikilala mo ito sa natatanging constant nito, 0x6d2b79f5, na idinaragdag sa state sa bawat pagkuha. 2 Mabilis ito, kasya ito sa ilang linya, at, higit sa lahat, hindi ito random sa anumang paraan: ito ay isang nakapirming matematikal na pagkakasunod-sunod na mukhang binalasa lamang. Bigyan mo ito ng panimula at magbubunga ito ng parehong daloy ng mga numero magpakailanman. Binabasa naman ng generator ang daloy na iyon upang magpasya kung saan ilalagay ang lahat.
Umaasa ang Daily mode (Araw-araw) sa determinismong ito upang gumawa ng isang bagay na panlipunan. Hindi random ang seed nito, ginagawa ito mula sa kalendaryo. Kinukuha ng laro ang petsa ngayong araw sa universal time, isinusulat ito sa isang maikling string tulad ng "contraption:2026-7-28", at pinadadaan ang tekstong iyon sa isang hash function upang paliitin ito sa iisang 32-bit na numero. 1
Ang hash ay FNV-1a, isang kilalang non-cryptographic na mixer: nagsisimula ito mula sa isang nakapirming offset, ang decimal na 2166136261, o 0x811c9dc5, at para sa bawat character ay isinasama nito ang titik sa pamamagitan ng exclusive-or at pagkatapos ay minumultiplika sa FNV prime na 16777619. 3 Nag-iiwan iyon ng numerong matatag para sa isang partikular na araw at lubhang naiiba mula sa isang araw patungo sa susunod, kaya ang pagbabago ng isang character sa petsa ay lubusang nagkakalat sa seed. Dahil pareho ang kalendaryo para sa lahat, pareho rin ang seed, at pareho rin ang palaisipan. Dalawang estrangherong nasa magkabilang panig ng mundo ang nagbubukas ng Daily at nakakaharap ng magkaparehong field, na siya mismong nagbibigay-saysay sa paghahambing ng score.
Patas ang pang-araw-araw na hamon hindi dahil may server na nagpapadala sa lahat ng parehong antas, kundi dahil ang kopya ng bawat isa ay nagkukuwentang muli nang nagsasarili ng parehong antas mula sa parehong petsa.
Madali ang random na geometry; ang magandang random na geometry ay hindi. Ang isang generator na basta na lamang nagkakalat ng goal at ilang ledge ay paminsan-minsang magbubunga ng antas kung saan ang bola, kapag inihulog mula sa itaas, ay basta na lamang diretsong bumabagsak sa goal nang kusa. Hindi iyon palaisipan, cutscene iyon. Kaya bago tanggapin ng Contraption ang isang kandidatong mundo, nagpapatakbo ito ng isang tahimik na pagsubok na tinatawag ng code na preSolved: sini-simulate nito ang antas nang walang anumang bahaging nakalagay at sinusuri kung naaabot ng hubad na bola ang goal sa pamamagitan lamang ng gravity. Kung naaabot, itinatapon ang antas at muling bumubunot ang generator. 1
Ito ay isang pinong pagbabaligtad ng karaniwang pag-iisip mo tungkol sa isang physics engine. Ang parehong simulate() function na nagpapatakbo ng iyong machine ay ibinabaling paloob, sa oras ng generation, upang suriin ang kahirapan ng antas mismo. Ang engine ay kapwa referee ng iyong solusyon at inspektor ng kalidad ng palaisipan.
Ang pagtanggi sa masyadong madaling antas ay kalahati lamang ng trabaho. Ang isa pang panganib ay ang imposibleng antas, isang goal na nakatago sa isang lugar na hindi maaabot ng anumang pagkakaayos ng mga bahagi. Nagbabantay ang Contraption laban dito gamit ang isang maliit na brute-force solver na pinangalanang plausiblySolvable. Hindi ito nag-iisip nang matalino. Sinusubukan lang nito. 1
Partikular, pinapadaan nito ang iisang ramp sa isang grid ng mga posisyon sa buong field at, sa bawat puwesto, sinusubukan ito nang nakatagilid sa apat na magkakaibang paraan. Para sa bawat isa sa mga pagsubok na paglalagay na iyon ay pinapatakbo nito ang buong simulation at nagtatanong: nadala ba ng iisang ramp na iyon ang bola pauwi? Sa sandaling magtagumpay ang anumang paglalagay, idinedeklara ang antas na malulutas at ipinapadala sa iyo. Kung wala sa mga ito ang gumana pagkatapos ng buong pag-sweep, mas pinipili ng generator na itapon ang antas at sumubok ng bagong seed.
| Parameter ng sweep | Saklaw | Kahulugan |
|---|---|---|
| Ramp X | 15 → 85, hakbang 14 | mga kolum sa buong field |
| Ramp Y | 30 → 120, hakbang 18 | mga hilera pababa sa field |
| Mga anggulong sinubukan | 4 | ±0.45 at ±0.8 radians |
| Pagsubok kada paglalagay | 1 buong sim | naaabot ba ng bola ang goal? |
Sulit na maging tapat tungkol sa kung ano ang pinatutunayan nito, dahil tapat din ang code tungkol dito: tinatawag ito ng comment na isang "murang pagsusuri ng plausibility … hindi lubusan." Ang antas na pumasa ay tiyak na may kahit isang magaspang na solusyong iisang ramp. Ang antas na bumagsak ay maaari pa ring malutas gamit ang fan, gear, o mas matalinong ramp na hindi kailanman sinubukan ng grid, kaya hindi itinuturing ng generator ang pagkabigo bilang patunay ng pagiging imposible. Iniingatan nito ang unang hindi-trivial na mundong natagpuan nito bilang fallback, at kung lumipas ang apatnapung pagtatangka nang walang malinis na solusyong iisang bahagi, ipinapadala nito ang fallback na iyon sa halip na umikot magpakailanman. Ang resulta ay isang praktikal na garantiya: hindi kailanman libreng panalo, halos palaging may tunay na daan papasok, at hindi kailanman walang katapusang paghihintay para sa "perpektong" antas. 1
Umatras ka nang kaunti at ang tagagawa ng antas ng Contraption ay isang malinis na halimbawa ng isang napakaluma at napakalawak na pattern sa paglutas ng problema: generate and test. Magmungkahi ng kandidato nang random; suriin ito laban sa iyong mga kinakailangan; panatilihin ito kung pumasa, itapon at magmungkahing muli kung bumagsak. Ito ang loop sa likod ng procedural content sa hindi mabilang na laro, sa likod ng malaking bahagi ng evolutionary computation, at, kung titingnang mabuti, sa likod ng natural selection mismo: nagmumungkahi ang mutation, sumusubok ang kapaligiran, nananatili ang mga nakaligtas. 4
Ang nagpapaganda sa bersyon ng Contraption ay hindi murang pamalit sa playability ang pagsubok, ito ay ang playability mismo. Hindi tinatantiya ng generator kung patas ang isang antas sa pamamagitan ng pagbibilang ng mga ledge o pagsukat ng mga distansya. Literal nitong nilalaro ang antas, nang dalawang beses: isang beses nang walang laman upang matiyak na hindi ito regalo, at isang beses na may pansubok na ramp upang matiyak na may umiiral na daan. Ang parehong deterministikong physics na huhusga sa iyong solusyon ang physics na sumuri sa palaisipan. Walang hiwalay na "level validator" na maaaring lumihis mula sa tunay na mga patakaran, dahil iisa lamang ang set ng mga patakaran, na ginagamit para sa lahat.
At dahil deterministiko ang lahat ng ito, malaya sa suwerte ang pagsusuri sa magkabilang direksyon. Hindi makapagsasabwatan ang daily seed upang bigyan ang isang manlalaro ng mas madaling field kaysa sa iba, at hindi rin nito mabibigyan ang sinuman ng hindi patas na field, dahil bago pa maging hamon ang antas ay nakaligtas na ito sa pagkakalaro, ng laro, laban sa sarili nito.