imported>miura0806 |
|
| (One intermediate revision by one other user not shown) |
| Line 1: |
Line 1: |
| * 2013년 10월 22일 개발
| | DeleteThisPage |
| #include <stdio.h>
| |
| #include <stdlib.h>
| |
| #include <time.h>
| |
|
| |
| void tet_board(int tet_table[9][8], int *ptr_sco); //테트리스 판을 출력하는 함수. 현재 테트리스 판의 상태와 점수를 입력
| |
| void block1(int tet_table[9][8]);
| |
| void block2(int tet_table[9][8]);
| |
| void block3(int tet_table[9][8]);
| |
| void block4(int tet_table[9][8]);
| |
| void block5(int tet_table[9][8]); //총 5개의 블록이 있으므로 각각 함수를 만들어 실행될 수 있도록 함.
| |
| int End(int tet_table[9][8], int *ptr_sco); //블록을 놓은 후 점수 갱신, 판 정리, 종료여부 판별을 위한 함수.
| |
|
| |
|
| |
| int main()
| |
| {
| |
| int i, block, score=0; //몇번째 블록이 나올지를 저장하는 block변수와 점수의 score변수.
| |
| int *ptr_sco=&score; //다른 함수에서 쓰기 위해 포인터 ptr_sco 변수를 만들어 score변수를 가리키게 한다.
| |
| int tet_table[9][8]; //현재 테트리스 판의 상태. 8X8인데 [9][8]로 지정한 이유는 종료 판별을 위해.
| |
|
| |
| srand(time(NULL)); //rand함수를 좀 더 안정적으로 사용하기 위해 time함수로 seed를 지정해준다.
| |
|
| |
| for(i=0;i<80;i++)
| |
| tet_table[i/9][i%8]=0; //테트리스판의 상태를 전부 0으로 초기화해준다.
| |
|
| |
| while(1) //무한반복
| |
| {
| |
| tet_board(tet_table, ptr_sco); //테트리스 판을 출력해준다.
| |
|
| |
| block = rand()%5; //몇번째 블록이 나올지 rand함수를 이용해 랜덤하게 설정.
| |
|
| |
| switch(block){
| |
| case 0:
| |
| block1(tet_table);
| |
| break; //0이 나올 경우 첫번째 블록을,
| |
| case 1:
| |
| block2(tet_table);
| |
| break; //1이 나올 경우 2번째 블록을,
| |
| case 2:
| |
| block3(tet_table);
| |
| break;
| |
| case 3:
| |
| block4(tet_table);
| |
| break;
| |
| case 4:
| |
| block5(tet_table);
| |
| break; //나머지 경우에도 동일하게 진행한다.
| |
| default:
| |
| break;
| |
| }
| |
|
| |
| if(End(tet_table,ptr_sco)==0) //만약 End함수가 0으로 리턴된다면
| |
| {
| |
| tet_board(tet_table, ptr_sco);
| |
| printf("게임이 종료되었습니다.\n"); //판의 상태를 출력하고 게임을 종료한다.
| |
|
| |
| system("pause");
| |
| return 0;
| |
| }
| |
| else
| |
| continue; //그렇지 않을 경우 다시 반복한다.
| |
| }
| |
|
| |
| return 0;
| |
| }
| |
|
| |
| void tet_board(int tet_table[9][8], int *ptr_sco)
| |
| {
| |
| int i, k;
| |
|
| |
| printf("12345678\n");
| |
| for(i=1;i<9;i++) //tet_table[0]은 종료 판별을 위해 넣어놓은 부분이므로 출력하지 않는다.
| |
| {
| |
| for(k=0;k<8;k++)
| |
| {
| |
| if(tet_table[i][k]==0)
| |
| printf("□");
| |
| else if(tet_table[i][k]==1)
| |
| printf("■"); //테트리스 판 배열에 저장된 값이 0일 경우 빈 네모를, 1일 경우 색칠된 네모 출력
| |
| }
| |
| printf("\n");
| |
| }
| |
|
| |
| printf("당신의 현재 점수는 %d점입니다.\n",*ptr_sco); //현재 score 출력
| |
| }
| |
|
| |
| void block1(int tet_table[9][8])
| |
| {
| |
| int x=0, i, rotate=2; //블록을 놓을 x값을 입력받을 변수와, 회전 여부를 판별하는 rotate변수. rotate변수는 처음 for문을 안정적으로 실행하기 위해 0이나 1이 아닌 값으로 초기화해준다.
| |
|
| |
| printf("이번 블록 : ■ 회전시 : ■■■\n");
| |
| printf(" ■■■ ■\n"); //블록의 모양 출력
| |
| for(;x<1||x>6;){
| |
| printf("x 위치는? : ");
| |
| scanf("%d",&x);} //x위치를 입력받되, 1과 6 사이의 값이 아니면 다시 입력받는다. (8X8판이므로 7이상의 값이 들어가면 블록이 들어갈 수 없음)
| |
| for(;rotate!=1&&rotate!=0;){
| |
| printf("회전은(0/1)? : ");
| |
| scanf("%d",&rotate);} //회전 여부를 입력받되, 0과 1이 아니면 다시 입력받는다.
| |
|
| |
| x--; //실제로 배열에서는 [0]이 1의 자리에 들어가므로 입력받은 x값에서 1을 빼준다.
| |
|
| |
| if(rotate==0) //회전을 안 했을 경우
| |
| {
| |
| for(i=1;i<9;i++)
| |
| {
| |
| if(tet_table[i][x]==1 || tet_table[i][x+1]==1 || tet_table[i][x+2]==1) //블록 밑 3칸중 어떤 칸이 1(색칠된 칸)을 만났을 경우
| |
| {
| |
| tet_table[i-1][x]=1;
| |
| tet_table[i-1][x+1]=1;
| |
| tet_table[i-1][x+2]=1;
| |
| tet_table[i-2][x]=1; //그 자리 위로 블록 값을 1로 바꾸고
| |
| break; //종료한다.
| |
| }
| |
| else
| |
| continue; //아닐 경우에 계속 반복한다.
| |
| }
| |
| if(i==9) //맨 밑까지 올 동안 색칠된 네모를 한번도 만나지 못했을 경우
| |
| {
| |
| tet_table[8][x]=1;
| |
| tet_table[8][x+1]=1;
| |
| tet_table[8][x+2]=1;
| |
| tet_table[7][x]=1; //제일 아래 칸에 블록의 모양대로 값을 1로 바꾼다.
| |
| }
| |
| }
| |
|
| |
| else if(rotate==1) //회전을 했을 경우
| |
| {
| |
| for(i=1;i<9;i++)
| |
| {
| |
| if(tet_table[i][x+2]==1 || tet_table[i-1][x]==1 ||tet_table[i-1][x+1]==1)
| |
| {
| |
| tet_table[i-1][x+2]=1;
| |
| tet_table[i-2][x]=1;
| |
| tet_table[i-2][x+1]=1;
| |
| tet_table[i-2][x+2]=1;
| |
| break;
| |
| }
| |
| else
| |
| continue;
| |
| }
| |
| if(i==9)
| |
| {
| |
| tet_table[8][x+2]=1;
| |
| tet_table[7][x]=1;
| |
| tet_table[7][x+1]=1;
| |
| tet_table[7][x+2]=1;
| |
| }
| |
| } //동일하게 진행한다.
| |
| }
| |
|
| |
| void block2(int tet_table[9][8]) //블록 2의 경우에도 블록 1의 경우와 같은 방식으로 진행한다.
| |
| {
| |
| int x=0, i, rotate=2;
| |
|
| |
| printf("이번 블록 : ■ 회전시 : ■■■\n");
| |
| printf(" ■■■ ■\n");
| |
| for(;x<1||x>6;){
| |
| printf("x 위치는? : ");
| |
| scanf("%d",&x);}
| |
| for(;rotate!=1&&rotate!=0;){
| |
| printf("회전은(0/1)? : ");
| |
| scanf("%d",&rotate);}
| |
|
| |
| x--;
| |
|
| |
| if(rotate==0)
| |
| {
| |
| for(i=1;i<9;i++)
| |
| {
| |
| if(tet_table[i][x]==1 || tet_table[i][x+1]==1 || tet_table[i][x+2]==1)
| |
| {
| |
| tet_table[i-1][x]=1;
| |
| tet_table[i-1][x+1]=1;
| |
| tet_table[i-1][x+2]=1;
| |
| tet_table[i-2][x+1]=1;
| |
| break;
| |
| }
| |
| else
| |
| continue;
| |
| }
| |
| if(i==9)
| |
| {
| |
| tet_table[8][x]=1;
| |
| tet_table[8][x+1]=1;
| |
| tet_table[8][x+2]=1;
| |
| tet_table[7][x+1]=1;
| |
| }
| |
| }
| |
|
| |
| else if(rotate==1)
| |
| {
| |
| for(i=1;i<9;i++)
| |
| {
| |
| if(tet_table[i][x+1]==1 || tet_table[i-1][x]==1 || tet_table[i-1][x+2]==1)
| |
| {
| |
| tet_table[i-1][x+1]=1;
| |
| tet_table[i-2][x]=1;
| |
| tet_table[i-2][x+1]=1;
| |
| tet_table[i-2][x+2]=1;
| |
| break;
| |
| }
| |
| else
| |
| continue;
| |
| }
| |
| if(i==9)
| |
| {
| |
| tet_table[8][x+1]=1;
| |
| tet_table[7][x]=1;
| |
| tet_table[7][x+1]=1;
| |
| tet_table[7][x+2]=1;
| |
| }
| |
| }
| |
| }
| |
|
| |
| void block3(int tet_table[9][8]) //블록 3의 경우에도 블록 1의 경우와 같은 방식으로 진행한다.
| |
| {
| |
| int x=0, i, rotate=2;
| |
|
| |
| printf("이번 블록 : ■ 회전시 : ■■\n");
| |
| printf(" ■■ ■■\n");
| |
| printf(" ■\n");
| |
| for(;x<1||x>7;){
| |
| printf("x 위치는? : ");
| |
| scanf("%d",&x);} //다만 이 블록의 경우 x가 7의 값까지 들어갈 수 있으므로 범위를 조정해주고,
| |
| if(x!=7){ //x값이 7일 경우 회전된 블록이 들어갈 수 없기 때문에 굳이 회전 여부를 확인하지 않는다.
| |
| for(;rotate!=1&&rotate!=0;){
| |
| printf("회전은(0/1)? : ");
| |
| scanf("%d",&rotate);}}
| |
| else
| |
| rotate=0; //x값이 7일 때, 회전하지 않은 상태로 진행.
| |
|
| |
| x--;
| |
|
| |
| if(rotate==0)
| |
| {
| |
| for(i=1;i<9;i++)
| |
| {
| |
| if(tet_table[i][x+1]==1 || tet_table[i-1][x]==1)
| |
| {
| |
| tet_table[i-1][x+1]=1;
| |
| tet_table[i-2][x]=1;
| |
| tet_table[i-2][x+1]=1;
| |
| tet_table[i-3][x]=1;
| |
| break;
| |
| }
| |
| else
| |
| continue;
| |
| }
| |
| if(i==9)
| |
| {
| |
| tet_table[8][x+1]=1;
| |
| tet_table[7][x]=1;
| |
| tet_table[7][x+1]=1;
| |
| tet_table[6][x]=1;
| |
| }
| |
| }
| |
|
| |
| else if(rotate==1)
| |
| {
| |
| for(i=1;i<9;i++)
| |
| {
| |
| if(tet_table[i][x]==1 || tet_table[i][x+1]==1 || tet_table[i-1][x+2]==1)
| |
| {
| |
| tet_table[i-1][x]=1;
| |
| tet_table[i-1][x+1]=1;
| |
| tet_table[i-2][x+1]=1;
| |
| tet_table[i-2][x+2]=1;
| |
| break;
| |
| }
| |
| else
| |
| continue;
| |
| }
| |
| if(i==9)
| |
| {
| |
| tet_table[8][x]=1;
| |
| tet_table[8][x+1]=1;
| |
| tet_table[7][x+1]=1;
| |
| tet_table[7][x+2]=1;
| |
| }
| |
| } //나머지는 동일한 형태로 진행한다.
| |
| }
| |
|
| |
| void block4(int tet_table[9][8])
| |
| {
| |
| int x=0, i;
| |
|
| |
| printf("이번 블록 : ■■\n");
| |
| printf(" ■■\n");
| |
| for(;x<1||x>8;){
| |
| printf("x 위치는? : ");
| |
| scanf("%d",&x);} //블록 4의 경우 회전된 형태와 안 한 형태가 같으므로 굳이 회전값을 입력받을 필요가 없다.
| |
|
| |
| x--;
| |
|
| |
| for(i=1;i<9;i++)
| |
| {
| |
| if(tet_table[i][x]==1 || tet_table[i][x+1]==1)
| |
| {
| |
| tet_table[i-1][x]=1;
| |
| tet_table[i-1][x+1]=1;
| |
| tet_table[i-2][x]=1;
| |
| tet_table[i-2][x+1]=1;
| |
| break;
| |
| }
| |
| else
| |
| continue;
| |
| }
| |
| if(i==9)
| |
| {
| |
| tet_table[8][x]=1;
| |
| tet_table[8][x+1]=1;
| |
| tet_table[7][x]=1;
| |
| tet_table[7][x+1]=1;
| |
| }
| |
| } //나머지는 동일.
| |
|
| |
| void block5(int tet_table[9][8]) //블록 5의 경우에도 블록 3과 비슷한 형태로 진행한다.
| |
| {
| |
| int x=0, i, rotate=2;
| |
|
| |
| printf("이번 블록 : ■ 회전시 : ■■■■\n");
| |
| printf(" ■\n");
| |
| printf(" ■\n");
| |
| printf(" ■\n");
| |
| for(;x<1||x>8;){
| |
| printf("x 위치는? : ");
| |
| scanf("%d",&x);}
| |
| if(x<6){
| |
| for(;rotate!=1&&rotate!=0;){
| |
| printf("회전은(0/1)? : ");
| |
| scanf("%d",&rotate);}}
| |
| else
| |
| rotate = 0; //x값이 6 이상일 경우 회전 안한 형태로 자동으로 저장.
| |
|
| |
| x--;
| |
|
| |
| if(rotate==0)
| |
| {
| |
| for(i=1;i<9;i++)
| |
| {
| |
| if(tet_table[i][x]==1)
| |
| {
| |
| tet_table[i-1][x]=1;
| |
| tet_table[i-2][x]=1;
| |
| tet_table[i-3][x]=1;
| |
| tet_table[i-4][x]=1;
| |
| break;
| |
| }
| |
| else
| |
| continue;
| |
| }
| |
| if(i==9)
| |
| {
| |
| tet_table[8][x]=1;
| |
| tet_table[7][x]=1;
| |
| tet_table[6][x]=1;
| |
| tet_table[5][x]=1;
| |
| }
| |
| }
| |
|
| |
| else if(rotate==1)
| |
| {
| |
| for(i=1;i<9;i++)
| |
| {
| |
| if(tet_table[i][x]==1 || tet_table[i][x+1]==1 || tet_table[i][x+2]==1 || tet_table[i][x+3]==1)
| |
| {
| |
| tet_table[i-1][x]=1;
| |
| tet_table[i-1][x+1]=1;
| |
| tet_table[i-1][x+2]=1;
| |
| tet_table[i-1][x+3]=1;
| |
| break;
| |
| }
| |
| else
| |
| continue;
| |
| }
| |
| if(i==9)
| |
| {
| |
| tet_table[8][x]=1;
| |
| tet_table[8][x+1]=1;
| |
| tet_table[8][x+2]=1;
| |
| tet_table[8][x+3]=1;
| |
| }
| |
| }
| |
| } //나머지는 역시 동일.
| |
|
| |
|
| |
| int End(int tet_table[9][8], int *ptr_sco)
| |
| {
| |
| int i, j, x;
| |
|
| |
| for(i=1;i<9;i++)
| |
| {
| |
| if(tet_table[i][0]==1 && tet_table[i][1]==1 && tet_table[i][2]==1 && tet_table[i][3]==1 && tet_table[i][4]==1 && tet_table[i][5]==1 && tet_table[i][6]==1 \
| |
| && tet_table[i][7]==1) //만약 어떤 한 줄이 모두 1 값이라면,
| |
| {
| |
| for(j=i;j>1;j--)
| |
| {
| |
| for(x=0;x<8;x++)
| |
| tet_table[j][x]=tet_table[j-1][x]; //바로 윗 줄의 값을 카피해오면서 (줄을 한 줄씩 내림)
| |
| }
| |
| for(x=0;x<8;x++)
| |
| tet_table[1][x]=0; //제일 윗줄은 0값으로 초기화.
| |
|
| |
| (*ptr_sco)++; //스코어에 1을 더한다.
| |
| }
| |
| }
| |
|
| |
| if(tet_table[0][0]==1 || tet_table[0][1]==1 || tet_table[0][2]==1 || tet_table[0][3]==1 || tet_table[0][4]==1 || tet_table[0][5]==1 || tet_table[0][6]==1 \
| |
| || tet_table[0][7]==1) //tet_table[0]이 하나라도 1이라면, 블록이 판 위를 벗어났다는 의미이므로
| |
| return 0; //End함수를 0으로 리턴한다.
| |
|
| |
| else
| |
| return 1; //그렇지 않을 경우 0이 아닌값(여기서는 1)로 리턴한다. 0이 아니라면 어떤 값이든 상관없다.
| |
| }
| |
| -----
| |
| [[최다인]]
| |
|
| |
|