/*这个程序是学数据结构后写的,里面涉及到了栈和队列的一些操作。开始本来只是要做迷宫求解的,但就看着电脑在里面运行,没有互动性也没什么意思,于是加入了由人控制的角色,让电脑控制的角色每走一步都计算一次当前两者的最短距离去追赶人控制的角色。这个程序画地图的部分是得于网上的一个迷宫程序,汉字部分也是用的别别人写好的子程序。其实这个程序还不是很完善,开始做好了一个,却不知那儿弄丢了,假期因为参加电子设计大赛,都玩单片机去了,这方面的也忘差不多了,希望有爱好的朋友能改好了发给我.我的email:xiangyuan_122@163.com*/
/*本程序在TURBOC2.0下编译通过,**.h文件可拷在INCLUDE文件夹下.*/
#include"stdio.h"
#include"graphics.h"
#include"conio.h"
#include"mprinthz.h"
#define N 10
#define P 4
unsigned *str1="猫捉老鼠!";
unsigned *str2="嘿嘿!看你往哪跑!";
/*定义迷宫数组*/
int maze[N][N]={
1,1,1,1,1,1,1,1,1,1,
1,0,0,0,0,0,0,0,0,1,
1,0,1,1,0,1,1,1,0,1,
1,0,1,0,0,0,0,1,0,1,
1,0,1,0,1,1,0,1,0,1,
1,0,1,0,1,0,0,1,0,1,
1,0,1,0,0,0,0,1,0,1,
1,0,1,1,1,0,1,1,0,1,
1,0,0,0,0,0,0,0,0,1,
1,1,1,1,1,1,1,1,1,1};
int di[P]={0, 1, 0, -1 };
int dj[P]={1, 0, -1, 0 };
static int key;
static int step;
/*坐标结构*/
typedef struct
{
int xpos;
int ypos;
}postype;
/*队列结点结构*/
typedef struct queuenode
{
postype seat;/*当前坐标*/
struct queuenode*next;/*指向后继结点*/
struct queuenode*pre;/*指向前驱结点*/
}queuenode,*link;
static link front=NULL;
static link rear=NULL;
/*栈结点结构*/
typedef struct stack_node
{
postype sdata;
struct stack_node*next;
}stack_list,*plink;
static plink path=NULL;
/*入栈操作*/
push(postype e)
{
plink new_node;
new_node=(plink)malloc(sizeof(stack_list));
if(!new_node)
{
printf("error:not enough memory!\n");
exit(0);
}
new_node->sdata.xpos=e.xpos;
new_node->sdata.ypos=e.ypos;
new_node->next=path;
path=new_node;
}
/*出栈操作*/
postype pop()
{
postype e;
plink top;
top=path;
if(path!=NULL)
{
e.xpos=path->sdata.xpos;
e.ypos=path->sdata.ypos;
path=path->next;
free(top);
return e;
}
}
/*建立队列*/
void enqueue(postype value)
{
link newnode;
newnode=(link)malloc(sizeof(queuenode));
if(newnode==NULL)
{
printf("not enough memory!\n");
exit(0);
}
newnode->seat.xpos=value.xpos;
newnode->seat.ypos=value.ypos;
newnode->next=NULL;
if(rear==NULL)
{ front=newnode;
rear=newnode;
newnode->pre=NULL;}
else
{
newnode->pre=front;
rear->next=newnode;
rear=newnode;
}
}
/*删除队列结点*/
postype dequeue(void)
{
postype e;
front=front->next;
e.xpos=front->seat.xpos;
e.ypos=front->seat.ypos;
return e;
}
postype nextpos(postype curpos,int v)
{
postype next_;
next_.xpos=curpos.xpos+di[v];
next_.ypos=curpos.ypos+dj[v];
return next_;
}
/*标准延时*/
void Delay(int clicks)
{
unsigned int far *clock=(unsigned int far *)0x0000046CL;
unsigned int now;
now=*clock;
while(abs(*clock-now)<clicks){}
}
/*画地图*/
void picture (int maze[][N])
{
int i,j;
setbkcolor(BLACK);
for(i=0;i<N;i++)
{for (j=0;j<N;j++)
{if(maze[i][j]==1)
{setfillstyle(1,LIGHTBLUE);
bar(70+j*20,40+i*20,88+j*20,58+i*20);
}
else
{setfillstyle(1,WHITE);
bar(70+j*20,40+i*20,88+j*20,58+i*20);
}
}
}
}
main(){
int visited[N+1][N+1];/*访问标志数组*/
plink ptr;
link p,qp;
postype curpos;
postype next,out,imgcurman;
int found=0;
int i,j,curmanx,curmany;
init();
picture(maze);/*画迷宫*/
printhz(200,10,str1,2);
curmanx=N-2;
curmany=N-2;/*设置逃跑者初始位置坐标*/
setfillstyle(1,YELLOW);
bar(70+curmanx*20,40+curmany*20,88+curmanx*20,58+curmany*20);
curpos.xpos=1;
curpos.ypos=1;/*设置追赶者初始位置坐标*/
while(1)/*游戏循环*/
{
if(kbhit())/*检测按键*/
{
key=bioskey(0);
/*按键处理*/
if(key==0x4800)/*UP方向键*/
{imgcurman.xpos=curmanx;
imgcurman.ypos=curmany;/*复制逃跑者坐标*/
if(maze[imgcurman.ypos-1][imgcurman.xpos]==0)/*当前位置上方为通道*/
/*上行一步*/
{setfillstyle(1,WHITE);
bar(70+curmanx*20,40+curmany*20,88+curmanx*20,58+curmany*20);
curmany--;
setfillstyle(1,YELLOW);
bar(70+curmanx*20,40+curmany*20,88+curmanx*20,58+curmany*20);
}
}
if(key==0x5000)/*DOWN方向键*/
{imgcurman.xpos=curmanx;
imgcurman.ypos=curmany;/*复制逃跑者坐标*/
if(maze[imgcurman.ypos+1][imgcurman.xpos]==0)/*当前位置下方为通道*/
/*下行一步*/
{setfillstyle(1,WHITE);
bar(70+curmanx*20,40+curmany*20,88+curmanx*20,58+curmany*20);
curmany++;
setfillstyle(1,YELLOW);
bar(70+curmanx*20,40+curmany*20,88+curmanx*20,58+curmany*20);
}
}
if(key==0x4b00)/*LEFT方向键*/
{imgcurman.xpos=curmanx;
imgcurman.ypos=curmany;/*复制逃跑者坐标*/
if(maze[imgcurman.ypos][imgcurman.xpos-1]==0)/*当前位置左方为通道*/
/*左行一步*/
{setfillstyle(1,WHITE);
bar(70+curmanx*20,40+curmany*20,88+curmanx*20,58+curmany*20);
curmanx--;
setfillstyle(1,YELLOW);
bar(70+curmanx*20,40+curmany*20,88+curmanx*20,58+curmany*20);
}
}
if(key==0x4d00)/*RIGHT方向键*/
{imgcurman.xpos=curmanx;
imgcurman.ypos=curmany;/*复制逃跑者坐标*/
if(maze[imgcurman.ypos][imgcurman.xpos+1]==0)/*当前位置右方为通道*/
/*右行一步*/
{setfillstyle(1,WHITE);
bar(70+curmanx*20,40+curmany*20,88+curmanx*20,58+curmany*20);
curmanx++;
setfillstyle(1,YELLOW);
bar(70+curmanx*20,40+curmany*20,88+curmanx*20,58+curmany*20);
}
}
while(bioskey(1)) bioskey(0);/*清除键盘缓冲区*/
}
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
visited[i][j]=0;/*初始化访问标志*/
found=0;/*初始化追赶上标志*/
enqueue(curpos);/*追赶者当前坐标入队列*/
visited[curpos.xpos][curpos.ypos]=1;/*当前访问标志置1*/
w
hile(!found)/*如没有追上循环*/
{
for(i=0;i<P;i++)
{
next=nextpos(curpos,i);
if((maze[next.xpos][next.ypos]==0)&&(visited[next.xpos][next.ypos]==0))
{visited[next.xpos][next.ypos]=1;
if(next.xpos==curmanx&&next.ypos==curmany) found=1;
enqueue(next);
}
}
curpos=dequeue();
}
p=rear;
step=2;
while(p)
{
push(p->seat);
p=p->pre;}
while(rear){
p=rear;
rear=rear->next;
free(p);}
while(path&&step){
out=pop();
setfillstyle(1,GREEN);
bar(70+out.xpos*20,40+out.ypos*20,88+out.xpos*20,58+out.ypos*20);
Delay(2);
setfillstyle(1,WHITE);
bar(70+out.xpos*20,40+out.ypos*20,88+out.xpos*20,58+out.ypos*20);
step--;}
curpos.xpos=out.xpos;
curpos.ypos=out.ypos;
if(curpos.xpos==curmanx&&curpos.ypos==curmany)
{printhz(400,40,str2,1);
Delay(35);
printhz(400,40,str2,0);
getch();break;}
while(path){
ptr=path;
path=path->next;
free(ptr);}
}
}
Word教程网 | Excel教程网 | Dreamweaver教程网 | Fireworks教程网 | PPT教程网 | FLASH教程网 | PS教程网 |
HTML教程网 | DIV CSS教程网 | FLASH AS教程网 | ACCESS教程网 | SQL SERVER教程网 | C语言教程网 | JAVASCRIPT教程网 |
ASP教程网 | ASP.NET教程网 | CorelDraw教程网 |