哈佛公開課cs50習題集fifteen相關

這個竟然不允許發,是在想不通爲什麼,是不是原標題是fifteen遊戲,然後百度認爲是15禁遊戲?如果是這樣,只能呵呵了。

申訴也沒有反應,只能重新改標題,再發一次。


參照上一篇“手動移動的八數碼程序相關(非算法)”而改編的,具體註釋看上一篇的,如果看不懂可以把每個函數單獨運行。

這個是4*4的15數碼,其實基本都差不多,move函數那邊有區別。

這個是公開課視頻上輸入數字移動,而上一篇是上下左右鍵移動。

哦,沒驗證won函數,也就是移動成功後會怎樣,要手動移動比較麻煩。

下面的圖片就是:

哈佛公開課cs50習題集fifteen相關 - clzhl_2004 - 白的共享空間


#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

// 聲明
void clear(void);//清屏
void greet(void);//提示
void init(int array[]);//初始化
void draw(int array[]);//繪製
void move(int tile,int array[]);//移動
bool won(int array[]);//完成


//主函數
int
main()
{
    int array[16];
    int tile;
    init(array);
   do
   {
       clear();
       greet();
       draw(array);
       if(won(array))
        {
             printf("你贏了!好棒!!\n");
             break;
        }
        printf("\n");
        printf("輸入要移動的數字: ");

        scanf("%d",&tile);
        while(getchar()!='\n');
        if(tile<0 || tile>15)
         {
             printf("retry!\n");
         }
        //tile = GetInt();
        move(tile,array);

   }while(tile!=0);

}


//清屏函數

void
clear(void)
{
    /*printf("\033[2J");
    printf("\033[%d;%dH", 0, 0);
    */
    system("cls");
}

//提示函數

void
greet(void)
{
    //clear();
    printf("類似華容道的數字遊戲,將其排列成1,2,3...15的順序吧!\n");
    printf("如果想結束,除了按右上角的x,還可以輸入數字0,試試吧!\n");
    printf("\n");
    usleep(2000000);
}


//初始化函數

void
init(int array[])
{
    // TODO
    int i,j,sum;
    srand((unsigned int)time(NULL));

    do
    {
        sum=0;
        for(i=0;i<16;i++)
            array[i]=rand()%16;
        for(i=0;i<16;i++)
        {
            for(j=0;j<i;j++)
            {
                if(array[j]==array[i])
                {
                    array[i]=array[i]+1;
                    if(array[i]==16)
                        array[i]=0;
                    j=-1;
                }
            }
        }
        for(i=0;i<16;i++)
            for(j=i+1;j<16;j++)
                if(array[i]>array[j])
                    sum++;
    }while(sum%2!=0);

}

//繪製函數
void
draw(int array[])
{
    // TODO
    int i,j;
    for(i=0;i<4;i++)
    {
        for(j=0;j<4;j++)
            if(array[i*4+j]==0)
                printf("\t");
            else
            printf("%d\t",array[i*4+j]);

        printf("\n");
    }


}


//移動函數

void
move(int tile,int array[])
{
    // TODO
    int i;
    for(i=0;i<16;i++)
    if(array[i]==0)break;

    if((i>=1)&&(tile==array[i-1]))
    {
        array[i]=array[i-1];
        array[i-1]=0;
    }
    if((i<=14)&&(tile==array[i+1]))
    {
        array[i]=array[i+1];
        array[i+1]=0;
    }
    if((i>=4)&&(tile==array[i-4]))
    {
        array[i]=array[i-4];
        array[i-4]=0;
    }
    if((i<=11)&&(tile==array[i+4]))
    {
        array[i]=array[i+4];
        array[i+4]=0;
    }
/*
    switch(tile)
    {
        case array[i-1]:j=i-1;break;
        case array[i+1]:j=i+1;break;
        case array[i-4]:j=i-4;break;
        case array[i+4]:j=i+4;break;
    }
    if(j>=0&&j<=15)
    {
        array[i]=array[j];
        array[j]=0;
    }
*/
}

//完成函數
bool
won(int array[])
{
    // TODO
    int i;
    for(i=0;i<14;i++)
    if(array[i]!=i+1)
    return false;
    return true;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章