14-4-¹Ù.snake

´ÙÀ½Àº snake °ÔÀÓÀ» ºÐ¼®ÇØ º¸ÀÚ. °ÔÀÓ ±ÔÄ¢Àº ¹«Ã´ °£´ÜÇÏ´Ù. ±æ´Ù¶õ ²¿¸®¸¦ °¡Áø ¹ìÀÌ È­¸é»ó¿¡ ¹«ÀÛÀ§·Î ³ªÅ¸³ª´Â ¼ýÀÚ¸¦ ¸ÔÀ¸·¯ ´Ù´Ï´Âµ¥ ¸ÔÀº ¼ýÀÚÀÇ ÀÏÁ¤ ¹è¼ö¸¸Å­ ²¿¸®°¡ °è¼Ó ´Ã¾î³­´Ù. È­¸é»ó ¾îµð³ª ÀÚÀ¯·Ó°Ô µ¹¾Æ´Ù´Ò ¼ö ÀÖÁö¸¸ º®À̳ª Àڱ⠲¿¸®¿¡ ºÎµúÃļ­´Â ¾ÈµÈ´Ù. ÃÖÃÊ ²¿¸®ÀÇ ±æÀÌ´Â 2¹Û¿¡ ¾ÈµÇÁö¸¸ ¸ÔÀ̸¦ ¸ÔÀ»¼ö·Ï ²¿¸®°¡ ´Ã¾î³ª ¿òÁ÷ÀÓÀÌ ºÎÀÚ¿¬½º·¯¿öÁö´Âµ¥ Àڱ⠲¿¸®¿¡ °®È÷Áö ¾Êµµ·Ï ²¿¸®¸¦ Àß ¸»°í ´Ù´Ï´Â °ÍÀÌ ÀÌ °ÔÀÓÀÇ ¿ä·ÉÀÌ´Ù. ½ÇÇàÁßÀÇ ¸ð½ÀÀº ´ÙÀ½°ú °°´Ù.

Àڱ⠲¿¸®´Â º¸Áö ¾Ê°í ¼ýÀÚ¸¸ º¸°í ´Ù´Ï´Ù°¡´Â ±Ý¹æ °®Çô ¹ö¸®°Ô µÇ¹Ç·Î »ý°¢À» ÇØ °¡¸é¼­ °ÔÀÓÀ» ÇØ¾ß ÇÑ´Ù. »óÇÏÁ¿ì Ä¿¼­ À̵¿Å°·Î ¹ìÀ» Á¶Á¤ÇÏ¸ç ´ë±â Áß¿¡ n, p Ű·Î ½ºÅ×ÀÌÁö¸¦ °í¸¦ ¼ö ÀÖ´Ù. °ø¹éŰ´Â °ÔÀÓÀ» Àá½Ã Á¤Áö½ÃŰ¸ç ¾ðÁ¦µçÁö Esc۸¦ ´©¸£¸é °ÔÀÓÀÌ Á¾·áµÈ´Ù. Àüü ¼Ò½º´Â ´ÙÀ½°ú °°´Ù.

 

¿¹ Á¦ : snake

#include <Turboc.h>

 

#define QS 1600

#define putchxy(x,y,ch) { gotoxy(x,y);putch(ch); }

void InitStage(int stage);

BOOL MoveSnake();

void ProcessKey();

int getchcon(int x, int y);

void waitanykey();

 

struct tag_Point {

     int x,y;

};

tag_Point snake[QS];

tag_Point now;

int head,tail;

int inctail;

enum tag_Dir { LEFT=75, RIGHT=77, UP=72, DOWN=80 };

tag_Dir dir;

int life;

int maxnumber;

int speed;

int multi;

int stage;

 

void main()

