3일차


오류 해결

 

  • switch구문을 if문으로 수정
  • 위에서 아래로 먹이를 먹을 때 방향 전환
  • 약간의 버퍼와 완전히 먹지 않아도 먹이가 없어짐
  • 이전 먹이와 근접한 거리의 먹이를 먹었을 경우 다른 먹이가 생성되지 않음

 

 

 

현재 게임 진행 코드


코드 보기

#include <stdio.h>

#include <conio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>

#define  UP  72
#define  LEFT 75
#define  RIGHT 77
#define  DOWN 80
#define  ENTER 13

 

void textcolor(int color_number) //텍스트 칼라를 바꿔주는 함수
{
   SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color_number);
}

 

gotoxy(int x, int y)
{
   COORD pos = { x, y };
   SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);

 

}

 

typedef enum { NOCURSOR, SOLIDCURSOR, NORMALCURSOR } CURSOR_TYPE;
void setcursortype(CURSOR_TYPE c){
   CONSOLE_CURSOR_INFO CurInfo;

 

   switch (c) {
   case NOCURSOR:
      CurInfo.dwSize = 1;
      CurInfo.bVisible = FALSE;
      break;
   case SOLIDCURSOR:
      CurInfo.dwSize = 100;
      CurInfo.bVisible = TRUE;
      break;
   case NORMALCURSOR:
      CurInfo.dwSize = 20;
      CurInfo.bVisible = TRUE;
      break;
   }
   SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &CurInfo);
}

 

