c로짠 사다리 게임 예제
/*########################################################################
프로그램명 : 사다리 게임
파일 : ladder.c
########################################################################*/
#include
#include
#include
#include
#define NUMOFLINE 7 // 사다리의 세로줄 수
#define INTERVAL 4 // 사다리의 세로줄 사이의 간격
#define LENGTH 20 // 사다리의 세로 길이
/*########################################################################
함수 선언부
########################################################################*/
void GameStart(); // 사다리 게임 시작 화면을 보여주는 함수
void GameInfo(); // 사다리 게임 정보를 보여주는 함수
void InitRawMap(); // 사다리 초기화 함수
void SetRawPoint(); // 사다리의 계단을 놓을 지점을 정하는 함수
void SetLineMap(); // 사다리의 LineMap을 설정하는 함수
int ClimbLadder(int line); // 줄번호를 받아서 사다리를 타는 함수
void ShowMap(); // 사다리를 보여주는 함수
/*########################################################################
전역변수 선언부
########################################################################*/
// 사다리 게임의 승자 또는 패자가 될 수 있는 목적지를 결정하는 변수
int Hole = 0;
int Hole_Match = 0;
// 사다리의 계단이 들어갈 지점들
int RawMap[LENGTH][NUMOFLINE - 1];
// 사다리를 어떤 라인으로 그릴지
int LineMap[LENGTH][NUMOFLINE];
// 사다리를 그리기 위한 변수를 배열로 선언
// ◆ : ㅂ 혹은 ㅁ 을 누르고 한자키를 누르면 입력가능
char *Map_Line[] = { " “, “┣”, “┫”, “━”, “┃”, “◆”, “◆”};
// Map_Line과 대응하는 개념에 번호를 설정
enum { BLANK, RIGHT, LEFT, HOR, VER, FLOW_DOWN, FLOW_EDGE};
/*########################################################################
함수 구현부
########################################################################*/
int main()
{
int line; // 사다리 시작점의 라인 번호
char c; // 사용자의 입력을 받아들일 문자 변수
srand((unsigned)time(NULL));
// 게임 시작 준비 화면
while(1)
{
GameStart();
c = getch();
if(c==‘y’||c==‘Y’)
{
printf(“이제 게임을 시작하도록 하겠습니다.n”);
Hole = rand()%(NUMOFLINE);
// 사다리의 계단이 놓일 지점 지정
SetRawPoint();
// 사다리의 LineMap을 설정하는 함수
SetLineMap();
printf(“1과 7사이의 숫자를 선택해주세요. 선택한 번호대로 사다리를 타게 됩니다.n”);
// display map
ShowMap();
break;
}
else if(c==‘q’||c==‘Q’)
{
return 1;
}
}
while(1)
{
c = getch();
line = c - ‘0’;
// 사다리 번호 안의 수가 들어왔을 때
if(line>=1 && line<=NUMOFLINE)
{
printf("%dn”,line–);
Hole_Match = ClimbLadder(line);
ShowMap();
SetLineMap();
if (Hole_Match==Hole)
{
printf("%d에서 시작한 사람이 당첨!n",line+1);
}
else
{
printf(“당신은 %d번에서 출발했습니다.n”, line+1);
}
}
// 새로운 사다리의 생성
else if(c==‘n’||c==‘N’)
{
Hole = rand()%(NUMOFLINE);
system(“cls”);
InitRawMap();
SetRawPoint();
SetLineMap();
ShowMap();
}
// 게임 정보 보기
else if(c==‘i’||c==‘I’)
{
GameInfo();
}
// 게임 종료
else if(c==‘q’||c==‘Q’)
{
printf(“게임이 끝났습니다.n”);
break;
}
// 잘못된 명령어에 대한 처리
else
{
printf(“잘못된 명령어입니다.n”);
}
if(c!=‘i’&&c!=‘I’)
{
printf("[게임 정보 : i 또는 I] [게임 종료 : q 또는 Q] n");
}
}
return 1;
}
/*/////////////////////////////////////////////////////////////////////////
사다리 게임 시작 화면을 보여주는 함수
/////////////////////////////////////////////////////////////////////////*/
void GameStart()
{
system(“cls”);
printf(" ***************************** n");
printf(" * C로 만든 사다리 게임 ^^ * n");
printf(" ***************************** n");
printf(" ###### 게임 조작 설명 ####### n");
printf(" # 1. 게임 시작 : y또는 Y # n");
printf(" # 2. 새 게임 : n 또는 N # n");
printf(" # 3. 게임 정보 : i 또는 I # n");
printf(" # 4. 게임 종료 : q 또는 Q # n");
printf(" ############################# n");
printf(“n 게임을 시작하시려면 y또는 Y를 눌러주세요.n”);
}
/*/////////////////////////////////////////////////////////////////////////
사다리 게임 정보를 보여주는 함수
/////////////////////////////////////////////////////////////////////////*/
void GameInfo()
{
system(“cls”);
printf(" ***************************** n");
printf(" * 사다리 게임 정보 * n");
printf(" ***************************** n");
printf(" ###### 게임 조작 설명 ####### n");
printf(" # 1. 게임 시작 : y또는 Y # n");
printf(" # 2. 새 게임 : n 또는 N # n");
printf(" # 3. 게임 정보 : i 또는 I # n");
printf(" # 4. 게임 종료 : q 또는 Q # n");
printf(" ############################# n");
printf(“n 게임으로 다시 돌아가시려면 출발 번호 중 하나를 눌러주세요.n”);
}
/*/////////////////////////////////////////////////////////////////////////
사다리 초기화 함수
/////////////////////////////////////////////////////////////////////////*/
void InitRawMap()
{
int i,j;
for(i=0; i {
for(j=0; j {
RawMap[i][j] = 0;
}
}
}
/*/////////////////////////////////////////////////////////////////////////
사다리 초기화 함수
/////////////////////////////////////////////////////////////////////////*/
void SetRawPoint()
{
int i,j;
int count;
int rand_temp = 0;
// 사다리의 다리가 놓이는 점을 임의로 정합니다.
for(i=2; i {
rand_temp = rand() % (NUMOFLINE - 1);
// 사다리의 다리를 놓을 얖 옆에 이미 놓여진 다리가 없다면
// 다리를 놓도록 합니다.
if(RawMap[i][rand_temp-1]==0 && RawMap[i][rand_temp+1]==0)
{
RawMap[i][rand_temp] = 1;
}
}
// 사다리의 모든 줄을 검색하여 하나라도 사다리가 그어지지 않은 공간이 있다면
// 사다리를 만들어주도록 합니다.
for(j=0;j {
count = 0;
for(i=2; i {
if(RawMap[i][j] == 1)
{
count++;
}
}
rand_temp = rand() % 4;
if (rand_temp==0)
{
rand_temp = 1;
}
if(count==0)
{
for (i=2;i {
if((RawMap[i][j-1]==0 && RawMap[i][j+1]==0))
{
RawMap[i][j] = 1;
}
}
}
}
}
/*/////////////////////////////////////////////////////////////////////////
사다리의 계단을 놓을 지점을 정하는 함수
/////////////////////////////////////////////////////////////////////////*/
void SetLineMap()
{
int i, j;
// 사다리의 줄기에 대한 정보를 입력하기 위한 루프
for(i=0; i {
for(j=0; j {
LineMap[i][j] = VER;
}
}
// 사다리의 다리에 대한 정보를 입력하기 위한 루프
for(i=0; i {
for(j=0; j {
if(RawMap[i][j]==1)
{
LineMap[i][j] = RIGHT;
LineMap[i][j+1] = LEFT;
}
}
}
}
/*/////////////////////////////////////////////////////////////////////////
줄번호를 받아서 사다리를 타는 함수
/////////////////////////////////////////////////////////////////////////*/
int ClimbLadder(int line)
{
int i;
for(i=0; i {
switch(LineMap[i][line])
{
case RIGHT:
LineMap[i][line++] = FLOW_EDGE;
LineMap[i][line] = FLOW_DOWN;
break;
case LEFT:
LineMap[i][line–] = FLOW_DOWN;
LineMap[i][line] = FLOW_EDGE;
break;
default:
LineMap[i][line] = FLOW_DOWN;
}
}
return line;
}
/*/////////////////////////////////////////////////////////////////////////
사다리를 보여주는 함수
/////////////////////////////////////////////////////////////////////////*/
void ShowMap()
{
// 루프 변수
int i, j, k, stair;
stair=BLANK;
// 사다리 시작 번호를 나타내는 루프
for(i=0; i {
printf(" %d", i+1);
for(k=0; k {
printf("%s", Map_Line[stair]);
}
}
printf(“n”);
// 사다리 본체를 그리는 루프
for(i=0; i {
for(j=0; j {
printf("%s", Map_Line[LineMap[i][j]]);
stair=BLANK;
if(LineMap[i][j]==RIGHT)
{
stair=HOR;
}
if(LineMap[i][j]==FLOW_EDGE)
{
stair=FLOW_EDGE;
}
for(k=0; k {
printf("%s", Map_Line[stair]);
}
}
printf(“n”);
}
// 사다리 목적지를 나타내는 루프
for(i=0; i {
if(i==Hole)
{
printf(" X");
}
else
{
printf("