~cpp block[0][0]=1;이라고 적고 실행해보자. 아래와 같은 결과가 나올것이다.
~cpp block[x좌표][y좌표]=블럭의 종류;
~cpp block_next[x좌표][y좌표]=블럭의 종류;
~cpp 1.출력할 블럭의 모양을 결정한다. 2.랜덤으로 블럭을 생성한 후 next창에 출력한다. 3.next창에 출력된 블럭을 가져온뒤 메인창에 출력한다. 4.블럭을 움직인다. 5.블럭을 회전시킨다. 6.한줄이 다 찼을때, 블럭을 삭제한다. 7.점수와 스테이지를 변화시킨다.
~cpp {{ {0,0,0,0}, {2,2,2,2}, {0,0,0,0}, {0,0,0,0}} ,{ {0,0,2,0}, {0,0,2,0}, {0,0,2,0}, {0,0,2,0}} ,{ {0,0,0,0}, {2,2,2,2}, {0,0,0,0}, {0,0,0,0}} ,{ {0,0,2,0}, {0,0,2,0}, {0,0,2,0}, {0,0,2,0}} },
~cpp int block_id; block_id=rand()%7; for (register int i=0;i<3;++i) for (register int j=0; j<4; ++j) block_next[i][j]=block_type[block_id][0][i][j]; prv_block=block_id; //전역변수에 저장.
~cpp for (register int i=0;i<3; ++i) { for (register int j=0; j<4; ++j) { if (0!=block_type[prv_block][0][i][j]) { if (0==block[3+i][16+j]) block[3+i][16+j]=block_type[prv_block][0][i][j]; else game_end(); } } } x=3; //전역변수 x y=16; //전역변수 y shape=0; //전역변수 현재 블록의 회전정도 now_block=prv_block; //전역변수 현재 블럭의 ID
~cpp int move_block(int where)// -1좌 0아래 1우 { int temp_x=x+where; int temp_y=y-(where+1)%2; int temp_block[4][4]={0,}; int ground[4]={0,}; int side[2][4]={0,}; int swit[2][4]={0,}; // 블럭의 끝을 체크한다. for (register int i=0;i<4; ++i) { for (register int j=0; j<4; ++j) { if (0!=block_type[now_block][shape][i][j]) { if (i>=side[0][j] && 0==swit[1][j]) { side[0][j]=i; swit[1][j]=1; } side[1][j]=i; if (j>=ground[i] && 0==swit[0][i]) { ground[i]=j; swit[0][i]=1; } } } } // 블럭이 움직일 수 있는가를 판단한다. 못 움직일 경우에는 1을 리턴하고 종료한다. for (i=0;i<4; ++i) { for (register int j=0; j<4; ++j) { if (0!=block_type[now_block][shape][i][j]) { if (temp_x+i<0 || temp_x+i>9 ) return 1; else if (temp_y+j<0 || temp_y+j>19 ) return 1; else if (0!=block[temp_x+i][temp_y+j]) { if (ground[i]+1>j && where==0) return 1; else if (side[0][j]+1>i && where==-1) return 1; else if (side[1][j]-1<i && where==1) return 1; } } } } // 이전의 블럭의 이미지를 제거한다. for (i=0;i<4; ++i) for (register int j=0; j<4; ++j) if (0!=block_type[now_block][shape][i][j]) block[x+i][y+j]=0; // 새로운 블럭을 그린다. for (i=0;i<4; ++i) for (register int j=0; j<4; ++j) if (0!=block_type[now_block][shape][i][j]) block[temp_x+i][temp_y+j]=block_type[now_block][shape][i][j]; x=temp_x;y=temp_y; return 0; }
~cpp int temp_x=x; int temp_y=y; int temp_shape=(shape+1)%4; int crash=2; int temp_block[4][4]={0,}; //블럭이 벽에 닿는지, 충분한 공간이 있는지를 확인한다. while (2==crash) { for (register int i=0;i<4; ++i) for (register int j=0; j<4; ++j) temp_block[i][j]=0; crash=0; for (i=0;i<4; ++i) for (register int j=0; j<4; ++j) if (0!=block_type[now_block][shape][i][j]&& 0<=i+x-temp_x && 3>=i+x-temp_x ) temp_block[i+x-temp_x][j]=1; for (i=0;i<4; ++i) { for (register int j=0; j<4; ++j) { if (0!=block_type[now_block][temp_shape][i][j]) { if (temp_x+i<0) { temp_x+=1;crash=2; } else if (temp_x+i>9 ) { temp_x-=1;crash=2; } else if (0!=block[temp_x+i][temp_y+j] && 1!=temp_block[i][j]) crash=1; } } } } //블럭이 회전할 공간이 있으면, 이전의 블럭을 삭제한다. if (1==crash) return 0; for (register int i=0;i<4; ++i) for (register int j=0; j<4; ++j) if (0!=block_type[now_block][shape][i][j]) block[x+i][y+j]=0; //새로운 블럭을 그려넣는다. for (i=0;i<4; ++i) for (register int j=0; j<4; ++j) if (0!=block_type[now_block][temp_shape][i][j]) block[temp_x+i][temp_y+j]=block_type[now_block][temp_shape][i][j]; //변화된 값을 저장한다. x=temp_x;y=temp_y;shape=temp_shape; return 0;
~cpp void delete_block() { for (register int line=y; line<y+4; ++line) for (register int i=0; i<10; ++i) if (0==block[i][line]) i=10; //빈 블럭이 있으면, 그줄의 검사를 끝낸다. else if (9==i) //블럭이 다 차있을 경우에는 한줄을 삭제한다. { for (register int k=0; k<10; ++k) block[k][line]=0; for (k=line; k<19; ++k) //블럭을 한줄씩 내린다. for (register int l=0; l<10; ++l) block[l][k]=block[l][k+1]; for (k=0; k<10; ++k) block[k][19]=0; --line; } }