एक भूलभुलैया खेल के लिए एक इंजन बनाएँ


9

यह प्रिंट अ भूलभुलैया प्रश्न का अनुसरण है । यदि आपको यह सवाल पसंद है, तो कृपया अधिक भूलभुलैया पीढ़ी के एल्गोरिदम जोड़ें;)।

इस कार्य के लिए आपको एक खिलाड़ी के लिए एक गेम इंजन को लागू करना होगा, जिसे एक भूलभुलैया में खजाना ढूंढना होगा और कालकोठरी से बाहर निकलना होगा।

इंजन मानक इनपुट. से भूलभुलैया को पढ़ने के बाद शुरू होता है, जिसमें कमांड लाइन में तर्क के रूप में दी गई एक (डॉट) फ़ाइल वाली लाइन होती है। अगले खिलाड़ी @को मानचित्र पर एक यादृच्छिक स्थान पर रखा जाता है। तब इंजन मानक io के माध्यम से खिलाड़ी के साथ बातचीत करना शुरू करता है:

से आदेश इंजन खिलाड़ी के लिए :

  • continue: खेल समाप्त नहीं हुआ। आसपास मुद्रित कर रहे हैं एक द्वारा पीछा किया .। खिलाड़ी @चरित्र द्वारा दर्शाया जाता है। बोने की कोशिकाओं का प्रतिनिधित्व किया जाता है ?
  • finished: खेल समाप्त। चरणों की संख्या मुद्रित होती है और खेल बंद हो जाता है।

से आदेश खिलाड़ी इंजन के लिए :

  • north: खिलाड़ी ऊपर ले जाता है।
  • south: खिलाड़ी नीचे ले जाता है।
  • west: खिलाड़ी को छोड़ दिया।
  • east: खिलाड़ी को सही स्थानांतरित करें।

खिलाड़ी से किसी भी अमान्य कमांड (जैसे दीवार को मारना) को अनदेखा किया जाता है, लेकिन फिर भी उसे गिना जाता है। आप अपनी पसंद के अनुसार परिवेश को परिभाषित करने के लिए स्वतंत्र हैं।

  • सबसे छोटे कोड के लिए अंक
  • जटिल परिवेश के लिए अंक (जैसे बड़े क्षेत्रों को प्रिंट करते हैं और उन कोशिकाओं को प्रतिस्थापित करते हैं जो दिखाई नहीं देते हैं ?)।
  • कोड के लिए कोई अंक जो io प्रारूप का सम्मान नहीं करता है

उदाहरण :

इस उदाहरण में परिवेश को बीच में खिलाड़ी के साथ 3x3 सेल के रूप में परिभाषित किया गया है।

$ cat maze
+-+-+
  |#|
|   |
+---+
$ python engine.py maze
 |#
 @ 
---
.
east
|#|
 @|
--+
.
north
+-+
|@|
  |
.
south
|#|
 @|
--+
.
west
 |#
 @ 
---
.
west
  |
|@ 
+--
.
north
+-+
 @|
|  
.
west
finished
7

@ अलेक्सांद्रु: हम अपने माज़े बनाने के लिए क्या उपयोग कर रहे हैं? क्या हम अन्य लोगों के भूलभुलैया एल्गोरिदम का उपयोग कर सकते हैं (स्पष्ट रूप से उचित ऋण के साथ)? या हमें आपका पहला काम पूरा करना चाहिए?
15

@snmcdonald: फिक्स्ड टाइपो। अन्य लोगों के मेज़ का उपयोग करें। याद रखें कि इंजन मानक इनपुट से भूलभुलैया पढ़ता है।
अलेक्जेंड्रू

इस ब्लॉग में विभिन्न और मिश्रित एल्गोरिदम weblog.jamisbuck.org का उपयोग करके भूलभुलैया पीढ़ी पर उत्कृष्ट लेख हैं। बढ़ते हुए पेड़ के एल्गोरिथ्म की जाँच करें-विशेष रूप से weblog.jamisbuck.org/2011/1/27/…
Dve

मैं उलझन में हूँ कि कैसे दोनों भूलभुलैया और उपयोगकर्ता संपर्क मानक इनपुट से आते हैं। क्या उपयोगकर्ता को अपने भूलभुलैया में टाइप करना है और फिर इसे हल करना है? केवल भूलभुलैया के एक हिस्से को दिखाने के उद्देश्य से किंडा हार गया ...
कीथ रान्डेल

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

जवाबों:


7

C99, 771 वर्ण

