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

8-퍼즐 초기화(섞어주기)

바로이순간 2012. 11. 6. 00:15

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

// board 의 내용을 화면에 보여줍니다.

void showboard(int b[]) {

    int i;

    system("cls");

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

        if(b[i]==0) printf(" *");

        else printf("%2d", b[i]);

        if((i+1)%3==0) printf("\n");

    }

}

int main() {

    // 처음에 보드에 초기값을 넣습니다.

    int board[9]={1,2,3,4,5,6,7,8,0};

    // 0이          위로 가는 것은 1로 나타내고,   == mapp에서는 1 

    // 0이 오른쪽으로 가는 것은 2로 나타내고   == mapp에서는 2

    // 0이       아래로 가는 것은 3으로 나타내고 == mapp에서는 4

    // 0이    왼쪽으로 가는 것은 4로 타나냅니다.== mapp에서는 8 로 나타냅니다.

    int mapp[5]={0,1,2,4,8};

    // mchk는 각위치에서 허용되는 move를 구하기 위해서

    // 모두가 허용되면 (1+2+4+8) 15로 나타내고,

    // 오른쪽과 아라쪽이 허용되면 (2+4) 6으로 나타냅니다.

    // 9개 위치에 따라서 허용되는 것을 모두 mchk 로 나타내었습니다.

    int mchk[9]={6,14,12,7,15,13,3,11,9};

    // move는 위로 가는 것은 인덱스가 3감소하고

    // 오른쪽으로 가는 것은 인덱스가 1증가하고

    // 아래로 가는 것은 인덱스가 3증가하고

    // 왼쪽으로 가는 것은 인덱스가 1감소하는 것을 나타냅니다.

    int move[5]={0,-3,1,3,-1};

    // 처음 출발할때 위치는 8입니다. (0,1,2,3,4,5,6,7,8) 

    int pos=8;

    // 난수를 생성시켜서 실제로 퍼즐을 움직이는 것처럼 움직입니다.

    // 500회를 옮겼습니다.

    int x, y, i, j, n=500;


    srand(time(NULL));

    i=0;

    showboard(board);

    while(i<n) {

        j=rand()%4+1;

        if(mapp[j]&mchk[pos]) {

            x=pos+move[j];

            y=board[x]; 

            board[x]=board[pos];

            board[pos]=y;

            pos=x;

        }

        i=i+1; 

        if(i%10==0) showboard(board);

    }

    return 0;

}