imported>miura0806 |
|
| Line 1: |
Line 1: |
| * 2013년 10월 22일 개발
| | DeleteThisPage |
| #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);
| |
| }
| |
| }
| |
| } //버블정렬 알고리즘
| |
| }
| |
| -----
| |
| [[최다인]]
| |
|
| |
|