电脑鼠 迷宫 仿真程序 mouse.docx
- 文档编号:6338858
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:34
- 大小:24.83KB
电脑鼠 迷宫 仿真程序 mouse.docx
《电脑鼠 迷宫 仿真程序 mouse.docx》由会员分享,可在线阅读,更多相关《电脑鼠 迷宫 仿真程序 mouse.docx(34页珍藏版)》请在冰豆网上搜索。
电脑鼠迷宫仿真程序mouse
原链接:
侵权请说明即删!
/*******************************************************************************
**程序名称:
电脑鼠模拟环境V5.0
**功能描述:
电脑鼠走迷宫的模拟软件,探索迷宫速度超快,迅速找到终点;
注意:
迷宫中心是终点。
本程序使用Win-TC编译,图形界面。
下载本程序后将后缀名改为.c,即可在Win-TC下编译。
**程序作者:
宋元瑞
**修改日期:
2010年10月1日
*******************************************************************************/
#include
#include
#include
#include
typedefunsignedlongintuint32;
#defineclosegrclosegraph
#defineESC0x011b
#defineBLANK14624
#defineUP0x01/*上有墙*/
#defineDOWN0x02
#defineLEFT0x04
#defineRIGHT0x08
#defineX25/*迷宫单位规格,实物18*/
/*#defineW20迷宫宽度WIDE,实物16.8*/
/*#defineL25迷宫长度LENGTH,实物18*/
#defineN16/*迷宫规格16×16,实物同*/
#defineXfore120/*迷宫x离屏幕边缘的距离*/
#defineYfore40/*迷宫y离屏幕边缘的距离*/
#definemenuWidth120/*菜单的宽度*/
#definemenuHight25/*菜单的高度*/
/*#defineZ1.5屏幕放大1.5倍*/
intfirst=1;
intmousex,mousey;/*鼠标的坐标*/
volatileintxnow=15,ynow=0;/*电脑鼠的当前x,y坐标*/
intstepnum=0;
intstart=0;
inttemptime=0;
uint32gezi[16][16];/*每个格子的信息存储器,16个x16个y,用一个32位二进制数的后四位表示墙壁信息(只用这4位)*/
/*0001=UP
0010=DOWN
0100=LEFT
1000=RIGHT
将这些数字与gezi[][]的值进行&运算,即可获得墙壁信息
0001=UP
____
||
0100=LEFT|↓|1000=RIGHT
|____|
0010=DOWN
*/
uint32mouse[16][16];/*用于电老鼠在循迹时接收gezi传过来的墙壁信息,并保存。
(只用后四位,探测后的墙壁信息供shortroad分析)*/
uint32shortroad[16][16];/*存储等高线值*/
uint32road[16][16];/*电脑鼠探测到的区域*/
intmenuXa=0,menuYa1=65,menuYa2=100,menuYa3=200;/*左侧菜单的坐标*/
intmenu1=1,menu2=0;/*初始化菜单有效性,menu1为1(有效),menu2为0(无效)*/
unionREGSregs;/*鼠标中断*/
/*******************************************************************************
**BGI初始化函数initgr
*******************************************************************************/
voidinitgr(void)
{
intgd=DETECT,gm=0;/*和gd=VGA,gm=VGAHI是同样效果*/
registerbgidriver(EGAVGA_driver);/*注册BGI驱动后可以不需要.BGI文件的支持运行*/
initgraph(&gd,&gm,"");
setbkcolor(BLACK);
}
/*******************************************************************************
**鼠标函数drawmouse
*******************************************************************************/
voiddrawmouse(intx,inty,intfl)
{
int*buf;
intsize;
if(x<=5)/*防止鼠标到达屏幕上边界时候出错,以免程序异常退出(异常原因:
getimage函数找不到屏幕外的图像来保存)*/
{x=5;}
if(x>=630)
{x=630;}
if(y<5)
{y=5;}
size=imagesize(x-5,y-5,x+15,y+15);/*让内存分配大点*/
buf=malloc(size);
if(first==0)/*后续运行时*/
{
if(fl==0)/*后续运行的第一部分运行时*/
{delay(10000);
putimage(x-5,y-5,buf,COPY_PUT);
free(buf);
}
}
if(fl==1)/*每次运行的第二部分运行时*/
{
getimage(x-5,y-5,x+5,y+5,buf);
setcolor(RED);
setfillstyle(11,YELLOW);
line(x,y-5,x,y+5);/*十字形鼠标*/
line(x-5,y,x+5,y);
free(buf);
first=0;/*如果是首次运行,结束标记首次运行,进入后续运行标记*/
}
}
/*******************************************************************************
**画初始迷宫函数ground
*******************************************************************************/
intground(intxbegin,intybegin,intxend,intyend)
{
inti,j;
cleardevice();
xbegin=Xfore+xbegin;xend=Xfore+xend;/*对4个边界点增加边界距离*/
ybegin=Yfore+ybegin;yend=Yfore+yend;
setbkcolor(LIGHTBLUE);
setfillstyle(1,LIGHTRED);/*画出四周边框*/
bar(xbegin-1,ybegin-1,xend+1,yend+1);
setfillstyle(1,WHITE);
bar(xbegin+2,ybegin+2,xend-2,yend-2);
setlinestyle(0,0,3);/*3点宽实心线*/
setcolor(LIGHTRED);
for(i=1;i { line(xbegin,ybegin+i*25,xend,ybegin+i*25); } for(i=1;i { line(xbegin+i*25,ybegin,xbegin+i*25,yend); } /*画菜单*/ setcolor(YELLOW); outtextxy(menuXa+30,menuYa1+10,"offwall"); outtextxy(menuXa+30,menuYa2+10,"putwall"); setfillstyle(1,WHITE); setcolor(WHITE); fillellipse(menuXa+16,menuYa1+13,5,5); fillellipse(menuXa+16,menuYa2+13,5,5); setcolor(LIGHTRED); /*画autoWall按钮*/ setfillstyle(1,DARKGRAY); bar(menuXa+25,menuYa3,menuXa+95,menuYa3+30); setfillstyle(1,YELLOW); bar(menuXa+22,menuYa3-3,menuXa+92,menuYa3+27); outtextxy(menuXa+26,menuYa3+8,"AutoWall"); /*画MouseGo按钮*/ setfillstyle(1,DARKGRAY); bar(menuXa+25,menuYa3+45,menuXa+95,menuYa3+45+30); setfillstyle(1,YELLOW); bar(menuXa+22,menuYa3+45-3,menuXa+92,menuYa3+45+27); outtextxy(menuXa+30,menuYa3+45+8,"MouseGo"); /*画GetShort按钮*/ setfillstyle(1,DARKGRAY); bar(menuXa+25,menuYa3+45+45,menuXa+95,menuYa3+45+45+30); setfillstyle(1,YELLOW); bar(menuXa+22,menuYa3+45+45-3,menuXa+92,menuYa3+45+45+27); outtextxy(menuXa+27,menuYa3+45+45+8,"GetShort"); } /******************************************************************************* **在第n位写0的子函数write0 *******************************************************************************/ voidwrite0(intplace,uint32*p)/*传值引用参数*p*/ { (*p)=(*p)&(~(1< } /******************************************************************************* **在第n位写1的子函数write1 *******************************************************************************/ voidwrite1(intplace,uint32*p)/*传值引用参数*p*/ { (*p)=(*p)|(1< } /******************************************************************************* **在第n位读0、1的子函数read;返回值为0或1 *******************************************************************************/ uint32read(intplace,uint32it) { return(((it>>place)&1)); } /******************************************************************************* **在第n位开始读4个位上0、1的子函数readng;返回值为读取的4个位上的值 *******************************************************************************/ uint32read4(intbeginplace,uint32it) { return(((it>>beginplace)&0x0f)); } /******************************************************************************* **检查(后四位)有无墙壁的子函数seewall;返回值为UPDOWNRIGHTLEFT *******************************************************************************/ intseewall(uint32it,intwhich) { if(which==UP) {if((it&UP)==UP){return(UP);}else{return(0);}} if(which==DOWN) {if((it&DOWN)==DOWN){return(DOWN);}else{return(0);}} if(which==LEFT) {if((it&LEFT)==LEFT){return(LEFT);}else{return(0);}} if(which==RIGHT) {if((it&RIGHT)==RIGHT){return(RIGHT);}else{return(0);}} } /******************************************************************************* **ifbranch(): 查询该格点是否为分支点,是返回1,否返回0 *******************************************************************************/ intifbranch(it) { intnowalls=0; if(0==read(0,it)){nowalls++;} if(0==read(1,it)){nowalls++;} if(0==read(2,it)){nowalls++;} if(0==read(3,it)){nowalls++;} if(nowalls>1) {return (1);} else {return(0);} } /******************************************************************************* **检测当前格子是否还有未探测的分支,若有就返回二进制相应位上的1,没有返回0 *******************************************************************************/ uint32havenewroad(uint32it) {/*返回值说明: 二进制第一位上的1——A墙,第二位上的1——B墙 第三位上的1——C墙,第四位上的1——D墙 (第0位上的1不用)*/ /*备注: 无需预防迷宫边界格点+-会超出迷宫的情况,因为边界点使0==read(x,it)不成立*/ uint32newroad=0; if(0==read(0,it)&&0==read4(4,mouse[xnow][ynow-1]))/*如果A面无墙,并且上面的格子没有来自的方向(未被探测)*/ {newroad=1<<1;/*printf("1-%d,",read4(4,mouse[xnow][ynow-1]));*/} if(0==read(1,it)&&0==read4(4,mouse[xnow][ynow+1])) {newroad=newroad|(1<<2);/*printf("2-%d,",read4(4,mouse[xnow][ynow-1]));*/} if(0==read(2,it)&&0==read4(4,mouse[xnow-1][ynow])) {newroad=newroad|(1<<3);/*printf("3-%d,",read4(4,mouse[xnow][ynow-1]));*/} if(0==read(3,it)&&0==read4(4,mouse[xnow+1][ynow])) {newroad=newroad|(1<<4);/*printf("4-%d,",read4(4,mouse[xnow][ynow-1]));*/} /*printf("%d",newroad);*/ return(newroad); } /******************************************************************************* **标记探测到的上下左右的某一方面有墙壁,分别标记第0123位为1 *******************************************************************************/ uint32touchwall(intwhichside,uint32*it) { switch(whichside)/*哪一个方面有墙*/ { case0: write1(0,it); break; case1: write1(1,it); break; case2: write1(2,it); break; case3: write1(3,it); break; default: break; } } /******************************************************************************* **在beginplace开始的位写ng个0 *******************************************************************************/ voidwriteng0(intbeginplace,intng,uint32*it) { switch(ng) { case1: write0(beginplace,it); break; case2: write0(beginplace,it); write0(beginplace+1,it); break; case3: write0(beginplace,it); write0(beginplace+1,it); write0(beginplace+2,it); break; case4: write0(beginplace,it); write0(beginplace+1,it); write0(beginplace+2,it); write0(beginplace+3,it); break; default: break; } } /******************************************************************************* **横墙函数heng *******************************************************************************/ intheng(intx,inty,intshow)/*show=1表示画墙,show=0表示去墙*/ { intxx=0,yy=0; setlinestyle(0,0,3);/*3点宽实心线*/ if(show==1) {setcolor(LIGHTRED);gezi[x][y]|=DOWN;/*|0010本gezi画下墙信息*/ gezi[x][y+1]|=UP;/*|0001下邻格画上墙信息*/ } if(show==0) {setcolor(WHITE);gezi[x][y]&=~DOWN;/*&1101本gezi去下墙信息*/ gezi[x][y+1]&=~UP;/*&1110下邻格去上墙信息*/ } if(show==2)/*TEST*/ { setcolor(GREEN); } /*以下两行相当于电脑鼠通过传感器探测到墙壁信息*/ mouse[x][y]=mouse[x][y]&gezi[x][y]; mouse[x][y+1]=mouse[x][y+1]&gezi[x][y+1]; xx=(x)*X+Xfore; yy=(y+1)*X+Yfore; if(show==2) line(xx+2,yy,xx+X-2-15,yy); else line(xx+2,yy,xx+X-2,yy);/*设置本gezi下面的横墙*/ /*printf("x=%d,y=%d;;",xx,yy);*/ } /******************************************************************************* **竖墙函数shu *******************************************************************************/ intshu(intx,inty,intshow)/*show=1表示画墙,show=0表示去墙*/ { intxx=0,yy=0; setlinestyle(0,0,3);/*3点宽实心线*/ if(show==1) {setcolor(LIGHTRED);gezi[x][y]|=RIGHT;/*|1000本gezi画右墙信息*/ gezi[x+1][y]|=LEFT;/*|0100右邻格画左墙信息*/ } if(show==0) {setcolor(WHITE);gezi[x][y]&=~RIGHT;/*&0111本邻格去右墙信息*/ gezi[x+1][y]&=~LEFT;/*&1011右邻格去左墙信息*/ } if(show==2)/*TEST*/ { setcolor(GREEN); } /*以下两行相当
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电脑鼠 迷宫 仿真程序 mouse 电脑 仿真 程序