c·c++/c 프로그래밍

타일클리어

바로이순간 2012. 9. 18. 10:12

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <windows.h>

void main() {

  int row =0;

  int col = 0;

  int i;

  int j;

  while(1) {

    printf("타일의 크기를 입력 \n");

    printf(">>");  // 타일의 크기를 작게(10 10) 주고 돌려봅니다.

    scanf_s("%d %d",&row,&col);

    if(row > 1 && col >1) break;

    else printf("잘못 입력 \n");

  }

 

  int **arr;

  arr =(int **)malloc(row*sizeof(int*));

  for(i=0;i<row;i++)

    arr[i]=(int*)malloc(col*sizeof(int));

 

  for(i=0;i<row;i++)

    ZeroMemory(arr[i], sizeof(int)*col);

  srand(time(NULL));

  int nowRow = row/2;

  int nowCol = col/2;

  float lastTime = time(NULL);

  int Move =0;


  while(1) {

  

    int noMoveTileCount = 0;

  

    //nowRow=nowRow%row; 

    //nowCol=nowCol%col;

    arr[nowRow][nowCol] = 2;

    //■ = 지나가지않은 타일

    //@ = 지난간 타일

    //□ = 현재위치

    for(i=0; i<row; i++){

      for(j=0; j<col; j++){

        if(1==arr[i][j]){

          printf("□");

        }

        else if(2== arr[i][j]){

          printf("@");

          Move++;

        }

        else{

          printf("■");

          noMoveTileCount++;

        }

      }

      printf("\n");

    }

    printf("------------\n");

    getchar();  // 어떻게 동작하는지 이해하고 나면 코멘트로 막아 줍니다.

    if(0 == noMoveTileCount) {

      break;

    }

    

    arr[nowRow][nowCol] = 1;

// 지금 현재위치에서 갈수 있는 곳이 8군데 있습니다.

// 현재 위치를 x라고 하고 나머지 위치를 표시해 보겠습니다.

//     0   1   2

//     3   x   4

//     5   6   7  

// 이렇게 고쳐서 프로그램을 수정하였습니다.

// 다음 위치로 모든 곳에 갈수 있다는 뜻으로 isMove[8]에 모두 true를 넣었습니다.

// 만약 가장 윗줄에 현재 위치가 있다면 0,1,2의 위치로는 갈수가 없습니다.

// 이것을 나타내기 위해서 nowRow==0 일 경우에는 0,1,2 칸에 false 를 넣은 것입니다.

// 만약 마지막 줄에 현재 위치가 있다면 5,6,7의 위치로는 갈수가 없습니다.

// 만약 가장 왼쪽에 현재 위치가 있다면 ( nowCol==0 ) 0,3,5의 칸에 false를 넣었습니다. 

// 마지막으로 가장 오른쪽에 현재 위치가 있다면 2,4,7의 칸에 false를 넣었습니다. 

    bool isMove[8];

    for(i=0;i<8;++i) isMove[i]=true;

    if(0==nowRow) {

      isMove[0] =false;

      isMove[1] =false;

      isMove[2] =false;

    }

    else if(row-1 ==nowRow) {

      isMove[5] =false;

      isMove[6] =false;

      isMove[7] =false;

    }

    if(0==nowCol) {

      isMove[0] =false;

      isMove[3] =false;

      isMove[5] =false;

    }

    else if(col-1==nowCol) {

      isMove[2] =false;

      isMove[4] =false;

      isMove[7] =false;

    }

    int isMoveCount=0;

    for(i=0;i<8;i++) {

      if(true==isMove[i]) {

        isMoveCount++;

      }

    }

    int temp=rand();

    int randNum=rand()%isMoveCount;

    int selectNum=0;

    for(i=0;i<8;i++) {

      if(true==isMove[i]) {

        if(0==randNum) {

          selectNum =i;

        }

        randNum--;

      }

    }

    switch(selectNum) {

      case 0: // 0이면 위쪽,왼쪽 대각선으로 갑니다. nowRow와 nowCol이 모두 1이 줍니다.

        nowRow--;

        nowCol--;

        break;

      case 1: // 1이면 위쪽으로 갑니다. nowRow가 1이 줍니다.

        nowRow--;

        break;

      case 2: // 2이면 위쪽,오른쪽 대각선으로 갑니다. nowRow는 줄고, nowCol은 늡니다.

        nowRow--;

        nowCol++;

        break;

      case 3: // 3이면 왼쪽으로 갑니다.

        nowCol--;

        break;

      case 4: // 4이면 오른쪽으로 갑니다.

        nowCol++;

        break;

      case 5: // 5이면 아래쪽,왼쪽으로 갑니다.

        nowRow++;

        nowCol--;

        break;

      case 6: // 6이면 아래쪽으로 갑니다.

        nowRow++;

        break;

      case 7: // 7이면 아래쪽, 오른쪽으로 갑니다.

        nowRow++;

        nowCol++;

        break;

    }

  }


  float currTime = time(NULL);

  float deltaTimelnSecond = (currTime - lastTime)*0.001;

  printf(" 이동횟수 : %d\n", Move);

  printf("\n 걸린시간 : %.3f초 \n", deltaTimelnSecond);

 

  for(i=0;i<row;i++)

    free(arr[i]);

  free(arr);

  system("PAUSE");


  return;

}