{

     int number;

     int ch;

     int x,y;

 

     life=5;

     randomize();

     setcursortype(NOCURSOR);

     for (;;) {

          InitStage(stage);

          gotoxy(0,23);printf("½ºÅ×ÀÌÁö : %d",stage+1);

          gotoxy(20,23);printf("³²Àº ¹ì : %d",life);

          for (number=0;number<maxnumber;number++) {

              gotoxy(40,23);printf("³²Àº ¸ÔÀÌ : %d ",maxnumber-number);

              gotoxy(60,23);printf("²¿¸® ±æÀÌ : 2 ");

              // °ø¹éÀÎ ÀÚ¸®¿¡ »õ·Î¿î ¼ýÀÚ¸¦ »ý¼ºÇÑ´Ù.

               do {

                   x=random(80);

                   y=random(22);

              } while (getchcon(x,y) != ' ');

              gotoxy(x,y);printf("%d",random(9)+1);

 

              // °ÔÀÓ ½ÃÀÛ Á÷ÈÄÀ̸é Àá½Ã ´ë±âÇÏ¸ç ½ºÅ×ÀÌÁö Á¶Á¤ ±âȸ¸¦ ÁØ´Ù

              if (number == 0) {

                   ch=getch();

                   if (ch == 0xE0) {

                        getch();

                   } else {

                        if (ch == 27) {

                             setcursortype(NORMALCURSOR);

                             exit(0);

                        }

                        if (tolower(ch) == 'n') {

                             stage = (stage == 4 ? 0:stage+1);

                             break;

                        }

                        if (tolower(ch) == 'p') {

                             stage = (stage == 0 ? 4:stage-1);

                             break;

                        }

                   }

              }

 

              // ¹ì À̵¿ ·çÇÁ

              if (MoveSnake()==TRUE) {

                   if (--life == 0) {

                        gotoxy(12,20);

                        puts("°ÔÀÓÀÌ ³¡³µ½À´Ï´Ù. ±×¸¸ ³î°í ¿­½ÉÈ÷ °øºÎÇϼ¼¿ä.");

                        return;

                   }

                   delay(1500);

                   break;

              }

          }

          if (number == maxnumber) {

              gotoxy(12,20);

              puts("ÃàÇÏÇÕ´Ï´Ù. ¾Æ¹« Ű³ª ´©¸£½Ã¸é ´ÙÀ½ ½ºÅ×ÀÌÁö·Î °©´Ï´Ù.");

              waitanykey();

              stage++;

          }

     }

}

 

// ½ºÅ×ÀÌÁö ÃʱâÈ­

void InitStage(int stage)

{

     int i;

 

     clrscr();

     snake[0].x=5;snake[0].y=5;

     snake[1].x=6;snake[1].y=5;

     snake[2].x=7;snake[2].y=5;

     gotoxy(5,5);puts("##S");

     head=2;

     tail=0;

     inctail=0;

     now.x=7;

     now.y=5;

     dir=RIGHT;

 

     // ¹Ù±ùÀÇ º®À» ±×¸°´Ù.

     for (i=0;i<80;i++) {

          putchxy(i,0,'M');

          putchxy(i,22,'M');

     }

     for (i=0;i<23;i++) {

          putchxy(0,i,'M');

          putchxy(79,i,'M');

     }

 

     // ½ºÅ×ÀÌÁöº°·Î Àå¾Ö¹°À» Àû´çÈ÷ ±×¸®°í ³­À̵µ¸¦ Á¶ÀýÇÑ´Ù.

     switch (stage) {

     case 0:

          maxnumber=5;speed=150;multi=3;

          for (i=30;i<=50;i++) { putchxy(i,11,'M'); }

          break;

     case 1:

          maxnumber=10;speed=100;multi=5;

          for (i=20;i<=60;i++) { putchxy(i,7,'M'); putchxy(i,14,'M'); }

          break;

     case 2:

          maxnumber=15;speed=80;multi=6;

          for (i=20;i<60;i++) { putchxy(i,11,'M'); }

          for (i=6;i<=16;i++) { putchxy(40,i,'M'); }

          break;

     case 3:

          maxnumber=20;speed=60;multi=7;

          for (i=20;i<60;i++) {

              if (i < 30 || i > 50) {

                   putchxy(i,7,'M');

                   putchxy(i,14,'M');

              }

          }

          for (i=7;i<15;i++) { putchxy(20,i,'M'); putchxy(60,i,'M'); }

          break;

     case 4:

          maxnumber=1970;speed=50;multi=9;

          break;

     }

}

 

