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