#include <ncurses.h>
#include <string.h>
#define MIN(A,B) (A<B?A:B)
#define MAX(A,B) (A>B?A:B)
#define T(C,X,Y) case C:if((m[x+X][y+Y]==' ')||(m[x+X][y+Y]=='#'))x+=X,y+=Y;s++;break;
char m[24][81],M[24][81];int i,j,I=0,J,x,y,s=0;
int main(int c,char**v){FILE*f=fopen(v[1],"r");
for(I=0;fgets(m[I],80,f);I++)J=MAX(J,strlen(m[I]));
J--;f=fopen("/dev/random","r");do{x=fgetc(f)%I;y=fgetc(f)%J;}
while(m[x][y]!=' ');initscr();curs_set(0);do{
switch(c){T('e',0,1)T('n',-1,0)T('s',1,0)T('w',0,-1)}
for(i=MAX(0,x-1);i<MIN(x+2,I);i++)for(j=MAX(0,y-1);j<MIN(y+2,J);j++)M[i][j]=1;
for(i=0;i<I;i++)for(j=0;j<J;j++)mvaddch(i,j,M[i][j]?m[i][j]:'?');
mvaddch(x,y,'@');refresh();}while((m[x][y]!='#')&&(c=getch())!='q');
if(m[x][y]=='#')mvprintw(I,0,"Finished in %d steps!",s),getch();endwin();}

आवश्यकता है और ncurses का उपयोग करता है। लंबाई के लिए केवल एक वृहदकरण, और एन और एम मैक्रोज़ लापता न्यूनतम और अधिकतम opperators को बदलने के लिए हैं, और मुझे नहीं लगता कि उस पर बहुत कुछ करना है।

यह मानता है कि इनपुट भूलभुलैया 80 वर्णों से अधिक चौड़ा नहीं है, और यह कि एक भूलभुलैया फ़ाइल नाम कमांड लाइन पर पारित किया गया है, और यह कि मापदंडों की संख्या काफी कम है कि सी का प्रारंभिक मूल्य एक आंदोलन कमांड नहीं है।

  • इस मानक से विचलन होता है कि यह एकल वर्ण दिशा निर्देश लेता है जो सुझाए गए पहले अक्षर के निचले भाग के रूप में होता है।

  • अज्ञात क्षेत्रों को '?' के रूप में दिखाता है।

टिप्पणियों के साथ अधिक पठनीय:

#include <ncurses.h>
#include <string.h>

#define MIN(A,B) (A<B?A:B)/*unsafe,but short*/
#define MAX(A,B) (A>B?A:B)/*unsafe,but short*/
// #define MAX(A,B) ((_A=A)>(_B=B)?_A:_B) /* safe but verbose */
#define T(C,X,Y) case C:if((m[x+X][y+Y]==' ')||(m[x+X][y+Y]=='#'))x+=X,y+=Y;s++;break;
char m[24][81],M[24][81];/* [m]ap and [M]ask; NB:mask intialized by default */
int i,j, /* loop indicies over the map */
  I=0,J, /* limits of the map */
  x,y,   /* player position */
  s=0;   /* steps taken */
int main(int c,char**v){
  FILE*f=fopen(v[1],"r"); /* fragile, assumes that the argument is present */
  /* Read the input file */
  for(I=0;fgets(m[I],80,f);I++)J=MAX(J,strlen(m[I])); /* Read in the map */ 
  J--;
  /* note that I leak a file handle here */
  f=fopen("/dev/random","r");
  /* Find a open starting square */
  do{ 
    x=fgetc(f)%I; /* Poor numeric properties, but good enough for code golf */
    y=fgetc(f)%J;
  } while(m[x][y]!=' ');
  /* setup curses */
  initscr(); /* start curses */
  //  raw();     /* WARNING! intercepts C-c, C-s, C-z, etc...
  //          * but shorter than cbreak() 
  //          */
  curs_set(0); /* make the cursor invisible */
  /* main loop */
  do {
    switch(c){
      T('e',0,1)
      T('n',-1,0)
      T('s',1,0)
      T('w',0,-1)
    }
    /* Update the mask */
    for(i=MAX(0,x-1);i<MIN(x+2,I);i++)
      for(j=MAX(0,y-1);j<MIN(y+2,J);j++)
    M[i][j]=1;
    /* draw the maze as masked */
    for(i=0;i<I;i++)
      for(j=0;j<J;j++)
    mvaddch(i,j,M[i][j]?m[i][j]:'?');
    /* draw the player figure */
    mvaddch(x,y,'@');
    refresh(); /* Refresh the display */
  } while((m[x][y]!='#')&&(c=getch())!='q');
  if(m[x][y]=='#')mvprintw(I,0,"Finished in %d steps!",s),getch();
  endwin();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.