// ¹ìÀ» À̵¿½ÃŲ´Ù. Á×¾úÀ¸¸é TRUE¸¦ ¸®ÅÏÇÑ´Ù.

BOOL MoveSnake()

{

     int headch;

     int len;

     int prev;

 

     for (;;) {

          gotoxy(60,23);

          len=head-tail;

          if (len < 0) len+=QS;

          printf("²¿¸® ±æÀÌ : %d ",len);

          ProcessKey();

 

          switch (dir) {

          case LEFT:

              now.x--;

              break;

          case RIGHT:

              now.x++;

              break;

          case UP:

              now.y--;

              break;

          case DOWN:

              now.y++;

              break;

          }

 

          // ¸Ó¸® ÇÑÄ­ ÁøÇà

          head=(head == QS-1 ? 0:head+1);

          snake[head]=now;

 

          // ²¿¸® ÇÑÄ­ ÁøÇà. ´Ü ´Ã¾î³ª°í ÀÖ´Â ÁßÀÌ¸é ±× ÀÚ¸®¿¡ Àִ´Ù.

          if (inctail == 0) {

              tail=(tail == QS-1 ? 0:tail+1);

          } else {

              inctail--;

          }

 

          // ¸Ó¸®¸¦ ±×¸®±â Àü¿¡ ¸Ó¸® À§Ä¡ÀÇ ¹®ÀÚ¸¦ ¹Ì¸® ÀÐ¾î ³õ¾Æ¾ß ÇÑ´Ù.

          headch=getchcon(now.x,now.y);

          putchxy(snake[head].x,snake[head].y,'S');

          prev=(head == 0 ? QS-1:head-1);

          putchxy(snake[prev].x,snake[prev].y,'#');

          prev=(tail == 0 ? QS-1:tail-1);

          putchxy(snake[prev].x,snake[prev].y,' ');

 

          // ÇöÀç À§Ä¡°¡ °ø¹éÀÌ ¾Æ´Ï¸é ¾îµò°¡¿¡ ºÎµúÈù °ÍÀÓ

          if (headch != ' ') {

              break;

          }

          delay(speed);

     }

 

     // º®À̳ª Àڱ⠲¿¸®¿¡ ºÎµúÃÆÀ¸¸é Á×Àº °ÍÀÓ

     if (headch == 'M' || headch == '#') {

          return TRUE;

     }

     // ¸ÔÀº ¼ýÀÚÀÇ multi ¹è¸¸Å­ ²¿¸®¸¦ ´Ã¸°´Ù. ´Ã¾î³ª°í ÀÖ´Â ÁßÀ̶ó¸é ´©ÀûµÈ´Ù.

     inctail+=(headch-'0')*multi;

     return FALSE;

}

 

// Ű ÀÔ·ÂÀ» ó¸®ÇÑ´Ù.

void ProcessKey()

{

     int ch;

 

     if (!kbhit()) {

          return;

     }

     ch=getch();

     if (ch == 0xE0 || ch == 0) {

          ch=getch();

          switch (ch) {

          case LEFT:

              // ÁøÇà ¹Ý´ë ¹æÇâÀ¸·Î´Â ÀüȯÇÒ ¼ö ¾ø´Ù.

              if (dir != RIGHT) dir=LEFT;

              break;

          case RIGHT:

              if (dir != LEFT) dir=RIGHT;

              break;

          case UP:

              if (dir != DOWN) dir=UP;

              break;

          case DOWN:

              if (dir != UP) dir=DOWN;

              break;

          }

     } else {

          switch (tolower(ch)) {

          case 27:

              setcursortype(NORMALCURSOR);

              exit(0);

          case ' ':

              waitanykey();

              break;

          }

     }

}

 

// È­¸éÀÇ x,yÀ§Ä¡¿¡ ÀÖ´Â ¹®ÀÚ¸¦ Á¶»çÇÑ´Ù.

int getchcon(int x, int y)

