23.05.17.
Today I learned
- 컴공실
컴공실
tetris project third week
recommend 구현 수정
- 트리를 만드는 부분을 분리했다. makeTree함수를 미리 호출해 트리를 만들고,recommend에서는 트리를 순환하며 최적값을 찾는다.
- DrawRecommend를 수정했다. 기존엔 현재블록의 상태를 사용해서, recommend된 블록을 사용하도록 바꿨다.
- 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;
}
}
}
}
}
그럼에도, 정상적인 수행이 되지 않는다. 더 손봐야 될 거 같다. 어렵다ㅠㅡㅠ