论文网
English Papers
万事OK网
发表论文
 
 首页 > IT文章 > 程序设计 >
汉诺塔C源码

[科技论文网] http://www.scipapers.com    2007-12-01  

    汉诺塔C源码

    #include  "stdio.h"
    #include  "conio.h"
    #include  "stdlib.h"
    #include  "dos.h"
    #include  "time.h"
    #include  "graphics.h"

    #define S   setcolor
    #define F   setfillstyle
    #define R   rectangle
    #define C   circle
    #define B   bar
    #define B3D bar3d
    #define L   line
    #define O   outtextxy

    #define X 200
    #define Y 20


    int nStep=0;
    int nRecord[7]={7,15,31,63,127,255,511},nRec;
    int nDisk,nDisknum;
    int nBaseNum;
    int nSelectDelay=1; /**USE IN AUTOPLAY**/
    float nDelay;
    char chMark[15];

    struct rod
           {
           int nDisk[10][5];
           int nDiskName[10];
           }tree[3];

    /********************************************/
    ntoa(int s)
    {
     int b[15];
     int i,j;
     for (i=0;i<15;i++)
       chMark[i]='\0';
     for (i=0;s>=10;i++)
       {b[i]=s%10;
       s/=10;}
     b[i]=s;
     for(j=i;j>=0;j--)
       chMark[i-j]=b[j]+'0';
    }


    void INITIAL()     /**GAME INITIAL**/
    {
     int gd=DETECT,gm=0;
     registerbgidriver(EGAVGA_driver);
     initgraph(&gd,&gm,"");
     setbkcolor(0);
    }

    void Start_Logo()
    {
      F(1,8);
      B(200,150,439,329);
      S(7);
      R(201,151,438,328);
      S(WHITE);
      R(199,149,440,330);
      settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
      O(233,180,"HANOI TOWER");
      S(1);
      O(232,179,"HANOI TOWER");
      S(WHITE);
      settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
      O(284,204,"V 2.0");
      S(1);
      O(283,203,"V 2.0");
      settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
      S(WHITE);
      O(236,240,"COPYRIGHT (C) 2002 BY");
      O(236,250,"--LING DONG  STUDIO--");
      S(7);
      O(236,280,"    BOLM@ETANG.COM   ");
    }

    void END()
    {
     char message[110]=">>> IF YOU WANT TO GET THE SOURCE PROGRAM\n\nPLEASE SEND AN E_MAIL TO TELL ME,AND I WILL SEND TO YOU!! ^-^";
     int NUM;
     closegraph();
     sleep(1);
     gotoxy(1,10);
     for(NUM=0;NUM<110;NUM++)
      {printf("%c",message[NUM]);
       delay(500);
       sound(0);delay(50);nosound();}
      sleep(1);
    }


    void FLASH_REC()
    {
     int NUM,x1=8,x2=10;
     randomize();
     for(NUM=0;NUM<33;NUM++)
     {
      F(1,rand()%16);
      B(x1,412,x2,414);
      x1=x1+20;
      x2=x2+20;
     }
    }

    void DRAW()
    {
     F(1,8);
     B(6,80,633,100); /**BROWN BAR**/
     B(6,415,633,430);
     B(6,430,633,479);
     F(1,7);
     B(6,77,633,80);
     B(6,430,633,432);
     F(1,4);
     B(6,100,633,102);
     B(6,410,633,415);
     F(1,7);                 /**GAME BACKGROUND**/
     B(7,102,632,410);
     S(15);
     R(6,0,633,479);
     S(15);
     settextstyle(DEFAULT_FONT,HORIZ_DIR,4);
     O(70,30,"HANOI TOWER V2.0");
     S(9);
     O(71,31,"HANOI TOWER V2.0");

     S(7);            /**SHOW MESSAGE**/
     settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
     O(190,440,"-MADE BY BOLMAN--LINGDONG STUDIO-");
     O(190,450,"-BOLM@ETANG.COM--BOLMAN@SINA.COM-");
     L(165,419,165,425);
     S(12);
     O(170,419,"MESSAGE:"); /**MESSAGE BOX**/
     S(7);
     O(20,419,"PRESS ESC TO QUIT");
     F(1,2);
     B(550,450,560,460);
     F(1,13);
     B(565,450,575,460);
     F(1,YELLOW);
     B(580,450,590,460);
     F(1,12);
     B(595,450,605,460);
    }

    void DrawRod()
    {
     F(1,8);
     B(118,150,122,400);   /*ROD1*/
     B(318,150,322,400);   /*ROD2*/
     B(518,150,522,400);   /*ROD3*/
     F(6,LIGHTBLUE);
     B(119,151,123,401);
     B(319,151,323,401);
     B(519,151,522,401);
    }
    /*====END OF FUN DRAWROD====*/

    void ShowInfo(int nRn,int nWhetherGetDisk)
    {
     F(1,8);
     B(230,418,620,428);
     settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
     S(CYAN);
     if(nRn==0&&nWhetherGetDisk==0)
       O(235,419,"YOU NOW AT THE FIRST ROD");
     else if(nRn==1&&nWhetherGetDisk==0)
       O(235,419,"YOU NOW AT THE SECOND ROD");
     else if(nRn==2&&nWhetherGetDisk==0)
       O(235,419,"YOU NOW AT THE THIRD ROD");
     else if(nWhetherGetDisk==1)
       {S(YELLOW);
         switch(nRn)
          {case 0 :O(235,419,"YOU GET THE TOP DISK AT THE FIRST ROD");break;
           case 1 :O(235,419,"YOU GET THE TOP DISK AT THE SECOND ROD");break;
           case 2 :O(235,419,"YOU GET THE TOP DISK AT THE THIRD ROD");break;
           default:break;
          }
       }
      else if(nRn==3&&nWhetherGetDisk==nBaseNum)
         {S(WHITE);O(235,419,"YOU SHOULD DO YOUR BEST");}
      else if(nRn==3&&nWhetherGetDisk==nBaseNum*2)
         O(235,419,"YOU SEEMS PLAY NOT VERY GOOD...^_^");
      else if(nRn==4&&nWhetherGetDisk==0)
         {S(13);O(235,419,"O.K YOU HAVE FINISHED YOUR WORK");sleep(1);}
      else O(235,419,"YOU HAVE GET DOWN THE DISK");
    }
    /*====END OF FUN SHOWINFO====*/


    void ShowRecord()
    {
     settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
     F(1,8);
     B(78,82,90,94);
     ntoa(nDisk);
     S(YELLOW);
     O(40,86,"DISK:");
     S(15);
     O(80,86,chMark);

     B(348,82,360,94);
     ntoa(nRec);
     S(YELLOW);
     O(290,86,"RECORD:");
     S(15);
     O(350,86,chMark);

     B(560,82,610,94);
     ntoa(nStep);
     S(YELLOW);
     O(520,86,"STEP:");
     S(15);
     O(562,86,chMark);
    }
    /*====END OF FUN SHOWRECORD====*/

    void FillDisk(int x1,int y1,int x2,int y2,int color,int color1)
    {
     S(color);
     F(1,color);
     B3D(x1,y1,x2,y2,5,5);
     F(1,color1);
     B3D(x1+1,y1+1,x2+1,y2+1,5,5);
    }

    void FadeIn(void)
    {
     char R[256],G[256],B[256];
     int nNum,nNotFinish;

     for(nNum=0;nNum<256;nNum++)
     {
      outportb(0x3c7,nNum);
      R[nNum]=inportb(0x3c9);
      G[nNum]=inportb(0x3c9);
      B[nNum]=inportb(0x3c9);
     }
     nNotFinish=1;
     while(nNotFinish==1)
     {
      nNotFinish=0;
      for(nNum=0;nNum<256;nNum++)
      {
       if(R[nNum]!=0)
       {
        nNotFinish=1;
        R[nNum]--;
       }
       if(G[nNum]!=0)
       {
        nNotFinish=1;
        G[nNum]--;
       }
       if(B[nNum]!=0)
       {
        nNotFinish=1;
        B[nNum]--;
       }
       outportb(0x3c8,nNum);
       outportb(0x3c9,R[nNum]);
       outportb(0x3c9,G[nNum]);
       outportb(0x3c9,B[nNum]);
      }
      delay(1000);
     }
    }
    /*====END OF FUN FADEIN====*/

    void FadeOut(void)
    {
     char R[256],G[256],B[256];
     char RR[256],GG[256],BB[256];
     int nNum,nNotFinish;

     for(nNum=0;nNum<256;nNum++)
     {
      outportb(0x3c7,nNum);
      R[nNum]=RR[nNum]=inportb(0x3c9);
      G[nNum]=GG[nNum]=inportb(0x3c9);
      B[nNum]=BB[nNum]=inportb(0x3c9);
     }
     for(nNum=0;nNum<256;nNum++)
     {
      R[nNum]=0;
      G[nNum]=0;
      B[nNum]=0;
      outportb(0x3c8,nNum);
      outportb(0x3c9,0);
      outportb(0x3c9,0);
      outportb(0x3c9,0);
     }
     delay(100);
     nNotFinish=1;
     while(nNotFinish==1)
     {
      nNotFinish=0;
      for(nNum=0;nNum<256;nNum++)
      {
       if(R[nNum]!=RR[nNum])
       {
        nNotFinish=1;
        R[nNum]++;
       }
       if(G[nNum]!=GG[nNum])
       {
        nNotFinish=1;
        G[nNum]++;
       }
       if(B[nNum]!=BB[nNum])
       {
        nNotFinish=1;
        B[nNum]++;
       }
       outportb(0x3c8,nNum);
       outportb(0x3c9,R[nNum]);
       outportb(0x3c9,G[nNum]);
       outportb(0x3c9,B[nNum]);
      }
      delay(1500);
     }
    }
    /*====END OF FUN FADEOUT====*/

    void ClrScreen(void)
    {
     int NUM;
     F(11,9);
     for (NUM=84;NUM<476;NUM++)
     { B(7,NUM,632,NUM+2);
       delay(20);
     }
    }

    int Ball(int nRn)
    {
     F(1,7);
           B(20,105,609,130);
           F(1,RED);
           S(RED);
           C(118+(nRn*200),115,10);
           floodfill(118+(nRn*200),115, RED);
    }

    void Quit()
    {
     ClrScreen();
     settextstyle(DEFAULT_FONT,HORIZ_DIR,2);
     S(WHITE);
     O(180,210,"THANK YOU TO PLAY");
     O(180,230,"      2002.7     ");
     S(RED);
     O(181,211,"THANK YOU TO PLAY");
     O(181,231,"      2002.7     ");
     O(181,260," ANY KEY TO QUIT ");
     S(GREEN);
     O(180,180,"G A M E   O V E R");
     S(15);
     O(181,181,"G A M E   O V E R");
     getch();
     FadeIn();
     closegraph();
     END();
     exit(0);
    }
    /*====END OF FUN QUIT====*/

    int IsWin()
    {
      int i,nStep_Sub_Rec;
      int nDiskNum=0;
      for (i=0;i<nDisk;i++)
       { if(tree[2].nDisk[i][0]==1) nDiskNum++;}
      nStep_Sub_Rec=nStep-nRec;
      if (nDiskNum==nDisk)
        { ShowInfo(4,0);             /**IT CAN BE SET AS YOUR WAY**/
         nBaseNum=nRec/9;
         if (nStep_Sub_Rec<=nBaseNum) /**WIN**/
           { ClrScreen();
      S(GREEN);
      settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
      O(230,200,"YOU WIN");
      S(RED);
      O(231,201,"YOU WIN"); }
          else if (nStep_Sub_Rec<=nBaseNum*2)
           { ClrScreen();
      S(RED);
      settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
      O(220,200,"JUST SOSO");
      S(LIGHTBLUE);
      O(221,201,"JUST SOSO"); }
           else
           { ClrScreen();
      S(LIGHTBLUE);
      settextstyle(DEFAULT_FONT,HORIZ_DIR,3);
      O(175,200,"YOU PLAY BAD");
      S(CYAN);
      O(176,201,"YOU PLAY BAD"); }
      sound(1000);
      delay(1000);
      sound(1500);
      delay(300);
      sound(400);
      delay(2020);
      nosound();
      S(BLUE);
      settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
      O(170,230,"PRESS ANY KEY TO CONTINUE(ESC TO QUIT)");
      S(WHITE);
      O(171,231,"PRESS ANY KEY TO CONTINUE(ESC TO QUIT)");

      if(getch()==27) {Quit();}
      else
      {ClrScreen();return(1);}
        }
        else ShowInfo(3,nStep_Sub_Rec);
        return(0);
    }
    /*====END OF FUN ISWIN====*/

    void HelpMessage()
    {
     S(15);
     L(7,314,632,314);
     L(7,432,632,432);
     S(12);
     settextstyle(DEFAULT_FONT,HORIZ_DIR,1);
     O(23,320,"HELP MESSAGE:");
     S(7);
     O(50,340,"1).............KEY: <-,->,A,D :MOVE THE RED BALL TO SELECT A ROD");
     O(50,365,"2).............KEY: UP,W      :TO SELECT THE TOP DISK");
     O(50,390,"3).............KEY: DOWN,S    :TO GET DOWN THE DISK WHICH SELECT");
     O(50,415,"4).............KEY: ESC       :QUIT THE GAME");
     S(12);
     O(50,442,"5).............IF   STEP-RECORD<=A BASENUM   THAN  :YOU WIN");
     O(50,453,"6).............IF   STEP-RECORD<=A BASENUM*2 THAN  :JUST SOSO");
     O(50,464,"7).............ELSE                                :YOU BAD BAD^_^");
    }
    /*====END OF FUN HELPMESSAGE====*/


    /*========GAME:PLAYER PLAY========*/
    void Game()
    {
     int nMoveDisk[4],nUpdiskName1,nUpdiskName2,nUpdiskNum1,nUpdiskNum2,nHaveMove=0,i,j,nRn=0;
     int nStage,nStage1,nStage2,nRn1,nRn2;
     int x1,y1,x2,y2;
     int a=0,b=0;
     int nName=1;
     nRec=nRecord[nDisk-3];
     DrawRod();
     ShowRecord();
     FLASH_REC();

    for (i=0;i<3;i++)         /*---EXIST BIT=0---*/
      for (j=0;j<9;j++)
        {tree[i].nDisk[j][0]=0;
         tree[i].nDiskName[j]=0;}


    for (i=0;i<nDisk;i++)     /*DRAW THE DISKS OF THE FIRST ROD*/
     {
      tree[nRn].nDiskName[i]=nName;
      tree[nRn].nDisk[i][0]=1;      /*DISK i-----exist bit*/
      tree[nRn].nDisk[i][1]=40+a;   /*--X1--*/
      tree[nRn].nDisk[i][2]=390-b;  /*--Y1--*/
      tree[nRn].nDisk[i][3]=200-a;  /*--X2--*/
      tree[nRn].nDisk[i][4]=400-b;  /*--Y2--*/

      nName=nName+1;
      a=a+8;
      b=b+20;
     }

    for (i=0;i<nDisk;i++)     /*********DRAW THE DISKS***********/
        FillDisk(tree[nRn].nDisk[i][1],tree[nRn].nDisk[i][2],tree[nRn].nDisk[i][3],tree[nRn].nDisk[i][4],8,BLUE);
    for (i=0;i<4;i++)
        nMoveDisk[i]=0;
     DrawRod();
    /*-----------------------------------------------------------------*/
    Ball(nRn);

    S(13);
    O(239,419,"GAME START,PLEASE GO!!");
    while(1)
        {if(kbhit())
          switch(getch())

        来源:

声明:本文由网友推荐或作者提交,版权归原作者所有,刊登此文仅为传播知识,展示研究成果,提高文章引用率。未经原作者授权,禁止用于任何形式的商业行为。科技论文网倡导尊重知识、尊重劳动、保护原创、知识共享。由于部分论文文章来于网络,文章作者不祥,请相关的原创作者与我们联系,以便加上您的署名。

  
汉诺塔C源码
下面没有链接了     后缀树-SuffixTree概念
最新论文
·[程序设计]汉诺塔C源码
·[程序设计]后缀树-SuffixTree概念
·[程序设计]素数算法
·[程序设计]马踏棋盘算法分析
·[程序设计]字典树实现源代码
·[程序设计]Java和C#的Hash算法
·[程序设计]hash表及如何选择hash函数
·[程序设计]一致性哈希(Consistent Hash
·[程序设计]对冒泡算法的改进
·[程序设计]杨辉三角算法源码
 
 

搜索论文

Google
论文分类

论文网 论文发表网 论文 免费论文网 找论文网 毕业论文 中国论文网 英语论文 百度论文 聘教网 易搜
 免费发布论文    中国论文网 2008版权所有  业务联系:pinjiao@126.com