{

     COORD Cur;

     Cur.X=x;

     Cur.Y=y;

     TCHAR Char;

     DWORD dwRead;

 

     ReadConsoleOutputCharacter(GetStdHandle(STD_OUTPUT_HANDLE),

          &Char,1,Cur,&dwRead);

     return Char;

}

 

// ÀÓÀÇÀÇ Å° Çϳª°¡ ´­·¯Áú ¶§±îÁö ´ë±âÇÑ´Ù.

void waitanykey()

{

     int ch;

 

     ch=getch();

     if (ch==0xE0 || ch==0) {

          getch();

     }

}

 

getchcon ÇÔ¼ö´Â È­¸é»óÀÇ x,y À§Ä¡¿¡ ÀÖ´Â ¹®ÀÚ۸¦ Á¶»çÇϴµ¥ putchÀÇ ¹Ý´ë ÇÔ¼ö¶ó°í »ý°¢ÇÏ¸é µÈ´Ù. C Ç¥ÁØ ÇÔ¼öÁß¿¡ ÀÌ·± ÇÔ¼ö°¡ ¾øÀ¸¹Ç·Î Á÷Á¢ ¸¸µé¾î¼­ »ç¿ëÇß´Ù. ÀÌ ÇÔ¼öÀÇ ³»ºÎ¿¡´Â ¿î¿µÃ¼Á¦°¡ Á¦°øÇÏ´Â API ÇÔ¼ö È£ÃâÀÌ Æ÷ÇԵǾî Àִµ¥ ÀÌ Äڵ忡 ´ëÇØ¼­´Â ´ÙÀ½¿¡ ¿¬±¸ÇØ º¸±â ¹Ù¶ó°í ÀÏ´ÜÀº »ç¿ë¸¸ Çϵµ·Ï ÇÏÀÚ.

ÀÌ ÇÁ·Î±×·¥ÀÇ ÇÙ½É ÀÚ·á ±¸Á¶´Â ¹ìÀÇ ÇöÀç ÀÚÃ븦 ±â¾ïÇÏ´Â snake¶ó´Â ¹è¿­ÀÌ´Ù. ¹ìÀÌ ¾ÆÁÖ ±æ¾îÁú ¼ö Àֱ⠶§¹®¿¡ ÁÂÇ¥°ª Çϳª¸¸ ±â¾ïÇØ¼­´Â ¹ì ¸öüÀÇ À§Ä¡¸¦ ¸ðµÎ ¾Ë ¼ö ¾øÀ¸¹Ç·Î ¹ìÀÌ Áö³ª´Â °÷ ÀüüÀÇ ÁÂÇ¥¸¦ ¹è¿­·Î ±â¾ïÇÑ´Ù. ÁÂÇ¥¸¦ ±â¾ïÇÏ´Â Point ±¸Á¶Ã¼ÀÇ ¹è¿­·Î ¼±¾ðµÇ¾úÀ¸¸ç ¹è¿­ÀÇ ³¡°ú óÀ½À» ¿¬°áÇÏ¿© ¿øÇü Å¥ ÇüÅ·Π»ç¿ëÇϰí ÀÖ´Ù. ²¿¸® ±æÀ̰¡ 5ÀÎ ¹ìÀÌ ¿øÇü Å¥¿¡ ±â¾ïµÈ ¸ð¾çÀº ´ÙÀ½°ú °°´Ù.

head´Â ¹ìÀÇ ¸Ó¸® ºÎºÐ ÷ÀÚ¸¦ ±â¾ïÇϸç tailÀº ²¿¸®ÀÇ Ã·ÀÚ¸¦ ±â¾ïÇÑ´Ù. »ç¿ëÀÚÀÇ Å° ÀԷ¿¡ µû¶ó ¹ìÀÌ À̵¿Çϴµ¥ À̶§ »õ·Î¿î ¸Ó¸® ÁÂÇ¥¸¦ head¿¡ ±â·ÏÇϸ鼭 head´Â ¹è¿­ÀÇ µÚÂÊÀ¸·Î °è¼Ó ÀüÁøÇÑ´Ù. tailÀº ¹ìÀÇ ³¡ ºÎºÐ¿¡ ´ëÇÑ Ã·ÀÚÀε¥ head¿Í °°Àº ¹æÇâÀ¸·Î À̵¿Çϸ鼭 µÚÂÊÀÇ ²¿¸®¸¦ Áö¿ì´Â ¿ªÇÒÀ» ÇÑ´Ù. ¹ìÀÌ Áö³ª°£ ÁÂÇ¥¸¦ ¸ðµÎ ±â¾ïÇÏÁö ¾ÊÀ¸¸é ²¿¸®¸¦ Áö¿ï ¼ö ¾øÀ» °ÍÀÌ´Ù.

