1、
#include "stdafx.h"
#include
2、fine IDM_APPLICATION_BANK (103) #define MAZE_HEIGHT (16) #define MAZE_WIDTH (16) #define STARTING_POINT_X (13.5f); #define STARTING_POINT_Y (1.5f); #define STARTING_HEADING (90.0f); float player_x = STARTING_POINT_X ; float player_y = STARTING_POINT_Y ; float player_h = STARTING_HEADIN
3、G ; // player's heading float player_s = 0.0f; // forward speed of the player float player_m = 1.0f; // speed multiplier of the player float player_t = 0.0f; // player's turning (change in heading) float player_b = 0.0f; // viewpoint bank (roll) static float texcoordX=0.0f; int wallli
4、st=0; int mazelist=0; int balllist=0; int status=1; bool searchroute=false; bool keystate[4]={false,false,false,false}; char mazedata[MAZE_HEIGHT][MAZE_WIDTH] = { {'H','H','H','H','H','H','H','H','H','H','H','H','H','H','H','H'}, {'H',' ',' ',' ',' ',' ',' ',' ','H',' ',' ',' ','
5、 ',' ',' ','H'}, {'H',' ','H',' ','H','H','H',' ','H',' ','H',' ',' ',' ',' ','H'}, {'H',' ','H','H',' ',' ','H',' ','H','H',' ','H',' ','H',' ','H'}, {'H',' ',' ',' ',' ',' ','H',' ',' ',' ',' ',' ',' ','H',' ','H'}, {'H',' ','H','H','H','H','H','H','H','H',' ','H','H','H',' ','
6、H'}, {'H',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','H',' ',' ','H'}, {'H',' ','H','H','H','H','H',' ','H','H','H',' ','H','H','H','H'}, {'H',' ','H',' ',' ',' ','H',' ',' ',' ','H',' ',' ',' ',' ','H'}, {'H',' ',' ',' ','H','H','H','H','H','H','H',' ',' ',' ',' ','H'}, {'
7、H',' ','H',' ',' ',' ','H',' ',' ',' ','H',' ',' ','H',' ','H'}, {'H',' ','H','H','H','H','H',' ','H','H','H','H',' ','H',' ','H'}, {'H',' ',' ',' ',' ',' ','H',' ',' ',' ',' ',' ',' ','H',' ','H'}, {'H',' ',' ','H','H',' ','H','H','H','H',' ','H','H','H',' ','H'}, {'H',' ',' ','
8、 ','H',' ','H',' ',' ',' ',' ','H',' ',' ',' ','H'}, {'H','H','H','H','H','H','H','H','H','H','H','H','H',' ','H','H'}, }; void myinit() { glClearColor(0.5f, 0.5f, 0.5f, 0.0f); glColor3f(1.0,1.0,1.0); glEnable(GL_DEPTH_TEST); glEnable(GL_TEXTURE_2D); walllist=glGenLists(2); mazel
9、ist=walllist+1; balllist=walllist+2; glNewList(walllist,GL_COMPILE); drawwalls(); glEndList(); glNewList(mazelist,GL_COMPILE); drawtop(); glEndList(); glNewList(balllist,GL_COMPILE); drawball(); glEndList(); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPers
10、pective(60.0, 1.0 , 0.1, 60.0);
glMatrixMode(GL_MODELVIEW);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//Ê¹ÎÆÀí²»±äÐÎ
}
bool wall(int x,int y) {
return (x>=0 && y>=0 && x 11、
return(mazedata[y][x]=='H');
}
}
void closeit(int x,int y) {
if(onopen(x,y))
{
mazedata[y][x]= 'X';
}
}
bool neighbor(int x,int y,int w,int *nx,int *ny){
switch(w) {
case 0:
*nx = x-1; *ny=y; break;
case 1:
12、 *nx = x; *ny=y+1; break;
case 2:
*nx = x+1; *ny=y; break;
case 3:
*nx = x; *ny=y-1; break;
default:
break;
}
return wall(*nx,*ny);
}
bool diagnal(int x,int y,int w,int *nx,int *ny){
switch(w) {
13、 case 0:
*nx = x-1; *ny=y-1; break;
case 1:
*nx = x-1; *ny=y+1; break;
case 2:
*nx = x+1; *ny=y+1; break;
case 3:
*nx = x+1; *ny=y-1; break;
default:
break;
}
return 14、wall(*nx,*ny);
}
void dw(int x,int y,int p) {
int w=p;
closeit(x,y);
do{
int x2=0;
int y2=0;
if(neighbor(x,y,w,&x2,&y2)){
if(onopen(x2,y2)) {
dw(x2,y2,(w+3)%4);
}
else {
if((w+1)%4 ==p)
{
return ;
}
}
}
else {
15、 float fx;
float fy;
if(diagnal(x,y,w,&x2,&y2) && onopen(x2,y2)) {
dw(x2,y2,(w+2)%4);
}
texcoordX=(texcoordX<0.5)?1.0f:0.0f;
fx = (float)x+((w==1||w==2)?1.0f:0.0f);
fy = (float)y+((w==0||w==1)?1.0f:0.0f);
glTexCoord2f(texcoordX,0.0f);
16、 glVertex3f(fx,fy,0.0f);
glTexCoord2f(texcoordX,1.0f);
glVertex3f(fx,fy,1.0f);
}
w++;w%=4;
}while (w!=p);
return ;
}
void drawwalls() {
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUAD_STRIP);
glColor3f(1.0,1.0,1.0);
glVertex3f(0.0f, 0.0f, 0.0f);
17、 glVertex3f(0.0f, 0.0f, 1.0f);
dw(0,0,0);
glEnd();
}
void drawtop() {
int x,y;
glBegin(GL_QUADS);
for(y=0;y 18、x+1.0f ,y+0.0f ,1.0f );
glVertex3f(x+1.0f ,y+1.0f ,1.0f );
glVertex3f(x+0.0f ,y+1.0f ,1.0f );
}
}
}
glEnd();
}
void forward(float px,float py,float bf) {
int x = ((int)player_x);
int y = ((int)player_y);
int h=0; 19、
if((px> x+1.0f - bf) && wall(x+1,y)) {
px = (float)(x)+1.0f-bf;
h++;
}
if(py> y+1.0f-bf && wall(x,y+1)) {
py = (float)(y)+1.0f-bf;
h++;
}
if(px< x+bf && wall(x-1,y)) {
px = (float)(x)+bf;
h++;
}
if(py< y+bf 20、 wall(x,y-1)) {
py = (float)(y)+bf;
h++;
}
player_x=px;
player_y=py;
}
void drawball()
{
glDisable(GL_TEXTURE_2D);
glColor3f(1.0,0.0,0.0);
glutSolidSphere(0.2f,15,15);
}
void navmaze1()
{
forward(player_x+player_s*(float)sin(player_h*3. 21、14/180),
player_y+player_s*(float)cos(player_h*3.14/180),0.2f);
cout< 22、0f,1.0f,0.0f,0.0f);
glRotatef(player_h,0.0f,0.0f,1.0f);
glTranslatef(-player_x,-player_y,-0.5f);
glCallList(walllist);
glPopMatrix();
}
void navmaze2()
{
forward(player_x+player_m*player_s*(float)sin(player_h*3.14/180),
player_y+player_m*player_s*(float)cos( 23、player_h*3.14/180),0.2f);
cout< 24、f,1.0f);
glTranslatef(-MAZE_WIDTH /2,-MAZE_HEIGHT/2,-0.5f);
glCallList(walllist);
glCallList(mazelist);
glPushMatrix();
glTranslatef(player_x,player_y,0.5f);
glCallList(balllist);
glPopMatrix();
glPopMatrix();
}
void myDisplay()
{
if(status==1)
{
if(search 25、route==true)
{
}
else navmaze1();
}
if(status==3)
{
if(searchroute==true)
{
}
else navmaze2();
}
glFlush();
glutSwapBuffers();
}
void myReshape(int w, int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatr 26、ixMode(GL_MODELVIEW);
glLoadIdentity();
glutPostRedisplay();
}
void specialKeys(int key,int x,int y)
{
switch (key)
{
case GLUT_KEY_LEFT:
keystate[2] = true;
player_t = -2.0f;
break;
case GLUT_KEY_RIGHT:
keystate[3] = true;
player_t = 2.0f 27、
break;
case GLUT_KEY_UP:
keystate[0] = true;
player_s = 0.01f;
break;
case GLUT_KEY_DOWN:
keystate[1] = true;
player_s = -0.01f;
break;
default:break;
}
}
void keyboard(unsigned char key,int x,int y)
{
switch (key)
{
case '1' 28、
status=1;
break;
case '3':
status=3;
break;
default:break;
}
glutPostRedisplay();
}
void upSpecialKeyboard(int key,int x,int y)
{
switch (key)
{
case GLUT_KEY_LEFT:
keystate[2] = false;
player_t = 0.0f;
break;
case GLUT_KEY_R 29、IGHT:
keystate[3] = false;
player_t = 0.0f;
break;
case GLUT_KEY_UP:
keystate[0] = false;
player_s = 0.0f;
break;
case GLUT_KEY_DOWN:
keystate[1] = false;
player_s = 0.0f;
break;
default:break;
}
// glutPostRedisplay();
}
void 30、 idle()
{
if(keystate[0]||keystate[1]||keystate[2]||keystate[3]) glutPostRedisplay();
else{}
}//ÊͷŰ´¼üºó¾Í½øÈë¿ÕÏÐ״̬£¬Èç¹û¿ÕÏÐ״̬²»Ò»Ö±Öظ´»æÍ¼£¬¾Í»á»ÃæÍ£ÖÍ¡£´Î·½·¨È±µãÊÇ¿ªÏúºÜ´ó
void main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode (GLUT_DOU 31、BLE | GLUT_RGB);
glutInitWindowSize(500, 500);
glutCreateWindow("polygon modeler");
glutDisplayFunc(myDisplay);
myinit ();
glutSpecialFunc(specialKeys);
glutKeyboardFunc(keyboard);
glutSpecialUpFunc(upSpecialKeyboard);
glutIdleFunc(idle);
glutMainLoop();
}






