模拟汉诺塔游戏

#include<stdio.h>
char chst[10][20]={"        |         ","        #         ","       ###        "
                    ,"      #####       ","     #######      ","    #########     "
                    ,"   ###########    ","  #############   "," ###############  "
                    ,"################# "},
chst1[3][20]={"                  "
                    ,"        V         "
                    ,"        ^         "},ch;
int hanoi[9][3]={1,0,0
                    ,2,0,0
                    ,3,0,0
                    ,4,0,0
                    ,5,0,0
                    ,6,0,0
                    ,7,0,0
                    ,8,0,0
                    ,9,0,0},
up=0,down=0,state=0,total=0;
                            /*用up来记录上面的光标的位置,
用down来记录下面的光标的位置,用total来记录移动汉诺塔的总次数,
用state来记录目前的光标所在的位置,0代表在上面,1代表在下面*/
void
output()
{
    int i,j;
    if(!state)
        for(i=0;i<3;i++)
            if(i==up)
                printf("%s",chst1[1]);
            else
                printf("%s",chst1[0]);
    putchar('\n');
    for(i=0;i<9;i++)
    {
        for(j=0;j<3;j++)
            printf("%s",chst[hanoi[i][j]]);
        putchar('\n');
    }
    if(state)
        for(i=0;i<3;i++)
            if(i==down)
                printf("%s",chst1[2]);
            else
                printf("%s",chst1[0]);
    putchar('\n');
}
void
change(int ini,int goal)
/*本函数的功能是将第(ini+1)的位置的汉诺塔移动到第(goal+1)个汉诺塔的位置,
若移动不成功则打印出"\\\\\\本次汉诺塔移动失败!//"*/
{
    int i,in;
    for(i=0;i<9;i++)
        if(hanoi[i][ini]!=0)
            break;
    if(i==9)
        i--;
    in=i;
    for(i=0;i<9;i++)
        if(hanoi[i][goal]!=0)
            break;
    if(i==9)
        i--;
    if(hanoi[in][ini]!=0&&(hanoi[in][ini]<hanoi[i][goal]||hanoi[i][goal]==0))
    {
        if(hanoi[i][goal]==0)
            hanoi[i][goal]=hanoi[in][ini];
        else
            hanoi[i-1][goal]=hanoi[in][ini];
        hanoi[in][ini]=0;
        total++;
    }
    else
        puts("\n\n\t\\\\\\\\\\\\本次汉诺塔移动失败!//\n");
}
void
input()
{
    printf("You have moved the hanoi %d times , and please continue:\n",total);
    ch=getch();
    /*接受方向键的输入*/
    if(!state)
        switch(ch)
        {
            case 75:/*左方向键的ASCⅡ码的值为75*/
                up--;
                if(up==-1)
                    up=2;
                break;
            case 77:/*右方向键的ASCⅡ码的值为77*/
                up++;
                if(up==3)
                    up=0;
                break;
            case 80:/*下方向键的ASCⅡ码的值为80*/
                state=1;
                down=up;
                break;
        }
    else
        switch(ch)
        {
            case 75:
                down--;
                if(down==-1)
                    down=2;
                break;
            case 77:
                down++;
                if(down==3)
                    down=0;
                break;
            case 80:
                state=0;
                change(up,down);
                up=down;
                break;
        }
}
int
judge()/*判断是否已经达到目标*/
{
    int i;
    for(i=0;i<9;i++)
        if(hanoi[i][2]!=i+1)
            return 1;
    return 0;
}
int main()
{
    int i;
    puts("操作方法:\n在这个游戏中,你可以使用左下右这三个方向键.\n左右键是移动光标,下键是确认.");
    do
    {
        output();
        input();
    }
    while(judge());
    for(i=0;i<6;i++)
        puts("CONGRATULATIONS!!!!!!");
    printf("You got it!!!!!!\nAnd you have moved the hanoi %d times finally\n",total);
    return 0;
}



程序运行之后:




  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值