একটি গোলকধাঁধা গেমের জন্য একটি ইঞ্জিন তৈরি করুন


9

এটি একটি গোলকধাঁধা প্রশ্ন মুদ্রণের ফলোআপ । আপনি যদি এই প্রশ্নটি পছন্দ করেন, দয়া করে আরও গোলকধাঁধা প্রজন্মের অ্যালগোরিদম যুক্ত করুন;)।

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

ইঞ্জিনটি স্ট্যান্ডার্ড ইনপুট. থেকে গোলকধাঁটি পড়ে কমান্ড লাইনে আর্গুমেন্ট হিসাবে প্রদত্ত একটি ফাইল (ডট) যুক্ত একটি লাইন অনুসরণ করে শুরু হয় । এরপরে প্লেয়ারটিকে @মানচিত্রের এলোমেলো স্থানে স্থাপন করা হয়েছে। তারপরে ইঞ্জিন স্ট্যান্ডার্ড আইওয়ের মাধ্যমে প্লেয়ারের সাথে আলাপচারিতা শুরু করে:

ইঞ্জিন থেকে প্লেয়ারের কমান্ড :

  • continue: খেলা শেষ হয়নি। পারিপার্শ্বিক মুদ্রিত হয় এরপরে ক .। প্লেয়ার @চরিত্র দ্বারা প্রতিনিধিত্ব করা হয় । নিরীক্ষণযোগ্য কোষ দ্বারা প্রতিনিধিত্ব করা হয় ?
  • finished: খেলা শেষ। পদক্ষেপের সংখ্যা মুদ্রিত হয় এবং খেলা বন্ধ হয়ে যায়।

থেকে কমান্ড খেলোয়াড় ইঞ্জিন :

  • north: প্লেয়ার আপ সরানো।
  • south: প্লেয়ার নিচে সরানো।
  • west: বামদিকে সরানো Move
  • east: ডানদিকে সরান।

প্লেয়ারের কোনও অবৈধ কমান্ড (যেমন কোনও প্রাচীর আঘাত করা) উপেক্ষা করা হয়, তবে এখনও গণনা করা হয়। আপনি আপনার পছন্দ অনুযায়ী পারিপার্শ্বিক সংজ্ঞা দিতে পারেন free

  • সংক্ষিপ্ততম কোডের জন্য পয়েন্ট
  • জটিল চারপাশের পয়েন্টস (উদাহরণস্বরূপ বড় অঞ্চলগুলি মুদ্রণ করুন এবং এমন কক্ষগুলি প্রতিস্থাপন করুন যা দ্বারা দৃশ্যমান নয় ?)।
  • কোডের কোনও পয়েন্ট যা আইও ফর্ম্যাটকে সম্মান করে না

উদাহরণ :

এই উদাহরণে পার্শ্ববর্তী স্থানটি মাঝখানে প্লেয়ারের সাথে 3x3 সেল হিসাবে সংজ্ঞায়িত করা হয়েছে।

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

@ আলেকজান্দ্রু: আমরা আমাদের ম্যাজগুলি তৈরি করতে কী ব্যবহার করছি? আমরা কি অন্যান্য লোকদের ধাঁধা অ্যালগরিদম ব্যবহার করতে পারি (স্পষ্টভাবে যথাযথ creditণের সাথে)? অথবা আমরা আপনার প্রথম কাজ শেষ করতে হবে?
স্নকমডোনাল্ড

@ এসএনএমসিডোনাল্ড: ফিক্সড টাইপ অন্য ব্যক্তির ম্যাজগুলি ব্যবহার করুন। মনে রাখবেন ইঞ্জিন স্ট্যান্ডার্ড ইনপুট থেকে গোলকধাঁটিটি পড়ে।
আলেকজান্দ্রু

এই ব্লগে বিভিন্ন ধরণের এবং মিশ্র অ্যালগরিদম ওয়েবলগ.জামিসবুক.আর.এর ব্যবহার করে গোলকধাঁধা প্রজন্মের সম্পর্কে দুর্দান্ত নিবন্ধ রয়েছে: বিশেষত ওয়েবলগ.জামিসবাক.আর.জি.১১
ডেভ

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

কমান্ড ইনপুট থেকে গোলকধাঁধা ইনপুট পৃথক করতে আপনি এর উপরে একটি অ্যাপ তৈরি করতে পারেন (এই কাজটি অন্য প্রশ্নের জন্য ছেড়ে দেওয়া হয়েছে)।
আলেকজান্দ্রু

উত্তর:


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 প্রয়োজন এবং ব্যবহার করে। দৈর্ঘ্যের জন্য শুধুমাত্র একটি ম্যাক্রোয়াইজেশন এবং এন এবং এম ম্যাক্রোগুলি নিখোঁজ ন্যূনতম এবং সর্বাধিক বিরোধী প্রতিস্থাপন করবে এবং আমি মনে করি না এর পক্ষে আরও অনেক কিছু করার আছে।

এটা তোলে অনুমান ইনপুট ধাঁধা 80 অক্ষরের ওয়াইড বেশি না হয়, এবং যে একটি ধাঁধা ফাইলের নাম হয়েছে কম্যান্ড-লাইন হস্তান্তর হয়েছে, এবং পরামিতি সংখ্যা কম যথেষ্ট যে C- এর প্রাথমিক মান একটি আন্দোলন কমান্ড নয় যে।

  • স্ট্যান্ডার্ড থেকে বিচ্যুত হওয়া যাতে এটি একক অক্ষরের দিকনির্দেশ কমান্ড নেয় যেমন প্রস্তাবিত অক্ষরের ছোট হাতের অক্ষর থাকে।

  • '?' এর হিসাবে অজানা অঞ্চলগুলি দেখায়?

মন্তব্য সহ আরও পাঠযোগ্য:

#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();
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.