Å¥ÀÇ Å©±â´Â ¸ÅÅ©·Î »ó¼ö QS·Î Á¤ÀǵǾî Àִµ¥ 1600Á¤µµÀÇ ÃæºÐÈ÷ Å« °ªÀ» ÁÖ¾ú´Ù. ±×·¯³ª °ÔÀÓÀÌ °è¼Ó ÁøÇàµÇ¸é ÀÌ ±æÀÌ´Â ±Ý¹æ ºÎÁ·ÇØÁö¹Ç·Î Å¥ÀÇ Ã³À½°ú ³¡À» ³í¸®ÀûÀ¸·Î ¿¬°áÇÏ¿© »ç¿ëÇÑ´Ù. head°¡ ¹è¿­ÀÇ µÚÂÊÀ¸·Î ÁøÇàÇÏ´Ù°¡ Å¥ÀÇ ³¡¿¡ ´êÀ¸¸é ´Ù½Ã óÀ½À¸·Î µ¹¾Æ°¡ ¾ÕÂÊÀÇ ºó °ø°£À» Àç»ç¿ëÇÑ´Ù. °á±¹ QS´Â ¹ìÀÇ ÃÖ´ë ±æÀ̸¦ ÁöÁ¤ÇÏ´Â Å©±â¶ó°í ÇÒ ¼ö Àִµ¥ ¹ì ±æÀ̰¡ 1600ÀÌ µÇ¸é head¿Í tailÀÌ ÇѹÙÄû µ¹¾Æ¼­ ¸¸³ª°Ô µÉ °ÍÀÌ´Ù. ±×·¯³ª È­¸é Å©±â°¡ ±×·¸°Ô Å©Áö ¾Ê±â ¶§¹®¿¡ ÀÌ·± ÀÏÀº ¹ß»ýÇÏÁö ¾Ê´Â´Ù.

ÀÌ ¿¹Á¦ÀÇ ³ª¸ÓÁö ºÎºÐ¿¡ ´ëÇÑ ½Ã½ÃÄÝÄÝÇÑ ºÐ¼®Àº »ý·«Çϱâ·Î ÇÑ´Ù. ¾îÂ÷ÇÇ ½ÇÀü¿¡¼­ ±¸ÇÏ°Ô µÇ´Â ¼Ò½º¿¡´Â º°´Ù¸¥ ¼³¸íÀÌ ¾ø´Â °æ¿ì°¡ ¸¹À¸¹Ç·Î ÀÌ·± ¼Ò½º·ÎºÎÅÍ ÇÁ·Î±×·¥ÀÇ ±¸Á¶¸¦ ÆÄ¾ÇÇÏ°í ¼öÁ¤ÇÒ ¼ö ÀÖ´Â ¼Ò½º ÇØµ¶ ´É·ÂÀ» °®Ãç¾ß ÇÑ´Ù. ÀÌ ¿¹Á¦¸¦ ´ë»óÀ¸·Î ³²ÀÇ ¼Ò½º¸¦ ºÐ¼®ÇÏ´Â ¿¬½ÀÀ» ÇØ º¸±â ¹Ù¶õ´Ù. ÀÚ¼¼ÇÑ ºÐ¼®À» ÇÏÁö ¾Ê´Â ´ë½Å ÁÖ¿ä ºÎºÐ¿¡ ´ëÇØ¼­´Â °£·«Çϳª¸¶ ÁÖ¼®À» ´Þ¾Æ µÎ¾ú´Ù.