REV0 C ++ (विंडोज पर विजुअल स्टूडियो) 405
#include"stdafx.h"
#include<stdlib.h>
#include<time.h>
int main(){srand(time(NULL));char i,h=rand()%19,w=rand()%19,p=19,d=0,q,e,m[]="e@LwQMQOSOLT";while(p-h&&p-w){for(i=3;i--;){q=(p+m[p%4*3+i])%20;if(q==w)puts("you smell a wumpus");if(q==h)puts("you feel a breeze");}scanf_s("%d",&i);e=(d+i/10)*m[p%4]%3;q=(p+m[p%4*3+e])%20;if(i%5){if(q==w){puts("YOU KILLED THE WUMPUS!");h=p;}else{puts("arrow missed");w=(w+m[w%4*3+rand()%3])%20;}}else{p=q;d=e;if(p==h)puts("YOU FELL IN A HOLE!");}if(p==w)puts("THE WUMPUS GOT YOU!");}}
नीचे एक प्लेथ्रू है, यह दिखाते हुए (बशर्ते कि आप एक खतरे के ठीक बगल में शुरू न करें) सही खेल के साथ आप हमेशा जीत सकते हैं। खिलाड़ी एक हवा महसूस करता है, वापस मुड़ता है और एक पूरा वामावर्त लूप करता है। जैसा कि वह उसे फिर से एक हवा महसूस करने के लिए 5 चालें लेता है, वह छेद को अपने दाईं ओर जानता है, और जितना संभव हो उतना दूर हो जाता है। इसी तरह, जब वह वैंपस को सूंघता है, तो यह नहीं जानते कि यह सही है या बाएं, वह वापस मुड़ता है और एक दक्षिणावर्त लूप करता है। उसे 5 कदम लगते हैं, फिर से वोम्प्स को सूंघने के लिए, इसलिए वह जानता है कि यह बाईं ओर है और निश्चितता के साथ शूट करता है।
अगर वह दूसरे तरीके से लूप कर लेता तो उसे जल्दी ही वह वपस मिल जाता और यह पता चल जाता कि वह उसी दिशा में है।
REV1 C (Cygwin पर GCC), 431-35% बोनस = 280.15
#define u(t,s,c) if(t){puts(s);c;}
i,d,e,a,b;main(){srand(time(0));char q,p=19,h=rand()%p,w=rand()%p,*m="e@LwQMQOSOLT-\\/\n \v ";
while(p-h&&p-w){
for(i=3;i--;){q=(p+m[p%4*3+i])%20;u(q==w,"you smell a wumpus",a|=2<<p)u(q==h,"you feel a breeze",b|=1<<p)}
for(i=20;i--;)printf("%c%c",i==p?m[d+12]:48+(a>>i&2)+(b>>i&1),m[i%4+15]);
scanf("%d",&i);e=(d+i/10)*m[p%4]%3;q=(p+m[p%4*3+e])%20;
if(i%5){u(q-w,"arrow missed",w=(w+m[w%4*3+rand()%3])%20;a=0)else u(1,"YOU KILLED THE WUMPUS!",h=p)}
else{p=q;d=e;u(p==h,"YOU FELL IN A HOLE!",)}
u(p==w,"THE WUMPUS GOT YOU!",)}}
स्पष्टता के लिए Newlines जोड़ा गया। Rev 0 से परिवर्तन निम्नानुसार हैं:
विंडोज के लिए सिग्विन लिनक्स एमुलेटर पर जीसीसी संकलक की सिफारिश करने के लिए @ डेनिस के लिए एक बड़ा थैंक्यू। इस कंपाइलर include
को रेव 0 प्रोग्राम में एस की आवश्यकता नहीं होती है , और यह int
चर के लिए डिफ़ॉल्ट प्रकार की अनुमति देता है और main.
यह एक जीवन-परिवर्तित गोल्फिंग टिप है!
इसके अतिरिक्त लिनक्स में चलने का मतलब है कि \f
गाड़ी का रिटर्न किए बिना कर्सर नीचे चला जाए (विंडोज में इसके विपरीत जहां यह सिर्फ एक प्रिंट करने योग्य प्रतीक का उत्पादन करता है।) इसने बोर्ड को प्रिंट करने वाले प्रिंटफ स्टेटमेंट को काफी छोटा कर दिया है।
टिप्पणियों में डेनिस से कई अतिरिक्त युक्तियां, और मेरे अपने में से एक: स्थिति की परिवर्तन जब जाँच कर रही है कि क्या तीर ने वम्पस को मारा: if(q==w)
> if(q-w)
(..) .. उल्टा है)
जानकारी प्रदर्शित करने वाले ग्राफिक प्रदर्शन को जोड़ने से खिलाड़ी को पता चल जाता है कि 35% बोनस का दावा करने के लिए एक वैंपस को कहां से पिघलाया जाता है। (मैंने इस के पुराने डिबग संस्करण को हटा दिया, जिसमें वम्पस और छेद की सटीक स्थिति दिखाई दी। इसे संपादित इतिहास में देखा जा सकता है।)
REV2 C (सिगविन पर GCC), 389-35% बोनस = 252.85
#define Q(N) (N+"QTLOQMQOSOLT"[N%4*3+e])%20
#define P printf(
i,d,e,a,b;main(){int p=19,q=srand(&p),h=rand()%p,w=rand()%p;
while(p-h&&p-w){
for(e=3;e--;){q=Q(p);q-w||P"You smell a wumpus\n",a|=2<<p);q-h||P"You feel a breeze\n",b|=1<<p);}
for(i=20;i--;)P"%c%c",i-p?48+(a>>i&2)+(b>>i&1):"-\\/"[d],"\n \v "[i%4]);
scanf("%d",&i);e=(d+i/9)*"edde"[p%4]%3;q=Q(p);
if(i%5){e=rand()%3;w=q-w?P"Your arrow didn't hit anything\n",a=0)&Q(w):(p=20);}
else p=q,d=e;
}
P p-20?p-w?"YOU FELL IN A HOLE!\n":"THE WUMPUS GOT YOU!\n":"YOU KILLED THE WUMPUS!\n");}
मेरा कोड फिर से दर्शाने के लिए डेनिस के लिए फिर से धन्यवाद:
चार स्थिरांक m[]
को शाब्दिक के साथ प्रतिस्थापित किया गया (मुझे नहीं पता था कि आप शाब्दिक रूप से अनुक्रमित कर सकते हैं।)
स्टैक चर के साथ यादृच्छिक संख्याओं का सीडिंग (सिस्टम आश्रित, कुछ सिस्टम एक सुरक्षा उपाय के रूप में मेमोरी आवंटन को यादृच्छिक करते हैं।)
मैक्रो को puts
मैक्रो के साथ printf
और अतिरिक्त कोड से बदल दिया जाता है, जिसे तब निष्पादित किया जाना चाहिए जब संदेश को printf
तर्कों के अंदर प्रदर्शित किया जाता है (लाभ चेहरे से लिया गया है जो प्रिंट स्ट्रिंग में पिछले कुछ तर्कों को प्रिंट नहीं करता है यदि प्रारूप स्ट्रिंग में पर्याप्त प्रारूप सट्टेबाज नहीं हैं।) if
द्वारा प्रतिस्थापित||
नए मैक्रो के अंदर रखे गए प्लेयर / वंपस की नई स्थिति की गणना।
while
लूप के बाहर रखे संदेशों को जीतना / खोना । if
सशर्त ऑपरेटर द्वारा प्रतिस्थापित किया गया।
शूटिंग तीर के लिए लाइन में सशर्त ऑपरेटर का उपयोग। यदि खिलाड़ी चूक जाता है, तो इसके लिए संदेश को प्रिंट करना और वैंपस स्थिति को समायोजित करना दोनों आवश्यक है। डेनिस ने संयोजन के कुछ तरीके printf
और एक ही अभिव्यक्ति में वम्पस स्थिति की गणना की पेशकश की, लेकिन मैं अपने स्वयं के एक के साथ चला गया हूं। printf
मुद्रित वर्णों की संख्या लौटाता है, जो Your arrow didn't hit anything\n
कि 31 (11111 बाइनरी) है 31&Q(w)==Q(w)
।
इस संपादन में मेरा अन्य योगदान कुछ अनावश्यक कोष्ठकों का उन्मूलन है।
उत्पादन
यहां खिलाड़ी पहले ही पता लगा चुका है कि वम्पस कहां है, लेकिन यह पता लगाने के लिए पूरी तरह से पता लगाने का विकल्प चुनता है कि गड्ढे कहां हैं। मेरे पुराने डिबग संस्करण के विपरीत, जिसमें दिखाया गया था कि पूरे खेल में जहां वम्पस और गड्ढे थे, यह केवल उन कमरों को दिखाता है जहां खिलाड़ी ने दौरा किया है और एक हवा महसूस की है (1) वम्पस (2) या दोनों (3) को गलाना। (यदि खिलाड़ी एक तीर मारता है और छूट जाता है, a
तो वैम्पस स्थिति की जानकारी वाला चर रीसेट हो जाता है।)
ICOSAHEDRON रिप्रेजेंटेशन
नोट: यह खंड Rev 1 पर आधारित है
मेरा स्टार फीचर! मेरे कोड में कोई ग्राफ़ नहीं है। यह कैसे काम करता है, यह समझाने के लिए, दुनिया का नक्शा नीचे देखें। Icosahedron के किसी भी बिंदु को अक्षांश 0-3 और देशांतर 0-4 (या एकल संख्या long*4+lat
।) द्वारा दर्शाया जा सकता है , मानचित्र पर अंकित देशांतर रेखा देशांतर शून्य वाले उन चेहरों से होकर गुजरती है, और अक्षांश रेखा गुजरती है। अक्षांश शून्य के साथ चेहरों का केंद्र।
खिलाड़ी को 3 संभावित अक्षों पर उन्मुख किया जा सकता है, जो कि प्रतीकों द्वारा दर्शाए गए हैं: उत्तर-दक्षिण -
पूर्व-दक्षिण-पश्चिम \
वायव्य-दक्षिण-पूर्व /
। किसी भी दिए गए कमरे में उसके पास उपलब्ध प्रत्येक कुल्हाड़ी पर उसके पास एक निकास है। प्रदर्शित डिस्प्ले में खिलाड़ी पूरी तरह से दक्षिणावर्त लूप बनाता है। आम तौर पर यह चिन्हित करना आसान होता है कि खिलाड़ी कहाँ से आया है, और इसलिए जहाँ उसे जाने की अनुमति है।
एक मामला जो बिना आंख के थोड़ा मुश्किल है, वह चौथा है। जब आप इन ध्रुवीय पंक्तियों में से एक में तिरछा देखते हैं, तो खिलाड़ी तिरछे छोर के निकटतम छोर से ध्रुवीय सेल से आया है और भूमध्य रेखा की ओर आम तौर पर सामना कर रहा है। इस प्रकार खिलाड़ी दक्षिण-पूर्व का सामना कर रहा है और उसके विकल्प हैं: 15 (SOUTH, दाईं ओर की सेल) 25 (नॉर्थएस्ट, ऊपर की सेल) या 35 (नॉर्थवेस्ट, नीचे की सेल)।
इसलिए, मूल रूप से मैं icosahedron को 5x4 ग्रिड में मैप करता हूं, जिसमें वे मुद्रित किए गए क्रम में 19 से 0 की संख्या वाले सेल होते हैं। नीचे दी गई तालिका के अनुसार खिलाड़ी की अक्षांश और दिशा के आधार पर, चालन को वर्तमान स्थिति से जोड़कर या घटाकर किया जाता है।
यदि खिलाड़ी बोर्ड के नीचे (पश्चिम) से बाहर चला जाता है, तो वह शीर्ष (पूर्व) की तरफ वापस आ जाता है और इसके विपरीत, इसलिए उसकी स्थिति को मोडुलो 20 लिया जाता है। आम तौर पर चालों को कोडित किया जाता है []] एससीआई 80 जोड़कर ( P
) नीचे दिखाए गए पात्रों को देने वाले कच्चे मूल्य के लिए, लेकिन सिद्धांत 20 के किसी भी एकाधिक को ऑपरेशन को प्रभावित किए बिना जोड़ा जा सकता है।
Table of addition values for moves
Direction Symbol Latitude 0 1 2 3 Latitude 0 1 2 3
0, N-S - 1 -1 1 -1 Q O Q O
1, NE-SW \ -4 1 -1 4 L Q O T
2, NW-SE / 4 -3 3 -4 T M S L
खिलाड़ी का इनपुट (दूसरे अंक को हटाने के लिए 10 से विभाजित) उसकी वर्तमान दिशा में जोड़ा जाता है और अपनी नई दिशा प्राप्त करने के लिए modulo 3 लिया जाता है। यह अधिकांश मामलों में ठीक काम करता है। हालांकि एक मुद्दा है जब वह एक ध्रुवीय कमरे में है और ध्रुव की ओर बढ़ता है। नीचे दिए गए नक्शे को मोड़ते समय यह स्पष्ट होगा कि यदि वह "उत्तर-पूर्व" का सामना करने वाले कमरे को छोड़ देता है, तो वह "दक्षिण-पूर्व" का सामना करते हुए नए वर्ग में प्रवेश करेगा, इसलिए एक सुधार किया जाना चाहिए। यह e=(d+i/10)*m[p%4]%3;
गुणा द्वारा लाइन में किया जाता है m[p%4]
। M [] के पहले चार मान ऐसे चुने गए हैं, जो ऊपर दिए गए उनके कार्य के अलावा, उनकी विशेषता m[1]%3==m[2]%3==1
और भी हैं m[0]%3==m[3]%3==2
। यह भूमध्यरेखीय कमरों के लिए दिशा को अकेला छोड़ देता है और ध्रुवीय कमरों के लिए आवश्यक सुधार लागू करता है।
सुधार करने का तार्किक समय इस कदम के बाद होगा। हालांकि पात्रों को बचाने के लिए यह कदम से पहले किया जाता है। इसलिए एम [] में कुछ मूल्यों को स्थानांतरित किया जाना चाहिए। इसलिए पिछले 2 अक्षर उदाहरण के लिए ऊपर दी गई तालिका LT
के TL
अनुसार हैं।
अनजाने कोड
यह Rev 1 कोड है, जो Rev 2 की तुलना में कम बाधित है।
यह जीसीसी / लिनक्स पर चलेगा। मैंने टिप्पणी में शामिल किया है कि विजुअल स्टूडियो / विंडोज पर इसे चलाने के लिए आवश्यक अतिरिक्त कोड। यह एक बड़ा अंतर है!
//Runs on gcc/linux. For visual studio / windows, change printf(...)
//to printf(" %c%c%c",9*(i%4==1),i==p?m[d+12]:48+(a>>i&2)+(b>>i&1),10*!(i%2)) and uncomment the following lines
//#include"stdafx.h"
//#include<stdlib.h>
//#include<time.h>
//#pragma warning(once:996;once:430) //allow the use of scanf instead of scanf_s, allow default type=int.
//Though rather than using the pragma, it is shorter to follow compiler recommendation and use scanf_s and int.
#define u(t,s,c) if(t){puts(s);c;} //if(test){puts(string);additional code;}
i, //player input, loop counter
d,e, //current and proposed direction
a,b; //bit flags for where wumpus smelt / breeze felt
main(){
srand(time(0));
char q,p=19,h=rand()%p,w=rand()%p, //Initialise player, hole and wumpus. q stores proposed player position.
*m="e@LwQMQOSOLT-\\/\n \f "; //Chars 0-11: movetable. Chars 12-14:symbol for player. Chars 15-18: graphics format.
while(p-h&&p-w){
// Print warnings
for(i=3;i--;){q=(p+m[p%4*3+i])%20;u(q==w,"you smell a wumpus",a|=2<<p)u(q==h,"you feel a breeze",b|=1<<p)}
// graphic display
for(i=20;i--;)printf("%c%c",i==p?m[d+12]:48+(a>>i&2)+(b>>i&1),m[i%4+15]);
// Get player input and work out direction and room
scanf("%d",&i);
e=(d+i/10)*m[p%4]%3;
q=(p+m[p%4*3+e])%20;
// i%5 is false if player inputs 5 (move player) otherwise true (shoot arrow)
if(i%5)
{u(q-w,"arrow missed",w=(w+m[w%4*3+rand()%3])%20;a=0)else u(1,"YOU KILLED THE WUMPUS!",h=p)}
else{p=q;d=e;u(p==h,"YOU FELL IN A HOLE!",)}
u(p==w,"THE WUMPUS GOT YOU!",)
}
}
ISSUES और CURIOISITIES
मैंने @professorfish द्वारा बताए गए बिंदु का लाभ उठाया है, अगर रैंडम स्थानों में वम्पस और गड्ढे शुरू होते हैं, तो खिलाड़ी को यादृच्छिक स्थान पर शुरू करने की कोई आवश्यकता नहीं है। खिलाड़ी हमेशा कक्ष 19 में उत्तर की ओर मुंह करके शुरू होता है।
मैं समझता हूं कि जैसा कि वम्पस "गड्ढे से अप्रभावित" होता है, वंपस उस कमरे में शुरू हो सकता है, या उस कमरे में प्रवेश कर सकता है जहां गड्ढा है। सामान्य तौर पर यह एक बिंदु को छोड़कर चीजों को सरल करता है। खेल खत्म होने का संकेत देने के लिए मेरे पास कोई विशिष्ट चर नहीं है; यह तब खत्म हो जाता है जब खिलाड़ी वैंपस या गड्ढे से मेल खाता है। इसलिए जब खिलाड़ी जीतता है तो मैं विजयी संदेश प्रदर्शित करता हूं लेकिन खिलाड़ी को लूप से बाहर निकालने के लिए गड्ढे में ले जाता हूं! मैं खिलाड़ी को गड्ढे में नहीं डाल सकता हूँ क्योंकि वहाँ पर वंपस हो सकता है और मुझे वम्पस के बारे में एक संदेश मिलेगा जो मुझे नहीं चाहिए।
Rev0program ने पूरी तरह से विजुअल स्टूडियो में काम किया, लेकिन IDE ने कहा "एक्स्टेक्ट के आसपास भ्रष्ट भ्रष्ट"। इसका कारण यह है कि स्कैनफ ने इसकी वजह से अपने लिनक्स मशीन पर int
एक char.
डेनिस रिपोर्ट किए गए गलत व्यवहार में डालने की कोशिश कर रहा है । वैसे भी यह सही प्रकार के प्रयोग से ठीक होता है।
रेव 0 में बोर्ड प्रदर्शित करने की रेखा अनाड़ी है और अन्य प्लेटफार्मों पर थोड़ी अलग दिखाई देती है। में printf(" %c%c%c")
मध्य% c प्रिंट करने योग्य चरित्र दिखाया गया है। अंतिम% c या तो ASCII 0 है या ASCII 10 (\ n, विंडोज लाइन में गाड़ी वापसी के साथ नई लाइन है।) विंडोज में ऐसा कोई चरित्र नहीं प्रतीत होता है जो कंसोल में काम करता है, जो गाड़ी का रिटर्न दिए बिना एक पंक्ति में नीचे चला जाएगा। अगर वहाँ था तो मुझे पहले c% (ASCII 0, या ASCII 9 टैब को अक्षांश 1 वर्ण से पहले की आवश्यकता नहीं होगी। टैब उनके व्यवहार में बेहद अपरिभाषित हैं।) प्रमुख स्थान स्वरूपण में सुधार करता है (अक्षांश 3 और 2 अक्षांश अक्षांश 1 वर्ण के आसपास रखता है)। ।) Rev 1 में इस लाइन का एक रिविजन होता है जो a \ f फॉर्मफीड कैरेक्टर का उपयोग करता है और इसलिए प्रिंटफ की शुरुआत में फॉर्मेट कैरेक्टर की जरूरत नहीं होती है। यह इसे छोटा बनाता है, लेकिन \ f विंडोज में काम नहीं करता है।