void printmap()
{
   int i;
   system("cls");
   printf("
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
   for (i = 1; i<39; i++)
   {
      printf("
                                                                                                                                                  ");
   }
   printf("
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");  }

 

void play()
{
   int direction = UP;
   int width = 19;
   int height = 38;
   int FX, FY;
   int eat = 0;
   int length = 1;
   int SnakeNStar[40][40] = { 0 };
   int dead;

 

   SnakeNStar[width][height / 2] = 1;
   gotoxy(height, width);
   printf("
");

 

   while (1)
   {
      if (eat == 0)
      {
         srand((unsigned)time(NULL));
         FX = rand() % 38 + 1;
         FY = (rand() % 38 + 1) * 2;
         SnakeNStar[FX][FY / 2] = 2;
         gotoxy(FY, FX);
         textcolor(14);
         printf("
");
         eat++;
      }
      fflush(stdin);
      if (_kbhit())
      {
         direction = _getch();
      }
      if (direction == UP)
      {

 

         if (SnakeNStar[width - 1][height / 2] == 2)         

// 만약 다음에 움직일 칸이 먹이라면
         {
            SnakeNStar[width][height / 2] = 0;                

// 일단 현재칸을 0으로 만들고
            gotoxy(height, width);                                

// 커서를 현재칸에 옮긴 뒤
            printf("  ");                                              

// 공백을 채워준다.
            SnakeNStar[--width][height / 2] = 1;              

// 그리고 움직일 칸에 이동해서 1
            gotoxy(height, width);                                

// 커서를 움직일 칸에 이동 후
            textcolor(12);
            printf("
");                                                

// Snake를 그려줌
            FX = rand() % 38 + 1;                  // 세로 랜덤값을 만들고
            FY = (rand() % 38 + 1) * 2;            // 가로 랜덤값을 만듬

 

            while (1)                        // 먹이가 생성될 때 까지 무한반복
            {
               if (SnakeNStar[FX][FY / 2] != 1)  

// 먹이가 생성될 자리가 공백이면
               {
                  SnakeNStar[FX][FY / 2] = 2;     

// 먹이값을 채워준다.
                  gotoxy(FY, FX);                      

// 먹이 포인터를 이동한 후
                  textcolor(14);
                  printf("
");                           // 먹이를 그림
                  break;
               }
               else                                      

// 먹이가 생성될 자리가 공백이 아니면
               {
                  FX = rand() % 38 + 1;            

// 랜덤함수를 계속 돌린다.
                  FY = (rand() % 38 + 1) * 2;
               }
            }
         }
         else                                            

// 다음에 움직이는 칸이 공백이면
         {
            if (width == 1)
            {
               system("cls");
               return;
            }

 

            SnakeNStar[width][height / 2] = 0;            

// 현재칸을 공백값으로 만들고
            gotoxy(height, width);                           

// 커서를 현재칸으로 이동
            printf("  ");                                          

// 공백을 채워줌
            SnakeNStar[--width][height / 2] = 1;         

// 다음에 움직이는 칸에 뱀값을 집어넣고
            gotoxy(height, width);                          

// 커서를 다음칸으로 이동
            textcolor(12);
            printf("
");                                         

// 뱀을 그려준다.

 


         }
      }

 

      else if (direction == DOWN)
      {
         if (SnakeNStar[width + 1][height / 2] == 2)
         {
            SnakeNStar[width][height / 2] = 0;
            gotoxy(height, width);
            printf("  ");
            SnakeNStar[++width][height / 2] = 0;
            gotoxy(height, width);
            textcolor(12);
            printf("
");
            FX = rand() % 38 + 1;
            FY = (rand() % 38 + 1) * 2;

 

            while (1)
            {
               if (SnakeNStar[FX][FY / 2] != 1)
               {
                  SnakeNStar[FX][FY / 2] = 2;
                  gotoxy(FY, FX);
                  textcolor(14);
                  printf("
");
                  break;
               }
               else
               {
                  FX = rand() % 38 + 1;
                  FY = (rand() % 38 + 1) * 2;
               }
            }
         }
         else
         {
            if (width == 38)
            {
               system("cls");
               return;
            }
            SnakeNStar[width][height / 2] = 0;
            gotoxy(height, width);
            printf("  ");
            SnakeNStar[++width][height / 2] = 1;
            gotoxy(height, width);
            textcolor(12);
            printf("
");

 

         }
      }

 

      else if (direction == LEFT)
      {
         if (SnakeNStar[width][(height - 2) / 2] == 2)
         {
            SnakeNStar[width][height / 2] = 0;
            gotoxy(height, width);
            printf("  ");
            SnakeNStar[width][(height -= 2) / 2] = 1;
            gotoxy(height, width);
            textcolor(12);
            printf("
");
            FX = rand() % 38 + 1;
            FY = (rand() % 38 + 1) * 2;

 

            while (1)
            {
               if (SnakeNStar[FX][FY / 2] != 1)
               {
                  SnakeNStar[FX][FY / 2] = 2;
                  gotoxy(FY, FX);
                  textcolor(14);
                  printf("
");
                  break;
               }
               else
               {
                  FX = rand() % 38 + 1;
                  FY = (rand() % 38 + 1) * 2;
               }
            }
         }
         else
         {
            if (height == 2)
            {
               system("cls");
               return;
            }
            SnakeNStar[width][height / 2] = 0;
            gotoxy(height, width);
            printf("  ");
            SnakeNStar[width][(height -= 2) / 2] = 1;
            gotoxy(height, width);
            textcolor(12);
            printf("
");
         }
      }

 

      if (direction == RIGHT)
      {
         if (SnakeNStar[width][(height + 2) / 2] == 2)
         {
            SnakeNStar[width][height / 2] = 0;
            gotoxy(height, width);
            printf("  ");
            SnakeNStar[width][(height += 2) / 2] = 1;
            gotoxy(height, width);
            textcolor(12);
            printf("
");
            FX = rand() % 38 + 1;
            FY = (rand() % 38 + 1) * 2;

 

            while (1)
            {
               if (SnakeNStar[FX][FY / 2] != 1)
               {
                  SnakeNStar[FX][FY / 2] = 2;
                  gotoxy(FY, FX);
                  textcolor(14);
                  printf("
");
                  break;
               }
               else
               {
                  FX = rand() % 38 + 1;
                  FY = (rand() % 38 + 1) * 2;
               }
            }
         }
         else
         {
            if (height == 146)
            {
               system("cls");
               return;
            }
            SnakeNStar[width][height / 2] = 0;
            gotoxy(height, width);
            printf("  ");
            SnakeNStar[width][(height += 2) / 2] = 1;
            gotoxy(height, width);
            textcolor(12);
            printf("
");
         }
      }
      Sleep(60);
   }
}

 

void makestar()
{

 

}

 

int interface01()
{
   int updown = 1;
   int x = 10, y = 5;
   gotoxy(x, y);

 

   system("cls");
   fflush(stdin);

 

   system("color 0b"); //색 변경
   int i;
   system("cls");
   printf("
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
   for (i = 1; i<39; i++)
   {
      printf("
                                                                                                                                                  ");
   }
   printf("
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
   // 맵
   textcolor(15);
   gotoxy(70, 10);
   printf(" SNAKE GAME\n");
   gotoxy(73, 13);
   printf(" MEUN\n");
   gotoxy(70, 16);
   printf(" GAME START \n");
   gotoxy(73, 17);
   printf(" EXIT \n");
   gotoxy(65, 16);
   printf("
");
   //
게임 시작 화면 인터페이스
   while (1)
   {
      switch (_getch())
      {
      case UP:
         updown = 1;
         gotoxy(65, 17);
         printf("  ");
         gotoxy(65, 16);
         printf("
");
         break;

 

      case DOWN:
         updown = 2;
         gotoxy(65, 16);
         printf("  ");
         gotoxy(65, 17);
         printf("
");
         break;
         //  game start , exit 선택
      case ENTER:
         if (updown == 1)
         {
            system("cls");
            return 1;
         }
         else
         {
            system("cls");
            gotoxy(70, 18);
            printf("안녕히
가세요\n");
            Sleep(1000);
            exit(0);

 

         }
      }
   }
}

 

//////////////////////////////////////////////////
void main()
{
   system("mode con: cols=150 lines=41"); //창 화면 크
   setcursortype(NOCURSOR);
   while (1)
   {
      if (interface01())
      {
         printmap();
         play();
      }
      else
      {
         break;
      }
   }
}

 

 


수정된 부분

  • 벽에 닿으면 죽음
  • 커서 제거
  • 먹이와 뱀의 색깔 구분

 

새로운 오류 발견


  • 게임 진행 중 먹이가 갑자기 한 개 더 생기는 오류(원인 불명)

다음 목표

  • 뱀의 길이 증가
  •  ending 화면 생성
  • 뱀 한 마리 더 추가
  • 먹이 생성 범위 증가


'C언어' 카테고리의 다른 글

C언어 로또 프로그램 만들기  (0) 2015.08.26
C언어 게임 만들기(5일차)  (0) 2015.08.26
C언어 게임 만들기(4일차)  (0) 2015.08.26
C언어 게임 만들기(2일차)  (0) 2015.08.26
C언어 게임 만들기(1일차)  (0) 2015.08.26
블로그 이미지

토유

개발일지

,