#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
int score=0; //-> 전역 변수로 설정
#define UP 72
#define LEFT 75
#define RIGHT 77
#define DOWN 80
#define SUP 119;
#define SLEFT 97;
#define SDOWN 115;
#define SRIGHT 100;
#define ENTER 13
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 textcolor(int color_number) //텍스트 칼라를 바꿔주는 함수
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color_number);
}
void gotoxy(int x, int y)
{
COORD pos = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void printmap()
{
system("mode con: cols=81 lines=41");
int i;
system("cls");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■\n");
for (i = 1; i<39; i++)
{
printf("■ ■\n");
}
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
}
void play()
{
int direction = UP;
int Y = 19;
int X = 70;
int TX = 70;
int TY = 19;
int Fheight, Fwidth;
int eat = 0;
int SnakeNStar[40][40] = { 0 };
int UDRL[40][40] = { 0 };
SnakeNStar[Y][X / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
while (1)
{
if (eat == 0)
{
srand((unsigned)time(NULL));
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
SnakeNStar[Fheight][Fwidth / 2] = 2;
gotoxy(Fwidth, Fheight);
textcolor(14);
printf("★");
eat++;
}
fflush(stdin);
if (_kbhit())
{
do
{
direction = _getch();
} while (direction == 224);
}
if (direction == UP)
{
UDRL[Y][X / 2] = direction;
if (SnakeNStar[Y - 1][X / 2] == 2) // 만약 다음에 움직일 칸이 먹이라면
{
//SnakeNStar[Y][X / 2] = 0; // 일단 현재칸을 0으로 만들고
//gotoxy(X, Y); // 커서를 현재칸에 옮긴 뒤
//printf(" "); // 공백을 채워준다.
SnakeNStar[--Y][X / 2] = 1; // 그리고 움직일 칸에 이동해서 1
gotoxy(X, Y); // 커서를 움직일 칸에 이동 후
textcolor(12);
printf("■"); // Snake를 그려줌
Fheight = rand() % 38 + 1; // 세로 랜덤값을 만들고
Fwidth = (rand() % 38 + 1) * 2; // 가로 랜덤값을 만듬
score++;
while (1) // 먹이가 생성될 때 까지 무한반복
{
if (SnakeNStar[Fheight][Fwidth / 2] != 1) // 먹이가 생성될 자리가 공백이면
{
SnakeNStar[Fheight][Fwidth / 2] = 2; // 먹이값을 채워준다.
gotoxy(Fwidth, Fheight); // 먹이 포인터를 이동한 후
textcolor(14);
printf("★"); // 먹이를 그림
break;
}
else // 먹이가 생성될 자리가 공백이 아니면
{
Fheight = rand() % 38 + 1; // 랜덤함수를 계속 돌린다.
Fwidth = (rand() % 38 + 1) * 2;
}
}
}
else if (SnakeNStar[Y - 1][X / 2] == 1) // 내 몸에 부딫히면 뒤짐
{
system("cls");
return;
}
else // 다음에 움직이는 칸이 공백이면
{
if (Y == 1) // 뒤지는 거
{
system("cls");
return;
}
SnakeNStar[TY][TX / 2] = 0; // 현재칸을 공백값으로 만들고
gotoxy(TX, TY); // 커서를 꼬리칸으로 이동
printf(" "); // 공백을 채워줌
if (UDRL[TY][TX / 2] == UP)
{
TY--;
}
else if (UDRL[TY][TX / 2] == DOWN)
{
TY++;
}
else if (UDRL[TY][TX / 2] == RIGHT)
{
TX += 2;
}
else if (UDRL[TY][TX / 2] == LEFT)
{
TX -= 2;
}
SnakeNStar[--Y][X / 2] = 1; // 다음에 움직이는 칸에 뱀값을 집어넣고
gotoxy(X, Y); // 커서를 다음칸으로 이동
textcolor(12);
printf("■"); // 뱀을 그려준다.
}
}
else if (direction == DOWN)
{
UDRL[Y][X / 2] = direction;
if (SnakeNStar[Y + 1][X / 2] == 2)
{
//SnakeNStar[Y][X / 2] = 0;
//gotoxy(X, Y);
//printf(" ");
SnakeNStar[++Y][X / 2] = 0;
gotoxy(X, Y);
textcolor(12);
printf("■");
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
score
while (1)
{
if (SnakeNStar[Fheight][Fwidth / 2] != 1)
{
SnakeNStar[Fheight][Fwidth / 2] = 2;
gotoxy(Fwidth, Fheight);
textcolor(14);
printf("★");
break;
}
else
{
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
}
}
}
else if (SnakeNStar[Y + 1][X / 2] == 1)
{
system("cls");
return;
}
else
{
if (Y == 38)
{
system("cls");
return;
}
SnakeNStar[TY][TX / 2] = 0; // 현재칸을 공백값으로 만들고
gotoxy(TX, TY); // 커서를 현재칸으로 이동
printf(" "); // 공백을 채워줌
if (UDRL[TY][TX / 2] == UP)
{
TY--;
}
else if (UDRL[TY][TX / 2] == DOWN)
{
TY++;
}
else if (UDRL[TY][TX / 2] == RIGHT)
{
TX += 2;
}
else if (UDRL[TY][TX / 2] == LEFT)
{
TX -= 2;
}
SnakeNStar[++Y][X / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
}
}
else if (direction == LEFT)
{
UDRL[Y][X / 2] = direction;
if (SnakeNStar[Y][(X - 2) / 2] == 2)
{
//SnakeNStar[Y][X / 2] = 0;
//gotoxy(X, Y);
//printf(" ");
SnakeNStar[Y][(X -= 2) / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
score++;
while (1)
{
if (SnakeNStar[Fheight][Fwidth / 2] != 1)
{
SnakeNStar[Fheight][Fwidth / 2] = 2;
gotoxy(Fwidth, Fheight);
textcolor(14);
printf("★");
break;
}
else
{
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
}
}
}
else if (SnakeNStar[Y][(X - 2) / 2] == 1)
{
system("cls");
return;
}
else
{
if (X == 2)
{
system("cls");
return;
}
SnakeNStar[TY][TX / 2] = 0; // 현재칸을 공백값으로 만들고
gotoxy(TX, TY); // 커서를 현재칸으로 이동
printf(" "); // 공백을 채워줌
if (UDRL[TY][TX / 2] == UP)
{
TY--;
}
else if (UDRL[TY][TX / 2] == DOWN)
{
TY++;
}
else if (UDRL[TY][TX / 2] == RIGHT)
{
TX += 2;
}
else if (UDRL[TY][TX / 2] == LEFT)
{
TX -= 2;
}
SnakeNStar[Y][(X -= 2) / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
}
}
if (direction == RIGHT)
{
UDRL[Y][X / 2] = direction;
if (SnakeNStar[Y][(X + 2) / 2] == 2)
{
//SnakeNStar[Y][X / 2] = 0;
//gotoxy(X, Y);
//printf(" ");
SnakeNStar[Y][(X += 2) / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
score++;
while (1)
{
if (SnakeNStar[Fheight][Fwidth / 2] != 1)
{
SnakeNStar[Fheight][Fwidth / 2] = 2;
gotoxy(Fwidth, Fheight);
textcolor(14);
printf("★");
break;
}
else
{
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
}
}
}
else if (SnakeNStar[Y][(X + 2) / 2] == 1)
{
system("cls");
return;
}
else
{
if (X == 76)
{
system("cls");
return;
}
SnakeNStar[TY][TX / 2] = 0; // 현재칸을 공백값으로 만들고
gotoxy(TX, TY); // 커서를 현재칸으로 이동
printf(" "); // 공백을 채워줌
if (UDRL[TY][TX / 2] == UP)
{
TY--;
}
else if (UDRL[TY][TX / 2] == DOWN)
{
TY++;
}
else if (UDRL[TY][TX / 2] == RIGHT)
{
TX += 2;
}
else if (UDRL[TY][TX / 2] == LEFT)
{
TX -= 2;
}
SnakeNStar[Y][(X += 2) / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
}
}
Sleep(90);
}
}
/*void makestar()
{
}*/
int interface01()
{
system("mode con: cols=150 lines=41");
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("1인용");
gotoxy(73, 18);
printf("2인용(미완성)");
gotoxy(73, 19);
printf(" EXIT \n");
gotoxy(65, 17);
printf("▶");
// 게임 시작 화면 인터페이스
while (1)
{
switch (_getch())
{
case UP:
gotoxy(65, 16 + updown);
printf(" ");
if (updown > 1)
{
updown--;
}
gotoxy(65, 16 + updown);
printf("▶");
break;
case DOWN:
gotoxy(65, 16 + updown);
printf(" ");
if (updown < 3)
{
updown++;
}
gotoxy(65, 16 + updown);
printf("▶");
break;
// game start , exit 선택
case ENTER:
if (updown == 1)
{
system("cls");
return 1;
}
else if (updown == 2)
{
system("cls");
return 2;
}
else
{
system("cls");
gotoxy(70, 18);
printf("안녕히가세요\n");
Sleep(1000);
exit(0);
}
//게임시작
}
}
}
void play2()
{
/////////////////////////////////////////////////////////////1p
int direction = UP;
int Y = 19;
int X = 70;
int TX = 70;
int TY = 19;
int Fheight, Fwidth;
int eat = 0;
int SnakeNStar[40][40] = { 0 };
int UDRL[40][40] = { 0 };
SnakeNStar[Y][X / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
while (1)
{
if (eat == 0)
{
srand((unsigned)time(NULL));
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
SnakeNStar[Fheight][Fwidth / 2] = 2;
gotoxy(Fwidth, Fheight);
textcolor(14);
printf("★");
eat++;
}
fflush(stdin);
if (_kbhit())
{
do
{
direction = _getch();
} while (direction == 224);
}
if (direction == UP)
{
UDRL[Y][X / 2] = direction;
if (SnakeNStar[Y - 1][X / 2] == 2) // 만약 다음에 움직일 칸이 먹이라면
{
//SnakeNStar[Y][X / 2] = 0; // 일단 현재칸을 0으로 만들고
//gotoxy(X, Y); // 커서를 현재칸에 옮긴 뒤
//printf(" "); // 공백을 채워준다.
SnakeNStar[--Y][X / 2] = 1; // 그리고 움직일 칸에 이동해서 1
gotoxy(X, Y); // 커서를 움직일 칸에 이동 후
textcolor(12);
printf("■"); // Snake를 그려줌
Fheight = rand() % 38 + 1; // 세로 랜덤값을 만들고
Fwidth = (rand() % 38 + 1) * 2; // 가로 랜덤값을 만듬
while (1) // 먹이가 생성될 때 까지 무한반복
{
if (SnakeNStar[Fheight][Fwidth / 2] != 1) // 먹이가 생성될 자리가 공백이면
{
SnakeNStar[Fheight][Fwidth / 2] = 2; // 먹이값을 채워준다.
gotoxy(Fwidth, Fheight); // 먹이 포인터를 이동한 후
textcolor(14);
printf("★"); // 먹이를 그림
break;
}
else // 먹이가 생성될 자리가 공백이 아니면
{
Fheight = rand() % 38 + 1; // 랜덤함수를 계속 돌린다.
Fwidth = (rand() % 38 + 1) * 2;
}
}
}
else // 다음에 움직이는 칸이 공백이면
{
if (Y == 1) // 죽는 것
{
system("cls");
return;
}
//SnakeNStar[Y][X / 2] = 1; // 현재칸을 공백값으로 만들고
gotoxy(TX, TY); // 커서를 꼬리칸으로 이동
printf(" "); // 공백을 채워줌
if (UDRL[TY][TX / 2] == UP)
{
TY--;
}
else if (UDRL[TY][TX / 2] == DOWN)
{
TY++;
}
else if (UDRL[TY][TX / 2] == RIGHT)
{
TX += 2;
}
else if (UDRL[TY][TX / 2] == LEFT)
{
TX -= 2;
}
SnakeNStar[--Y][X / 2] = 1; // 다음에 움직이는 칸에 뱀값을 집어넣고
gotoxy(X, Y); // 커서를 다음칸으로 이동
textcolor(12);
printf("■"); // 뱀을 그려준다.
}
}
else if (direction == DOWN)
{
UDRL[Y][X / 2] = direction;
if (SnakeNStar[Y + 1][X / 2] == 2)
{
//SnakeNStar[Y][X / 2] = 0;
//gotoxy(X, Y);
//printf(" ");
SnakeNStar[++Y][X / 2] = 0;
gotoxy(X, Y);
textcolor(12);
printf("■");
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
while (1)
{
if (SnakeNStar[Fheight][Fwidth / 2] != 1)
{
SnakeNStar[Fheight][Fwidth / 2] = 2;
gotoxy(Fwidth, Fheight);
textcolor(14);
printf("★");
break;
}
else
{
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
}
}
}
else
{
if (Y == 38)
{
system("cls");
return;
}
//SnakeNStar[Y][X / 2] = 0; // 현재칸을 공백값으로 만들고
gotoxy(TX, TY); // 커서를 현재칸으로 이동
printf(" "); // 공백을 채워줌
if (UDRL[TY][TX / 2] == UP)
{
TY--;
}
else if (UDRL[TY][TX / 2] == DOWN)
{
TY++;
}
else if (UDRL[TY][TX / 2] == RIGHT)
{
TX += 2;
}
else if (UDRL[TY][TX / 2] == LEFT)
{
TX -= 2;
}
SnakeNStar[++Y][X / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
}
}
else if (direction == LEFT)
{
UDRL[Y][X / 2] = direction;
if (SnakeNStar[Y][(X - 2) / 2] == 2)
{
//SnakeNStar[Y][X / 2] = 0;
//gotoxy(X, Y);
//printf(" ");
SnakeNStar[Y][(X -= 2) / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
while (1)
{
if (SnakeNStar[Fheight][Fwidth / 2] != 1)
{
SnakeNStar[Fheight][Fwidth / 2] = 2;
gotoxy(Fwidth, Fheight);
textcolor(14);
printf("★");
break;
}
else
{
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
}
}
}
else
{
if (X == 2)
{
system("cls");
return;
}
//SnakeNStar[Y][X / 2] = 0; // 현재칸을 공백값으로 만들고
gotoxy(TX, TY); // 커서를 현재칸으로 이동
printf(" "); // 공백을 채워줌
if (UDRL[TY][TX / 2] == UP)
{
TY--;
}
else if (UDRL[TY][TX / 2] == DOWN)
{
TY++;
}
else if (UDRL[TY][TX / 2] == RIGHT)
{
TX += 2;
}
else if (UDRL[TY][TX / 2] == LEFT)
{
TX -= 2;
}
SnakeNStar[Y][(X -= 2) / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
}
}
if (direction == RIGHT)
{
UDRL[Y][X / 2] = direction;
if (SnakeNStar[Y][(X + 2) / 2] == 2)
{
//SnakeNStar[Y][X / 2] = 0;
//gotoxy(X, Y);
//printf(" ");
SnakeNStar[Y][(X += 2) / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
while (1)
{
if (SnakeNStar[Fheight][Fwidth / 2] != 1)
{
SnakeNStar[Fheight][Fwidth / 2] = 2;
gotoxy(Fwidth, Fheight);
textcolor(14);
printf("★");
break;
}
else
{
Fheight = rand() % 38 + 1;
Fwidth = (rand() % 38 + 1) * 2;
}
}
}
else
{
if (X == 146)
{
system("cls");
return;
}
//SnakeNStar[Y][X / 2] = 0; // 현재칸을 공백값으로 만들고
gotoxy(TX, TY); // 커서를 현재칸으로 이동
printf(" "); // 공백을 채워줌
if (UDRL[TY][TX / 2] == UP)
{
TY--;
}
else if (UDRL[TY][TX / 2] == DOWN)
{
TY++;
}
else if (UDRL[TY][TX / 2] == RIGHT)
{
TX += 2;
}
else if (UDRL[TY][TX / 2] == LEFT)
{
TX -= 2;
}
SnakeNStar[Y][(X += 2) / 2] = 1;
gotoxy(X, Y);
textcolor(12);
printf("■");
}
}
Sleep(90);
}
//////////////////////////////////////////////////////////2p
}
void printmap2()
{
system("mode con: cols=150 lines=41");
int i;
system("cls");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
for (i = 1; i<39; i++)
{
printf("■ ■");
}
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
}
void ending()
{
system("color 0b");
int updown = 1;
system("mode con: cols=150 lines=41");
int i;
system("cls");
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
for (i = 1; i < 39; i++)
{
printf("■ ■");
}
printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");
gotoxy(74, 13);
printf("점수 : %d",score);
score = 0;
gotoxy(68, 15);
printf("재시작 하시겠습니까?");
gotoxy(75, 16);
printf("EXIT");
gotoxy(65, 15);
printf("▶");
////
while (1)
{
switch (_getch())
{
case UP:
updown = 1;
gotoxy(65, 16);
printf(" ");
gotoxy(65, 15);
printf("▶");
break;
case DOWN:
updown = 2;
gotoxy(65, 15);
printf(" ");
gotoxy(65, 16);
printf("▶");
break;
// game start , exit 선택
case ENTER:
if (updown == 1)
{
system("cls");
return ;
}
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)
{
int RETN = interface01();
if (RETN == 1)
{
printmap();
play();
ending(); -> 새로 추가한 함수
}
else if (RETN == 2)
{
printmap2();
play2();
}
else if (RETN == 3)
break;
}
}