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 টি পদক্ষেপ নেওয়া লাগে, তিনি তার ডানদিকে গর্তটি জানেন এবং যথাসম্ভব দূরে যান gets একইভাবে, যখন সে ডাবিত বা বাম হয় তা জেনে না, যখন মোড়কে দুর্গন্ধযুক্ত করে, তখন সে পিছনে ফিরে ঘড়ির কাঁটার দিকের লুপ করে। তাকে আবার চাবুকের ঘ্রাণ নিতে 5 টি পদক্ষেপ লাগে, তাই তিনি জানেন যে এটি বাম দিকে এবং নিশ্চিতভাবে অঙ্কুরিত।
যদি সে অন্যভাবে লুপ করে ফেলেছিল তবে তিনি খুব শীঘ্রই উইম্পাসকে খুঁজে পেতেন এবং জানতেন যে এটি যেদিকে ঘুরিয়েছে সেদিকেই এটি ছিল।
আরইভি 1 সি (সাইগউইনের উপর জিসিসি), 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!",)}}
স্পষ্টতার জন্য নিউলাইনগুলি যুক্ত হয়েছে। রেভ 0 থেকে পরিবর্তনগুলি নিম্নরূপ:
উইন্ডোজের জন্য সাইগউইন লিনাক্স এমুলেটরটিতে জিসিসি সংকলক সুপারিশ করার জন্য @ ডেনিসকে একটি বড় থানকিউ। এই include
সংকলকটিকে রেভ 0 প্রোগ্রামের প্রয়োজন নেই, এবং এটি int
ভেরিয়েবলগুলির জন্য ডিফল্ট ধরণের অনুমতি দেয় এবং main.
এটি একটি জীবন পরিবর্তনকারী গল্ফিং টিপ!
অতিরিক্তভাবে লিনাক্সে চলার অর্থ \f
কার্স রিটার্ন না করে কার্সারটি নামিয়ে আনে (উইন্ডোতে এটি কেবল প্রিন্টযোগ্য প্রতীক তৈরি করে তার বিপরীতে) এই বোর্ডটি মুদ্রণকারী প্রিন্টফ স্টেটমেন্টের যথেষ্ট সংক্ষিপ্তকরণের অনুমতি দিয়েছে
মন্তব্যে ডেনিসের বেশ কয়েকটি অতিরিক্ত টিপস এবং আমার নিজস্ব একটি: তীরটি ডোবাটিকে আঘাত করেছে কিনা তা পরীক্ষা করার সময় শর্ত পরিবর্তন করা: if(q==w)
> if(q-w)
(..এছাড়া .. বিপরীত)
গ্রাফিক ডিসপ্লে যোগ করার সাথে সাথে প্লেয়ারটি জানেন যে কোথা থেকে কোথাও কোলে ডুবে যায় / বাতাসকে 35% বোনাস দাবি করা যায় তা সম্পর্কে তথ্য প্রদর্শন করা হয়। (আমি এটির পুরানো ডিবাগ সংস্করণটি মুছলাম যা ডাম্প এবং গর্তের সঠিক অবস্থান দেখায় It এটি সম্পাদনা ইতিহাসে দেখা যায়))
আরইভি 2 সি (সাইগউইনের উপর জিসিসি), 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
লুপের বাইরে রাখা বার্তা জয় / হারাতে হবে lose if
শর্তসাপেক্ষ অপারেটর দ্বারা প্রতিস্থাপিত।
শুটিং তীরের জন্য লাইনে কন্ডিশনাল অপারেটরের ব্যবহার। যদি প্লেয়ারটি মিস না করে তবে এর জন্য একটি বার্তা মুদ্রণ করা এবং মোড়কের অবস্থান সামঞ্জস্য করা উভয়ই প্রয়োজন। ডেনিস একত্রিত করার কয়েকটি উপায় printf
এবং ডাব্পাসের অবস্থান গণনার একক অভিব্যক্তিতে অফার করেছিল, তবে আমি নিজের একটির সাথে চলেছি। printf
মুদ্রিত অক্ষরের সংখ্যা প্রদান করে, যা Your arrow didn't hit anything\n
31 (11111 বাইনারি।) এর জন্য 31&Q(w)==Q(w)
।
এই সম্পাদনায় আমার অন্যান্য অবদানটি কিছু অপ্রয়োজনীয় বন্ধনীগুলি মুছে ফেলা হয়েছে।
আউটপুট
এখানে খেলোয়াড়টি ইতিমধ্যে উইম্পাস কোথায় রয়েছে তা খুঁজে পেয়েছেন, তবে পিটটিও ঠিক কোথায়, তা অনুসন্ধান করার জন্য পুরোপুরি অন্বেষণ করতে বেছে নিয়েছেন। আমার পুরানো ডিবাগ সংস্করণটির বিপরীতে যা দেখায় যে ডাব্পাস এবং পিট পুরো খেলা জুড়ে ছিল, এটি কেবলমাত্র সেই কক্ষগুলি দেখায় যেখানে খেলোয়াড়টি ঘুরে দেখেছে এবং একটি বায়ু অনুভূত করেছে (1) উইম্পাস (2) বা উভয় (3) গলিয়েছে। (যদি প্লেয়ার একটি তীর অঙ্কুর করে মিস করে a
তবে উইম্পাস পজিশনের তথ্য সম্বলিত ভেরিয়েবলটি পুনরায় সেট করা হয়))
আইসিওএসএডরন প্রেরণ
দ্রষ্টব্য: এই বিভাগটি রেভ 1 এর উপর ভিত্তি করে
আমার তারকা বৈশিষ্ট্য! আমার কোডটিতে কোনও গ্রাফ নেই। এটি কীভাবে কাজ করে তা বোঝাতে নীচের বিশ্বের মানচিত্র দেখুন। আইকোসহেড্রনের যে কোনও বিন্দু 0-00 অক্ষাংশ এবং দ্রাঘিমাংশ 0-4 (বা একক সংখ্যা, দ্বারা প্রতিনিধিত্ব করা যেতে পারে long*4+lat
) মানচিত্রে চিহ্নিত দ্রাঘিমাংশ রেখাটি কেবল দ্রাঘিমাংশের শূন্যযুক্ত মুখগুলির মধ্য দিয়ে যায় এবং অক্ষাংশ রেখাটি অতিক্রম করে অক্ষাংশ শূন্য সহ মুখগুলির কেন্দ্র।
খেলোয়াড়টি 3 টি সম্ভাব্য অক্ষের উপর ভিত্তি করে তৈরি করা যেতে পারে, যা প্রতীকগুলি দ্বারা নিম্নরূপ উপস্থাপন করা হয়: উত্তর-দক্ষিণ -
- \
উত্তর-পূর্বে-দক্ষিণ -পশ্চিম উত্তর-দক্ষিণ-পূর্বাঞ্চল /
। যে কোনও ঘরে তার কাছে উপলব্ধ এই অক্ষগুলির প্রতিটিটিতে তার ঠিক একটি প্রস্থান রয়েছে। প্রদর্শিত ডিসপ্লেতে প্লেয়ার একটি সম্পূর্ণ ঘড়ির কাঁটার লুপ তৈরি করে। খেলোয়াড়টি কোথা থেকে এসেছেন এবং সেইজন্য তাকে কোথায় যেতে দেওয়া হচ্ছে তা চিহ্নিত করে সাধারণত সনাক্ত করা সহজ।
অবিচ্ছিন্ন চোখের জন্য যে সমস্যাটি একটু কঠিন, তা হ'ল চতুর্থটি। আপনি যখন এই মেরু সারিগুলির মধ্যে একটি স্লেণ্ট দেখতে পান, প্লেয়ারটি স্লেন্টের বাইরের প্রান্তের নিকটবর্তী মেরু কোষ থেকে এসেছেন এবং সাধারণত নিরক্ষীয় অঞ্চলের দিকে মুখ করে থাকেন। সুতরাং খেলোয়াড় দক্ষিণপূর্বের মুখোমুখি হচ্ছে এবং তার বিকল্পগুলি হ'ল: 15 (দক্ষিণ, ডানদিকে ঘর) 25 (উত্তর পশ্চিম, উপরের ঘর) বা 35 (উত্তর পশ্চিম, নীচের ঘর))
সুতরাং, মূলত আমি আইকোসহেড্রনকে 5x4 গ্রিডে ম্যাপ করি, যেখানে কক্ষগুলি প্রিন্ট করা হয় তার ক্রমে 19 থেকে 0 নম্বর রয়েছে। নীচের টেবিল অনুযায়ী প্লেয়ারের অক্ষাংশ এবং দিকের উপর নির্ভর করে বর্তমান অবস্থান থেকে যোগ বা বিয়োগ করে সরানো হয়েছে।
যদি প্লেয়ার বোর্ডের নীচে (পশ্চিম) থেকে যায় তবে সে আবার উপরে (পূর্ব) দিকে ফিরে আসে এবং তদ্বিপরীত হয়, তাই তার অবস্থানটি মডুলো ২০-এ নেওয়া হয় General 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 দ্বারা বিভক্ত) তার বর্তমান দিকটিতে যুক্ত করা হয় এবং তার নতুন দিকনির্দেশ পেতে মডুলো 3 নেওয়া হয়। এটি বেশিরভাগ ক্ষেত্রেই সূক্ষ্মভাবে কাজ করে। তবে একটি সমস্যা আছে যখন সে একটি মেরু ঘরে থাকে এবং খুঁটির দিকে এগিয়ে যায়। নীচের মানচিত্রটি ভাঁজ করার সময় এটি স্পষ্ট হবে যে তিনি "উত্তর-পূর্ব" মুখী ঘরটি ছেড়ে দিলে তিনি "দক্ষিণ-পূর্ব" মুখী নতুন স্কোয়ারে প্রবেশ করবেন সুতরাং একটি সংশোধন করা আবশ্যক। এটি রেখায় e=(d+i/10)*m[p%4]%3;
দ্বারা দ্বারা গুণ দ্বারা সম্পন্ন হয় m[p%4]
। মি প্রথম চার মান [] যে এই ধরনের নির্বাচন করা হয় উপরে তাদের ফাংশন ছাড়াও, তারা বৈশিষ্ট আছে m[1]%3==m[2]%3==1
এবং m[0]%3==m[3]%3==2
। এটি নিরক্ষীয় ঘরের জন্য একা দিক ছেড়ে দেয় এবং মেরু কক্ষগুলির জন্য প্রয়োজনীয় সংশোধন প্রযোজ্য।
সংশোধন করার যৌক্তিক সময়টি পদক্ষেপের পরে হবে। তবে অক্ষর সংরক্ষণ করতে সরানোর আগে এটি সম্পন্ন করা হয়। সুতরাং মি [নির্দিষ্ট কিছু মান অবশ্যই স্থানান্তর করতে হবে। সুতরাং শেষ 2 টি অক্ষর উদাহরণস্বরূপ উপরের টেবিলের LT
পরিবর্তে TL
।
UNGOLFED CODE
এটি রেভ 1 কোড, যা রেভ 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!",)
}
}
সমস্যা এবং কুরিয়সিটিস
আমি @ প্রোফেসরফিশ দ্বারা উল্লিখিত পয়েন্টটির সদ্ব্যবহার করেছি, যদি উইম্পাস এবং পিটটি এলোমেলো জায়গায় শুরু হয়, তবে এলোমেলো জায়গায় প্লেয়ারটি শুরু করার দরকার নেই। প্লেয়ার সর্বদা উত্তর দিকে মুখ করে 19 ঘরে শুরু হয় starts
আমি বুঝতে পারি যে, উইম্পাসটি "গর্তের দ্বারা প্রভাবিত না হওয়ায়", উইম্পাস শুরু করতে পারে, বা যেখানে পিট রয়েছে সেখানে প্রবেশ করতে পারে। সাধারণভাবে এটি এক বিন্দু বাদে বিষয়গুলিকে সরল করে। গেমটি শেষ হয়েছে তা বোঝাতে আমার কোনও নির্দিষ্ট পরিবর্তনশীল নেই; খেলোয়াড়টি উইম্পাস বা পিটের সাথে একত্রিত হলে এটি শেষ হয়। সুতরাং প্লেয়ার জিতলে আমি বিজয়ী বার্তাটি প্রদর্শন করি তবে গর্তটি প্লেয়ারের কাছে লুপ থেকে দূরে সরে যাই! আমি প্লেয়ারটিকে গর্তের মধ্যে রাখতে পারি না কারণ উইম্পাস থাকতে পারে এবং আমি চাই না এমন উইম্পাস সম্পর্কে একটি বার্তা পাব।
রেভ0 প্রোগ্রামটি ভিজ্যুয়াল স্টুডিওতে পুরোপুরি কাজ করেছিল, তবে আইডিই বলেছিল প্রস্থান করার সময় "ভেরিয়েবলের চারপাশে স্ট্যাকটি দূষিত হয়েছে"। এটি কারণ স্ক্যানফ তার লিনাক্স মেশিনে int
কোনও char.
ডেনিসের ভুল আচরণের রিপোর্ট করার চেষ্টা করছে of যাইহোক এটি রেভ 1 এ সঠিক ধরণের ব্যবহার দ্বারা স্থির করা হয়েছে।
রেভ 0 তে বোর্ডটি প্রদর্শনের জন্য লাইনটি আনাড়ি এবং অন্য প্ল্যাটফর্মগুলিতে কিছুটা আলাদা দেখা যায়। ইন printf(" %c%c%c")
মধ্যম% গ মুদ্রণযোগ্য অক্ষর প্রদর্শন করা হয়। শেষ% c হয় হয় ASCII 0 বা ASCII 10 (\ n, উইন্ডোজে ক্য্যারিজ রিটার্ন সহ নতুন লাইন) সেখানে যদি আমার প্রথম সি% (ASCII 0, বা অ্যাসিটিআই 0, অক্ষাংশ 1 অক্ষরের আগে 9 টি ট্যাব প্রয়োজন হত না Tab ট্যাবগুলি তাদের আচরণে কুখ্যাতভাবে সংজ্ঞায়িত হয়)) শীর্ষস্থানীয় স্থান বিন্যাসকে উন্নত করে (অক্ষাংশ 3 এবং 2 অক্ষরের নিকটতর অক্ষাংশ 1 অক্ষর রাখে ।) রেভ 1 এ এই লাইনের একটি পুনর্বিবেচনা রয়েছে যা একটি \ f ফর্মফিড অক্ষর ব্যবহার করে এবং তাই প্রিন্টফের শুরুতে কোনও বিন্যাসের অক্ষরের প্রয়োজন নেই। এটি এটিকে খাটো করে তোলে তবে উইন্ডোজে work চ কাজ করে না।