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 |