#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996) //scanf 등의 함수로 인해 뜨는 4996에러를 무시함
char puz_arr[17][42]; //퍼즐판 위의 모든 단어를 저장하는 배열([0]은 입력된 단어가 겹치지 않게 넣는 것의 편의성을 위함, [16]과 [41]은 단어가 뚫고나가지 않게 함을 위함)
char input_word[100][15]; //차례로 입력되는 단어를 각각 저장하는 배열
void puz_board(); //퍼즐판을 출력하는 함수
void place_word(int word_num); //입력받은 단어를 puz_arr에 규칙에 맞게 배치하는 함수
void order_word(int word_num);
int main()
{
int i,word_num;
for(i=0;i<656;i++)
puz_arr[i/41][i%41] = ' ';
for(i=0;i>1500;i++)
input_word[i/15][i%15] = ' '; //각각 배열을 모두 ' '로 초기화
for(i=0;i<42;i++)
puz_arr[16][i] = '!';
for(i=0;i<17;i++)
puz_arr[i][41] = '!'; //단어가 뚫고나가는 것을 막기 위해 만든 배열의 끝부분은 !로 초기화
printf("☆Cross Puzzle Game☆\n");
for(word_num=0;;word_num++)
{
puz_board(); //퍼즐판 출력
printf("단어를 입력하세요(최소 2글자, 최대 15글자, end 입력시 종료됨) : ");
scanf("%s",input_word+word_num);
if(strlen(input_word[word_num])<2 || strlen(input_word[word_num])>15)
{
printf("최소 2글자, 최대 15글자의 단어를 입력해주세요.\n");
for(i=0;i<strlen(input_word[word_num]);i++)
input_word[word_num][i] = ' ';
word_num--;
continue;
} //입력 범위를 넘어갔을 경우 입력받은 배열을 초기화하고 다시 반복한다.
for(i=0;i<strlen(input_word[word_num]);i++)
{
if(input_word[word_num][i]<'a' || input_word[word_num][i]>'z')
break;
}
if(i!=strlen(input_word[word_num]))
{
printf("소문자 알파벳의 단어를 입력해주세요.\n");
for(i=0;i<strlen(input_word[word_num]);i++)
input_word[word_num][i] = ' ';
word_num--;
continue;
} //입력받은 단어가 소문자 알파벳이 아닐 경우 입력받은 배열을 초기화하고 다시 반복한다.
if(strcmp(input_word[word_num],"end")==0)
break; //end가 입력되면 반복문을 빠져나감.
place_word(word_num);
}
order_word(word_num);
printf("\n☆입력된 단어들☆\n");
for(i=0;i<word_num;i++)
printf("%s\n",input_word[i]);
system("pause");
return 0;
}
void puz_board()
{
int i,j;
printf("\n");
for(j=1;j<16;j++)
{
for(i=1;i<41;i++)
printf("+-");
printf("+\n");
for(i=1;i<41;i++)
printf("|%c",puz_arr[j][i]);
printf("|\n");
}
for(i=1;i<41;i++)
printf("+-");
printf("+\n\n");
}
void place_word(int word_num)
{
int i,j,k,n;
int word_len; //입력한 단어의 길이를 저장하기 위한 변수
word_len = strlen(input_word[word_num]);
if(word_num==0)
{
for(i=1;i<word_len+1;i++)
puz_arr[1][i] = input_word[word_num][i-1]; //첫번째 단어는 제일 왼쪽 위부터 시작
}
else
{
for(i=1;i<16;i++)
{
for(j=1;j<41;j++)
{
if(input_word[word_num][0] == puz_arr[i][j]) //입력된 단어의 첫 글자와 같은 글자를 찾는다.
{
if(puz_arr[i][j+1]==' ') //찾은 지점의 오른쪽이 빈 공간이라면,
{
if(puz_arr[i][j-1]==' ' && puz_arr[i-1][j+1]==' ' && (puz_arr[i+1][j+1]==' ' || puz_arr[i+1][j+1]=='!') && (puz_arr[i][j+word_len]==' ' || puz_arr[i][j+word_len]=='!')) //단어가 오른쪽으로 들어갈 수 있는지 확인한다.
{
for(k=0;k<word_len;k++)
{
if(puz_arr[i][j+k]!=' ') //단어의 범위 안에 이미 글자가 있다면,
{
if(puz_arr[i][j+k]==input_word[word_num][k]) //그 글자가 단어의 글자와 어울릴 수 있는지 확인한다.
continue;
else
break;
}
}
if(k==word_len) //search가 무사히 끝났다면
{
for(n=0;n<word_len;n++)
puz_arr[i][j+n] = input_word[word_num][n]; //단어를 오른쪽으로 입력
return;
}
}
}
if(puz_arr[i+1][j]==' ') //찾은 지점의 아래쪽이 빈 공간이라면,
{
if(puz_arr[i-1][j]==' ' && puz_arr[i+1][j-1]==' ' && (puz_arr[i+1][j+1]==' ' || puz_arr[i+1][j+1]=='!') && (puz_arr[i+word_len][j]==' ' || puz_arr[i+word_len][j]=='!')) //단어가 아래쪽으로 들어갈 수 있는지 확인
{
for(k=0;k<word_len;k++)
{
if(puz_arr[i+k][j]!=' ') //단어의 범위 안에 이미 글자가 있다면,
{
if(puz_arr[i+k][j]==input_word[word_num][k]) //그 글자가 단어의 글자와 어울릴 수 있는지 확인한다.
continue;
else
break;
}
}
if(k==word_len) //search가 무사히 끝났다면
{
for(n=0;n<word_len;n++)
puz_arr[i+n][j] = input_word[word_num][n]; //단어를 아래쪽으로 입력
return;
}
}
}
else
continue;
}
}
}
if(i==16 && j==41) //넣을 자리를 찾지 못한 경우,
{
for(i=1;i<16;i++)
{
for(j=1;j<41;j++)
{
if(puz_arr[i][j]==' ') //빈 공간을 찾아
{
for(k=0;k<word_len+3;k++)
{
if(puz_arr[i][j+k]==' ' && puz_arr[i-1][j+k]==' ' && puz_arr[i+1][j+k]==' ') //빈 공간의 오른쪽으로 단어가 들어갈 충분한 넓이가 되는지 확인
continue;
else
break;
}
if(k==word_len+3) //만약 충분한 공간이 남아있다면,
{
for(n=0;n<word_len;n++)
puz_arr[i][j+n+3] = input_word[word_num][n]; //단어를 오른쪽으로 입력
return;
}
else
continue; //그렇지 않다면 계속 찾는다.
}
}
}
if(i==16 && j==41) //그래도 넣을 자리를 찾지 못한 경우,
{
printf("단어를 넣을 자리가 없습니다. 다른 단어를 입력해주세요.\n");
return;
}
}
}
}
void order_word(int word_num)
{
int i,j;
char temp[15];
for(i=0;i<word_num;i++)
{
for(j=0;j<word_num-i-1;j++)
{
if(strcmp(input_word[j],input_word[j+1])>0)
{
strcpy(temp,input_word[j]);
strcpy(input_word[j],input_word[j+1]);
strcpy(input_word[j+1],temp);
}
}
} //버블정렬 알고리즘
}