opengl 迷宫 交互

  • a8_155423
    了解作者
  • 693KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-04-22 09:32
    上传日期
opengl 迷宫 交互
迷宫.rar
  • 迷宫
  • 源码
  • main.cpp
    9.5KB
  • maze.exe
    22KB
  • QtCore4.dll
    2.2MB
内容介绍
#include <cstdlib> #include <GL/glut.h> #include <time.h> const int RIGHT=0; const int BOTTOM=1; const int LEFT=2; const int UP=3; struct point{ GLfloat x; GLfloat y; }; struct line{ point start; //线段起始点 point end; //线段终点 int flag; //线段是否可显示 }; struct takeList{ //链表结点,存储已经走过的且还可以扩展的方格 int n; //如果是头结点,就是链表中的节点数目 int m; takeList* next; }; void myinit(); //初始化观察窗口 void display(); //显示图像 void inits(); //初始化各种变量 bool aroundIsTakable(); //判断当前周围是否可以走 int nextGrid(); //获得下一个方格的方向 void getMaze(); //产生迷宫 void addToList(); void deleteFromList(); void myMouse(int button,int state,int x,int y); const int M=30; //迷宫长度 const int N=20; //迷宫宽度 const GLfloat WIDTH=1.4; //单个方格的边长 line Hlines[N+1][M]; line Vlines[N][M+1]; int isTake[N][M]; //记录某个节点是否已经走过 bool done=false; //是否已经生成结束 int curN,curM; //当前的方格的横坐标和纵坐标 int mouseN,mouseM; //当前老鼠的横坐标和总坐标 int mouseDirection; //老鼠的朝向 takeList *head; int main(int argc,char **argv) { //以下是调用库函数 glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA); glutInitWindowSize(M*WIDTH*20,N*WIDTH*20); //设置窗口大小 glutInitWindowPosition(0,0); //设置窗口位置 glutCreateWindow("迷宫游戏"); //设置窗口名字 inits(); getMaze(); glutDisplayFunc(display); glutMouseFunc(myMouse); myinit(); glutMainLoop(); return 0; } void inits() { //头结点初始化 head=new takeList; head->n=0; head->next=NULL; //随机种子 srand(time(NULL)); //所有横线初始化 for(int i=0;i<N+1;i++) { for(int j=0;j<M;j++) { Hlines[i][j].start.x=WIDTH*j; Hlines[i][j].start.y=WIDTH*i; Hlines[i][j].end.x=WIDTH*j+WIDTH; Hlines[i][j].end.y=WIDTH*i; Hlines[i][j].flag=1; } } //所有竖线初始化 for(int i=0;i<N;i++) { for(int j=0;j<M+1;j++) { Vlines[i][j].start.x=WIDTH*j; Vlines[i][j].start.y=WIDTH*i; Vlines[i][j].end.x=WIDTH*j; Vlines[i][j].end.y=WIDTH*i+WIDTH; Vlines[i][j].flag=1; } } //初始化所有方格走过的标记 for(int i=0;i<N;i++) { for(int j=0;j<M;j++) { isTake[i][j]=0; } } //初始化第一个方格 curN=rand()%N; curM=rand()%M; isTake[curN][curM]=1; addToList(); //入口和出口初始化 Vlines[N-1][0].flag=0; //入口 Vlines[0][M].flag=0; //出口 //老鼠位置的初始化 mouseN=N-1; mouseM=0; mouseDirection=RIGHT; } void myinit() { glClearColor(1.0,1.0,1.0,1.0); //白色的背景 glColor3f(0.0,0.0,0.0); //用红色来绘制 //设置观察参数 glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-WIDTH,M*WIDTH+WIDTH,-WIDTH,N*WIDTH+WIDTH); glMatrixMode(GL_MODELVIEW); } void display() { glClear(GL_COLOR_BUFFER_BIT); //清空窗口 GLfloat p[2]; glBegin(GL_LINES); for(int i=0;i<N+1;i++) { for(int j=0;j<M;j++) { if(Hlines[i][j].flag==1) { p[0]=Hlines[i][j].start.x; p[1]=Hlines[i][j].start.y; glVertex2fv(p); p[0]=Hlines[i][j].end.x; p[1]=Hlines[i][j].end.y; glVertex2fv(p); } } } for(int i=0;i<N;i++) { for(int j=0;j<M+1;j++) { if(Vlines[i][j].flag==1) { p[0]=Vlines[i][j].start.x; p[1]=Vlines[i][j].start.y; glVertex2fv(p); p[0]=Vlines[i][j].end.x; p[1]=Vlines[i][j].end.y; glVertex2fv(p); } } } glEnd(); //画老鼠 glBegin(GL_LINE_LOOP); if(mouseDirection==RIGHT) //老鼠方向朝右边 { p[0]=mouseM*WIDTH+WIDTH*0.2; p[1]=mouseN*WIDTH+WIDTH*0.2; glVertex2fv(p); p[0]=mouseM*WIDTH+WIDTH*0.2; p[1]=mouseN*WIDTH+WIDTH-WIDTH*0.2; glVertex2fv(p); p[0]=mouseM*WIDTH+WIDTH-WIDTH*0.1; p[1]=mouseN*WIDTH+WIDTH/2; glVertex2fv(p); } if(mouseDirection==BOTTOM) { p[0]=mouseM*WIDTH+WIDTH*0.2; p[1]=mouseN*WIDTH+WIDTH-WIDTH*0.2; glVertex2fv(p); p[0]=mouseM*WIDTH+WIDTH-WIDTH*0.2; p[1]=mouseN*WIDTH+WIDTH-WIDTH*0.2; glVertex2fv(p); p[0]=mouseM*WIDTH+WIDTH/2; p[1]=mouseN*WIDTH+WIDTH*0.1; glVertex2fv(p); } if(mouseDirection==LEFT) { p[0]=mouseM*WIDTH+WIDTH-WIDTH*0.2; p[1]=mouseN*WIDTH+WIDTH-WIDTH*0.2; glVertex2fv(p); p[0]=mouseM*WIDTH+WIDTH-WIDTH*0.2; p[1]=mouseN*WIDTH+WIDTH*0.2; glVertex2fv(p); p[0]=mouseM*WIDTH+WIDTH*0.1; p[1]=mouseN*WIDTH+WIDTH/2; glVertex2fv(p); } if(mouseDirection==UP) { p[0]=mouseM*WIDTH+WIDTH*0.2; p[1]=mouseN*WIDTH+WIDTH*0.2; glVertex2fv(p); p[0]=mouseM*WIDTH+WIDTH-WIDTH*0.2; p[1]=mouseN*WIDTH+WIDTH*0.2; glVertex2fv(p); p[0]=mouseM*WIDTH+WIDTH/2; p[1]=mouseN*WIDTH+WIDTH-WIDTH*0.1; glVertex2fv(p); } glEnd(); glFlush(); } bool aroundIsTakable() { if(curN>0&&isTake[curN-1][curM]==0) //下面可用 { return true; } if(curN<N-1&&isTake[curN+1][curM]==0)//上面可用 { return true; } if(curM>0&&isTake[curN][curM-1]==0) //左面可用 { return true; } if(curM<M-1&&isTake[curN][curM+1]==0)//右面可用 { return true; } return false; } int nextGrid() { int direction; while(true) { direction=rand()%4; if(direction==RIGHT) { //判断右边是否可达 if(curM<M-1&&isTake[curN][curM+1]==0)//右面可用 { break; } } else if(direction==BOTTOM) { //判断下面是否可达 if(curN>0&&isTake[curN-1][curM]==0) //下面可用 { break; } } else if(direction==LEFT) { //判断左面是否可达 if(curM>0&&isTake[curN][curM-1]==0) //左面可用 { break; } } else if(direction==UP) { //判断上面是否可达 if(curN<N-1&&isTake[curN+1][curM]==0)//上面可用 { break; } } } return direction; } void getMaze() { while(!done) { if(aroundIsTakable()) { int direction=nextGrid(); if(direction==RIGHT) { Vlines[curN][curM+1].flag=0; curM=curM+1; } else if(direction==LEFT) { Vlines[curN][curM].flag=0; curM=curM-1; } else if(direction==UP) { Hlines[curN+1][curM].flag=0; curN=curN+1; } else if(direction==BOTTOM) { Hlines[curN][curM].flag=0; curN=curN-1; } isTake[curN][curM]=1; addToList(); } else { deleteFromList(); if(head->n==0) { done=true; } else { int num=rand()%head->n; take
评论
    相关推荐
    • 拖放交互
      拖放交互
    • 交互设计必备交互文档
      产品设计必备交互文档,产品需求必备模板,
    • vcflash交互
      vcflash交互参考,让vc界面更漂亮
    • 人机交互课件
      重庆大学人机交互课程课件 人机交互、人机互动(英文:Human–Computer Interaction或Human–Machine Interaction,简称HCI或HMI),是一门研究系统与用户之间的交互关系的学问。系统可以是各种各样的机器,也可以是...
    • 人机交互体感交互
      kinect人机交互体感交互游戏图片翻页
    • 交互工具啊
      交互工具啊
    • 交互式绘图
      实现的是鼠标交互式绘制直线,矩形,文本及不规则图形和图形的区域填充。
    • VirTools交互
      绝对是初学者的好的作品 含有源文件.nmo 知识点有摄像机,数组,按钮等