본문으로 건너뛰기

23.05.17.

Today I learned

  • 컴공실

컴공실

tetris project third week


recommend 구현 수정

  1. 트리를 만드는 부분을 분리했다. makeTree함수를 미리 호출해 트리를 만들고,recommend에서는 트리를 순환하며 최적값을 찾는다.
  2. DrawRecommend를 수정했다. 기존엔 현재블록의 상태를 사용해서, recommend된 블록을 사용하도록 바꿨다.
  3. constructTree 개선 이미 트리는 만들어져있기 때문에 순회하며 값의 비교를 진행한다. 필드같은경우 정의되어 있지 않기 때문에 초기화시켜준다.(헤더파일에서 2차원배열선언을 해두었기에 초기화 가능)
//수정 makeTree()
void makeTree(root){
int i,j;
if(root->lv<3){//lv 3이 될때까지 재귀
for(i=0;i<CHILDREN_MAX;i++){
root->c[i]=(RecNode*)malloc(sizeof(RecNode));
root->c[i]->lv=root->lv+1;
root->c[i]->score=0;
//root->c[i]->blockRotate=0;
makeTree(root->c[i]);
}
}
}
//recommend를 그린다
void DrawRecommend() {
if (CheckToMove(field, nextblock[0], recommendR, recommendY, recommendX)) {//recommend위치로 이동가능하면 이동
DrawBlock(recommendY, recommendX, nextblock[0], recommendR, 'R');
}
}

int recommend(RecNode* root) {
constructTree(root);
DrawRecommend();
}
void constructTree(RecNode* root) {
int max=0;
int i,j,k,m,n,l=0;
RecNode **t = root->c;
for (i = 0; i < blockAbleRotate[nextblock[(root->lv)-1]]; i++) {//중복되는 경우 제외 모든 회전, i=blockRotate
for (j = 0; j < WIDTH; j++) {//모든 위치, j=x
for (k = 0; k < HEIGHT; k++) {//도착하는 y값찾기, k=y
if (!CheckToMove(field, nextBlock[0], i, k, j)) {//위치시키기
for(m=0;m<HEIGHT;m++){
for(n=0;n<WIDTH;n++){
t[l]->f[m][n]=root->f[m][n];
}
}
t[l]->score = t[l]->score + AddBlockToField(t[l]->f,i,k-1,j)+DeleteLine(t[l]->f)
if (lv == 3) {//lv 3에 도달하면 최댓값과 비교 후 갱신
if (max < root->score){
recommendR=i;
recommendY=k;
recommendX=j;
max=root->score;
}
}
else {//lv 3이 아니라면 lv3으로,이동
constructTree(t[l]);
//각 node가 각각의 field를 갖기 때문에 field를 따로 초기화할 필요가 없다
}
l++;
break;
}
}
}
}
}

그럼에도, 정상적인 수행이 되지 않는다. 더 손봐야 될 거 같다. 어렵다ㅠㅡㅠ