主题:[讨论]自己做的迷宫程序(C语言),有图形动画效果
een007
[专家分:240] 发布于 2006-07-27 09:32:00
几点说明:
1.本程序是动态的,运行后自动寻找迷宫出路
2.有什么不懂的可以在本贴留言.
3.本程序对C语言刚学完的有很大的意义.
4.四周是墙,坐标(1,1)是入口,右下脚是出口
5.若有不懂,联系QQ:274145322.
声明:本程序用VC调试是无法通过的需要修改
本程序调试工具是TC.....................
有些同志们抱怨没有注释,有注释就学不到东西了,查阅资料是非常重要的能力.
6.今日特加上注释以供大家学习。
#include "graphics.h"
#include "dos.h"
#include "stdlib.h"
#include "process.h"
#define MAX_COL 14/*定义迷宫大小*/
#define MAX_ROW 14
typedef struct
{ int vert;
int horiz;
}offsets;
mapture(int i,int j,int k);/*标记迷宫,(i,j)标记为k模式*/
initmaze();/*初始化迷宫数组*/
findmaze(int i,int j);/*找到了(i,j)可走,标记*/
mapmaze();/*画出原始迷宫*/
int findpath(int row,int col);/*递归函数,找出迷宫路径*/
mapbar();/*画出方格*/
initgrap();/*初始化VGA*/
print();/*迷宫走完后,输出是否成功 */
int startx=50,starty=50;/*画图的屏幕坐标*/
int maze[MAX_ROW][MAX_COL];
offsets move[8]={{0,1},{1,1},{-1,1},{1,0},{-1,0},{0,-1},{1,-1},{-1,-1}}; /*8个方向寻找*/
initmaze()/*初始化迷宫数组 */
{ int i,j;
for(i=0;i<MAX_ROW;i++)/*迷宫四周设置为1 代表墙*/
{ maze[i][0]=1;
maze[i][MAX_COL-1]=1;
}
for(i=0;i<MAX_COL;i++)
{ maze[0][i]=1;
maze[MAX_ROW-1][i]=1;
}
randomize();
for(i=1;i<MAX_ROW-1;i++)/*迷宫图形随机产生 1表示不通 0表示可行*/
for(j=1;j<MAX_COL-1;j++)
{
maze[i][j]=random(2);
}
}
findmaze(int i,int j)/*找到 (i,j)可走*/
{
mapture(j,i,2);/*在图形上标记*/
sleep(1);
}
returnmaze(int i,int j)/*找到(i,j)可走 ,但下一步无路走则标记*/
{
mapture(j,i,3);/*在图形上标记*/
sleep(1);
}
接后面
最后更新于:2008-03-20 23:36:00
回复列表 (共53个回复)
41 楼
OO1 [专家分:0] 发布于 2006-07-25 11:00:00
就像上面一位会员所说,必要的说明是需要的,毕竟做一个大的程序需要分工合作,
所以养成注释的习惯比较好哦!
42 楼
paobo [专家分:0] 发布于 2006-07-26 10:19:00
认真学习一下
43 楼
BMMCHEN [专家分:0] 发布于 2006-07-31 11:09:00
我是初学者,希望大家多多支持,
44 楼
BMMCHEN [专家分:0] 发布于 2006-07-31 11:11:00
[em4]怎么做的,请老师教我可以吗!
45 楼
BMMCHEN [专家分:0] 发布于 2006-07-31 11:13:00
请老师多多教导,我还是个初学的
46 楼
水冰寒河 [专家分:10] 发布于 2006-07-31 11:14:00
我运行了,不错,好像行数和列数是可以改的,我试着改了一下,运行仍然没有问题!只是慢了很多,好象没有什么方法暂停,或退出啊,只有看完,有点不好.
47 楼
huxianhui [专家分:70] 发布于 2006-07-31 12:06:00
只能观望了。唉
语言如长征。漫漫编程路
48 楼
冰幻水静 [专家分:70] 发布于 2006-08-24 15:20:00
这个程序的源码我也有!!
可以当到的!!!
还有这个!!
#include<stdlib.h>
#include<graphics.h>
#define ESC 0x011b
#define ENTER 0x1c0d
#define DOWN 0x5000
#define UP 0x4800
struct Snow/*雪的一些参数*/
{
int x;
int y;
int speed;/*雪花的速度*/
}snow[100];
struct Star/*星星的一些参数*/
{
int x;
int y;
int color;
}star[200];
int key;/*按键变量*/
int keyx,keyy;/*选项键的坐标*/
int snownum=0;/*雪的个数*/
int size;/*保存区域的大小*/
int change=10;/*变颜色有关*/
void *save1,*save2;/*保存空间*/
void Copy(void);/*保存区域*/
void DrawSnow(void);/*具体实现*/
void Pr(void);/*输出字体*/
void Choose(void);/*选择演示内容*/
void DrawStar(void);/*最后的星星效果*/
void DrawBall(int x,int y,int color);/*画选择的球体*/
void Init(void);/*图形驱动*/
void Close(void);/*图形关闭*/
void main(void)
{
Init();
Copy();
DrawSnow();/*雪花飘动*/
Choose();/*选择演示内容*/
DrawStar();/*结束画面*/
Close();
exit(0);
}
void Init(void)
{
int gd=DETECT,gm;
initgraph(&gd,&gm,"c:\\tc");
cleardevice();
}
void Close(void)/*图形关闭*/
{
getch();
closegraph();
}
49 楼
冰幻水静 [专家分:70] 发布于 2006-08-24 15:20:00
void Copy(void)/*保存区域*/
{
setcolor(0);
setfillstyle(SOLID_FILL,15);
fillellipse(200,200,4,4);
size=imagesize(196,196,204,204);/*定义保存图象区域大小*/
save1=malloc(size);/*申请空间*/
save2=malloc(size);
getimage(196,196,204,204,save1);/*保存雪花*/
getimage(96,96,104,104,save2); /*保存背景黑色*/
}
void Pr(void)/*在雪中输出文字*/
{
settextstyle(0,0,1);
if(change>=20&&change<=30||change>=50&&change<=60||
change>=100&&change<=110)/*闪烁效果*/
setcolor(YELLOW);
else
setcolor(BLACK);
outtextxy(250,250,"anykey to continue");
setcolor(change/10);/*变换颜色显示标题*/
settextstyle(0,0,3);
outtextxy(100,200,"Data Structure Demo");/*标题*/
}
/*显示雪花的具体过程*/
void DrawSnow(void)
{
int i;
int sx[62];
randomize();
for(i=0;i<62;i++) /*定义雪花的x坐标*/
sx[i]=(i+2)*10;
cleardevice();
while(!kbhit())
{
Pr();
if(snownum!=100)/*生成新的雪花*/
{
snow[snownum].speed=2+random(5);/*速度随机定,但不小于2*/
i=random(62);
snow[snownum].x=sx[i];/*随机取x坐标*/
snow[snownum].y=10-random(100);
}
for(i=0;i<snownum;i++)/*去雪*/
putimage(snow[i].x,snow[i].y,save2,COPY_PUT);
Pr(); /*显示标题*/
if(snownum!=100)
snownum++;
setfillstyle(SOLID_FILL,15);/*画雪*/
for(i=0;i<snownum;i++)
{
snow[i].y+=snow[i].speed;
putimage(snow[i].x,snow[i].y,save1,COPY_PUT);
if(snow[i].y>500)
snow[i].y=10-random(200);
}
change++;
if(change==140)/*颜色变化*/
change=10;
}
}
/*画选择的球体x和y为坐标,color为球的颜色*/
void DrawBall(int x,int y,int color)
{
setcolor(0);
setfillstyle(SOLID_FILL,color);
fillellipse(x,y+10,10,10);
}
/*选择演示函数*/
void Choose(void)
{
int yes;/*判断是否退出选项,1不退出0退出*/
int oyes=1;
while(oyes)
{
Init();
cleardevice();
yes=1;
keyx=140;
keyy=150;
setcolor(11);
rectangle(40,40,600,440);/*画边框线/
setcolor(13);
settextstyle(0,0,3);/*标题大一些*/
outtextxy(100,70,"Data Structure Demo");
settextstyle(0,0,2);/*其它选项小一些*/
setcolor(RED);
outtextxy(200,150,"hanoi tower");/*汉诺塔*/
setcolor(BLUE);
outtextxy(200,190,"double link");/*双链表*/
setcolor(GREEN);
outtextxy(200,230,"bubble sorting"); /*起泡排序*/
setcolor(YELLOW);
outtextxy(200,270,"radix sorting"); /*基数排序*/
setcolor(10);
outtextxy(200,310,"binary serach"); /*二分查找*/
setcolor(MAGENTA);
outtextxy(200,350,"binary tree"); /* 二叉树遍历*/
setcolor(WHITE);
outtextxy(200,390,"exit");/*结束程序*/
DrawBall(keyx,keyy,11);
while(yes)
/*选项的循环条件*/
{
key=bioskey(0);
if(key==ESC)/*退出系统*/
break;
if(key==UP)/*上键盘操作*/
{
DrawBall(keyx,keyy,BLACK);/*先用黑色在原来位置去除球*/
if(keyy!=150)
keyy-=40;
else
keyy=390;
DrawBall(keyx,keyy,11);/*新位置输出球*/
}
if(key==DOWN)/*下键盘操作*/
{
DrawBall(keyx,keyy,BLACK);/*先用黑色在原来位置去除球*/
if(keyy!=390)
keyy+=40;
else
keyy=150;
DrawBall(keyx,keyy,11);/*新位置输出球*/
}
if(key==ENTER)/*确定键*/
{
switch(keyy)/*判断内容*/
{
case 150:system("hanoi");yes=0;break;/*调用汉诺塔*/
case 190:system("dblink");yes=0;break;/*调用双链表*/
case 230:system("bubble");yes=0;break;/*调用起泡排序*/
case 270:system("radix");yes=0;break;/*调用基数排序*/
case 310:system("binary");yes=0;break;/*调用二分查找*/
case 350:system("tree2");yes=0;break; /*调用二叉树*/
case 390: yes=0;oyes=0;/*exit选项*/
}/*endswitch*/
} /*endenter*/
} /*endwhile*/
} /*endwhile*/
}
/*结束画面*/
void DrawStar(void)
{
int i;
cleardevice();
setcolor(GREEN);
settextstyle(0,0,2);
while(!kbhit())
{
for(i=0;i<200;i++)/*随机生成星星*/
{
star[i].x=random(640);
star[i].y=random(480);
star[i].color=random(13)+1;
}
for(i=0;i<200;i++)/*输出星星*/
{
putpixel(star[i].x,star[i].y,star[i].color);
delay(100);
}
outtextxy(100,200,"Thank you for use this system");
sleep(1);
for(i=0;i<200;i++)/*去除星星*/
{
putpixel(star[i].x,star[i].y,0);
delay(50);
}
}
}
50 楼
myem007 [专家分:0] 发布于 2006-08-30 16:29:00
怎么搞的呀,说说算法呀
我来回复