哈佛公开课cs50习题集fifteen相关

来源:互联网 发布:舒适的椅子 知乎 编辑:程序博客网 时间:2024/05/10 01:20

这个竟然不允许发,是在想不通为什么,是不是原标题是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;
}



0 0
原创粉丝点击