#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())

