본문으로 건너뛰기

23.05.24.

Today I learned

  • 컴실

컴실

tetris 마무리

유종의 미를 거두고 싶었지만 결국 시간에 쫓겨 완벽하게 마무리하진 못했다.

recommend자리에 자동으로 들어가게 하는 Autodown함수

void Autodown(int sig) {
if (!CheckToMove(field, nextBlock[0], blockRotate, blockY, blockX)) {
gameOver = 1;
}
else {
score += AddBlockToField(field, nextBlock[0], maxNode->parent->parent->recommendR, maxNode->parent->parent->recommendY, maxNode->parent->parent->recommendX);
score += DeleteLine(field);
nextBlock[0] = nextBlock[1];
nextBlock[1] = nextBlock[2];
nextBlock[2] = rand() % 7;
maxNode = NULL;
int i, j;
for (i = 0; i < HEIGHT; i++) {
for (j = 0; j < WIDTH; j++) {
root->f[i][j] = field[i][j];
}
}
root->lv = 0;
root->score = 0;
modified_recommend(root);
DrawNextBlock(nextBlock);
DrawField();
blockY = -1;
blockX = WIDTH / 2 - 2;
blockRotate = 0;
PrintScore(score);
DrawField();
DrawBlockWithFeatures(blockY, blockX, nextBlock[0], blockRotate);
timed_out = 0;
}
}

BlockDown과는 다르게 처음에 도형을 생성할 수 있는지만 체크하고, 가능하면 바로 추가한다.
AddBlockToFiled는 바로 추가를 위해 MaxNode의 첫번째 노드를 찾아 그 노드를 전달하고, DrawBlockWithFeatures는 갱신된 nextBlock[0]을 그려야하므로 현재블록을 전달한다.
장정 3주에 걸쳐 만든 프로젝트인데 유종의 미를 거두지 못해 살짝 아쉽다.


maze 1주차

이번 프로젝트는 maze. 미로를 만드는 프로그램이다. 완전 미로라고해서 임의의 출발점, 도착점을 잡았을 때 둘에 도달하는 방법이 단 하나뿐인 미로를 만든다. 이번 1주차는 미로를 만드는게 목적이다.
미로를 만드는 방법은 Ella's Algorithm을 사용한다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int N,M;
void printmaze(int maze[][N]){
int i,j;
for(i=0;i<M;i++){
for(j=0;j<N;j++){
printf("%2d ",maze[i][j]);
}
printf("\n");
}
printf("\n");
}

int main(void) {
//N : 너비, M : 높이
printf("N : ");
scanf("%d",&N);
printf("M : ");
scanf("%d",&M);
srand(time(NULL));
int maze[M][N];
int i,j,k;
//num : 서로 다른 집합
int num=0;
//같은행에 연속된 숫자의 갯수
int continous_num;
//무조건 세로로 뚫어야 하는 곳
int absol_drill;
//random : 난수 생성
int random;
//미로 초기화
for(i=0;i<N;i++){
if(i==0){
for(j=0;j<M;j++){
maze[i][j]=++num;
}
}
else{
for(j=0;j<M;j++){
maze[i][j]=0;
}
}
}

for(i=0;i<M;i++){//i : 높이 순회, j : 너비 순회
if(i!=0){//첫번째 행이 아니면, 순회하면서 0인 값에 대하여 집합 부여
for(j=0;j<N;j++){
if(maze[i][j]==0) maze[i][j]=++num;
}
}
printmaze(maze);
//가로로 뚫기
if(i==M-1){//마지막행은 서로다른 집합이면 다 뚫어야 됨
for(j=0;j<N-1;j++){
if(maze[i][j+1]!=maze[i][j]){
maze[i][j+1]=maze[i][j];
}
}
}
else {
for(j=0;j<N-1;j++){
random=rand()%2;
printf("random is : %d\n",random);
if(random){
if(maze[i][j+1]!=maze[i][j]){
maze[i][j+1]=maze[i][j];
}
}
}
}
//세로로 뚫기
if(i==M-1) continue;//마지막행은 아래로 뚫을 수 없음
else{
for(j=0;j<N;){
for(k=j;k<N;k++){
if(maze[i][k]!=maze[i][j]) break;
}
continous_num=k-j;
absol_drill=rand()%continous_num;
while(continous_num>=1){
random=rand()%2;
if(random || j==(k-absol_drill-1)){
maze[i+1][j]=maze[i][j];
}
j++;
continous_num--;
}
}
}
}
printmaze(maze);
return 0;
}

알고리즘을 고안한 대로 만들긴 했지만, 틀린 알고리즘이 되었다. 미로를 만들기 보단 먼저 집합을 다 같은 1로 만드는데 중점을 주었다. 그런데 집합을 다 1로 만들어 버리면, 어디서 1로 바꿨는지 알 수가 없어서 벽을 어디에 설치해야 하는지 모른다. 즉, 집합을 1로 만드는 과정에서 미로를 만들어야 했다.
그리고 윗줄부터 순차적으로 만들어 나가니, 아랫줄에서 같은 집합으로 합쳐져 윗줄이 바뀌어야 하는 상황이 부여되는데 이런 상황에서 현재 반복문을 시행중인 행이 아닌 이미 만들어진 행에 대해서는 갱신하지 못했다.
마지막으로 srand(time(NULL));이 있어야 매 실행마다 rand()값이 바뀐다.
결론은 전부 갈아 엎어야한다.