海龟做图代码.docx
《海龟做图代码.docx》由会员分享,可在线阅读,更多相关《海龟做图代码.docx(26页珍藏版)》请在冰豆网上搜索。
海龟做图代码
#include"graphics.h"
#include"math.h"
#include"stdio.h"
#include"conio.h"
#include"bios.h"
#include"dos.h"
#include"io.h"
charkey_state[128],key_pressed[128];
voidinterruptfar(*OldInt9Handler)();
enummodes{AUTO,HIGH};
enumbool{FALSE=0,TRUE=1};
#defineMODEenummodes
#defineBOOLenumbool
#defineK_ENTER0x1c
#defineK_DOWN0x50
#defineK_UP0x48
#defineK_SPACE0x39
#defineK_ESC0x01
#defineK_C0x2e
#defineK_A0x1e
#defineK_X0x2d
#defineUP0
#defineDOWN1
#definePI3.1415
#defineMODE_KEY0
#defineMODE_CMD1
#defineMAX_CMD_NUM15
/*Instructiondefine*/
#defineEXIT0
#defineCHM1
#definePU2
#definePD3
#defineCHC4
#defineCHHT5
#defineADTH6
#defineFW7
#defineBW8
#defineCLR9
#defineCHP10
enumhlpmsg{ALL_CMD,IN_ERROR,PU_OK,PD_OK,CHC_OK,CHP_OK,CHM_OK,
FW_OK,BW_OK,CHHT_OK,ADTH_OK,CLR_OK,M_KEY,IN_COLOR,
IN_POS,IN_HEAD,IN_STEPS};
#defineHLPMSGenumhlpmsg
typedefintpenState;
typedefstruct{floatv,h;}aPoint;
typedefstruct
{
floatheading;
penState pen;
int color;
aPoint Pos;
}newTurtle;
newTurtleturtle;
charGMODE=MODE_CMD;
charCmdWords[MAX_CMD_NUM][4]={
{'E','X','I','T'},{'C','H','M',''},
{'P','U','',''},{'P','D','',''},
{'C','H','C',''},{'C','H','H','T'},
{'A','D','T','H'},{'F','W','',''},
{'B','W','',''},{'C','L','R',''},
{'C','H','P',''},
};
charCmdTmp[4];
unsignedcharNumTmp[4];
unsignedcharNumTmp1[4];
typedefstructnode
{
intcolor;
intx1,x2,y1,y2;
}NODE;
/*---------------------------------------*/
/*otherfunctions*/
voidOpenSecCmdWnd()
{
setcolor
(2);
rectangle(510,250,595,275);
while(bioskey
(1)==0)
{
setcolor
(2);
line(513,270,518,270);
setcolor(0);
line(513,270,518,270);
}
window(66,17,66,17);
}
voidCloseSecCmdWnd()
{
setfillstyle(SOLID_FILL,0);
bar(511,250,595,275);
}
intCvt4CToInt(inti)
{
if(i==0)
returnNumTmp[0]+NumTmp[1]*10+NumTmp[2]*100+NumTmp[3]*1000-53328;
else
returnNumTmp1[0]+NumTmp1[1]*10+NumTmp1[2]*100+NumTmp1[3]*1000-53328;
}
intGetAn4BInterger()
{
inti,j;
unionREGSregs;
unsignedchart;
regs.h.ah=0x07;
IN_AGAIN:
for(i=0;i<4;i++)
NumTmp[i]=48;
for(i=0;i<4;i++)
{
IN:
while(bioskey
(1)==0){;};
if(bioskey
(1)==0x1c0d)
{bioskey(0);gotoOUT;}
int86(0x21,®s,®s);
t=regs.h.al;
if(t>57||t<48)gotoIN;
else
{
for(j=3;j>0;j--)
NumTmp[j]=NumTmp[j-1];
NumTmp[0]=t;
printf("%c",t);
}
}
while(bioskey
(1)==0){;}
if(bioskey
(1)!
=0x1c0d)
{
bioskey(0);
CloseSecCmdWnd();
OpenSecCmdWnd();
gotoIN_AGAIN;
}
OUT:
returnCvt4CToInt(0);
}
voidStoreTwo4BInterger()
{
inti,j;
unionREGSregs;
unsignedchart;
regs.h.ah=0x07;
IN_AGAIN1:
for(i=0;i<4;i++)
{
NumTmp[i]=48;
NumTmp1[i]=48;
}
for(i=0;i<4;i++)
{
IN1:
while(bioskey
(1)==0){;};
if(bioskey
(1)==0x1c0d)
{bioskey(0);gotoOVER;}
int86(0x21,®s,®s);
t=regs.h.al;
if(t==44)
{
printf("%c",t);
gotoOUT1;
}
if(t>57||t<48)gotoIN1;
else
{
for(j=3;j>0;j--)
NumTmp[j]=NumTmp[j-1];
NumTmp[0]=t;
printf("%c",t);
}
}
while(bioskey
(1)==0){;}
if(bioskey
(1)!
=0x1c0d)
{
int86(0x21,®s,®s);
t=regs.h.al;
if(t==44)
{
printf("%c",t);
gotoOUT1;
}
CloseSecCmdWnd();
OpenSecCmdWnd();
gotoIN_AGAIN1;
}
OUT1:
for(i=0;i<4;i++)
NumTmp1[i]=48;
for(i=0;i<4;i++)
{
IN2:
while(bioskey
(1)==0){;};
if(bioskey
(1)==0x1c0d)
{bioskey(0);gotoOVER;}
int86(0x21,®s,®s);
t=regs.h.al;
if(t>57||t<48)gotoIN2;
else
{
for(j=3;j>0;j--)
NumTmp1[j]=NumTmp1[j-1];
NumTmp1[0]=t;
printf("%c",t);
}
}
while(bioskey
(1)==0){;}
if(bioskey
(1)!
=0x1c0d)
{
bioskey(0);
CloseSecCmdWnd();
OpenSecCmdWnd();
gotoIN_AGAIN1;
}
OVER:
;
}
voidfarinterruptNewInt9(void)
{
unsignedcharScanCode,temp;
ScanCode=inportb(0x60);
temp=inportb(0x61);
outportb(0x61,temp|0x80);
outportb(0x61,temp&0x7f);
if(ScanCode&0x80)
{
ScanCode&=0x7f;
key_state[ScanCode]=0;
}
else
{
key_state[ScanCode]=1;
key_pressed[ScanCode]=1;
}
outportb(0x20,0x20);
};
voidInstallKeyboard(void)
{
inti;
for(i=0;i<128;i++)
key_state[i]=key_pressed[i]=0;
OldInt9Handler=getvect(9);
setvect(9,NewInt9);
}
voidShutDownKeyboard(void)
{
setvect(9,OldInt9Handler);
}
intGetKey(intScanCode)
{
intres;
res=key_state[ScanCode]|key_pressed[ScanCode];
key_pressed[ScanCode]=0;
returnres;
}
voidInitMyGraph(MODEm)
{
intgraphdriver,graphmode;
if(m==AUTO)
graphdriver=DETECT;
elseif(m==HIGH)
{
graphdriver=VGA;
graphmode=VGAHI;
}
else
{
printf("Wrongprameterof\"init_mygraph();\"");
return;
}
/*registerbgidriver(EGAVGA_driver);*/
initgraph(&graphdriver,&graphmode,"");
};
intGetKey1()
{
unionREGSrg;
rg.h.ah=0;
int86(0x16,&rg,&rg);
returnrg.h.ah;
};
void InputNote()
{
while(bioskey
(1)==0)
{
setcolor(9);
line(467,270,472,270);
setcolor(0);
line(467,270,472,270);
}
}
voidGetACmd()
{
inti,j;
window(60,17,60,17);
InputNote();
for(i=0;i<4;i++)
{
AGAIN:
while(bioskey
(1)==0)
{};
if(bioskey
(1)==0x0f09){bioskey(0);gotoAGAIN;}
if(bioskey
(1)==0x0e08){bioskey(0);gotoAGAIN;}
if(bioskey
(1)==0x1c0d)
{
for(;i<4;i++)CmdTmp[i]='';
break;
};
CmdTmp[i]=getch();
printf("%c",CmdTmp[i]);
}
}
intDecideCmd()
{
inti,j,r=MAX_CMD_NUM;
for(i=0;i {
if(CmdWords[i][0]==CmdTmp[0])
{
r=i;
for(j=1;j<4;j++)
{
if(CmdWords[i][j]!
=CmdTmp[j])
{
r=MAX_CMD_NUM;
break;
}
}
}
if(r!
=MAX_CMD_NUM)break;
}
returnr;
}
/*displaytheturtletoeveryprameterofitsown*/
voidDisTurtle()
{
floatx,y,h,v,x1,y1;
circle(turtle.Pos.h-8,turtle.Pos.v,4);
circle(turtle.Pos.h+8,turtle.Pos.v,4);
circle(turtle.Pos.h,turtle.Pos.v+8,4);
circle(turtle.Pos.h,turtle.Pos.v-8,4);
circle(turtle.Pos.h,turtle.Pos.v,15);
h=18*cos(turtle.heading*PI/180);
v=18*sin(turtle.heading*PI/180);
x=turtle.Pos.h+h;
y=turtle.Pos.v-v;
circle(x,y,3);
x=turtle.Pos.h-h;
y=turtle.Pos.v+v;
x1=turtle.Pos.h-15*cos(turtle.heading*PI/180+PI/45);
y1=turtle.Pos.v+15*sin(turtle.heading*PI/180+PI/45);
line(x,y,x1,y1);
x1=turtle.Pos.h-15*cos(turtle.heading*PI/180-PI/45);
y1=turtle.Pos.v+15*sin(turtle.heading*PI/180-PI/45);
line(x,y,x1,y1);
}
voidDisHelpMenu()
{
setcolor
(2);
outtextxy(465,55,"HELP:
");
outtextxy(465,300,"TURTLESTATE:
");
outtextxy(465,240,"STRUCTIONINPUT:
");
rectangle(465,250,510,275);
}
voidDisTState()
{
setfillstyle(SOLID_FILL,8);
bar(465,310,595,445);
setcolor
(1);
outtextxy(480,315,"Pen:
");
outtextxy(480,328,"GMode:
");
outtextxy(480,341,"Color:
");
outtextxy(480,353,"Heading:
");
outtextxy(480,365,"Position");
outtextxy(490,377,"x:
");
outtextxy(490,389,"y:
");
outtextxy(480,401,"XRange:
");
outtextxy(480,422,"YRange;");
setcolor(7);
outtextxy(520,413,"0~360");
outtextxy(520,435,"0~350");
}
voidRenovateTState()
{
char*t;
setfillstyle(SOLID_FILL,0);
bar(520,315,599,322);
setcolor(7);
if(turtle.pen==UP)
outtextxy(520,315,"UP ");
else
outtextxy(520,315,"DOWN");
bar(536,328,599,335);
if(GMODE==MODE_KEY)
outtextxy(536,328,"Key");
else
outtextxy(536,328,"Command");
bar(550,353,599,360);
sprintf(t,"%.1f",turtle.heading);
outtextxy(550,353,t);
bar(515,377,599,384);
sprintf(t,"%.2f",turtle.Pos.h-65);
outtextxy(515,377,t);
bar(515,389,599,396);
sprintf(t,"%.2f",turtle.Pos.v-75);
outtextxy(515,389,t);
setfillstyle(SOLID_FILL,turtle.color);
bar(536,341,590,348);
if(turtle.color==8)
{
setcolor(7);
rectangle(536,341,590,348);
}
}
intGetAColor()
{
intc;
OpenSecCmdWnd();
c=GetAn4BInterger();
returnc;
}
floatGetAnAngle()
{
floath;
OpenSecCmdWnd();
h=GetAn4BInterger();
returnh;
}
floatGetX(floats)
{
floatx;
x=turtle.Pos.h+s*cos(turtle.heading*PI/180);
returnx;
}
floatGetY(floats)
{
floaty;
y=turtle.Pos.v-s*si