C語言小遊戲系列--迷宮OpenGL


#include <windows.h> // Must have for Windows platform builds
//#include "gl\glee.h" // OpenGL Extension ¡°autoloader¡±
#include <gl\gl.h> // Microsoft OpenGL headers (version 1.1 by themselves)
#include <gl\glu.h> // OpenGL Utilities
#include "gl\glut.h" // Glut (Free-Glut on Windows)
#include <time.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Eas 20
#define Mid 30
#define Dif 50
double x1=0.9f,y2=-0.9f;
int HP=100,X=19,Y=19;
int map[20][20];
void drawCNString(const char* str)
{
    int len, i;
    wchar_t* wstring;
    HDC hDC = wglGetCurrentDC(); //»ñÈ¡ÏÔʾÉ豸
    GLuint list = glGenLists(1); //ÉêÇë1¸öÏÔʾÁбí
    //¼ÆËã×Ö·ûµÄ¸öÊý
    //Èç¹ûÊÇË«×Ö½Ú×Ö·ûµÄ£¨±ÈÈçÖÐÎÄ×Ö·û£©£¬Á½¸ö×Ö½Ú²ÅËãÒ»¸ö×Ö·û
    //·ñÔòÒ»¸ö×Ö½ÚËãÒ»¸ö×Ö·û
    len = 0;
    for(i=0; str[i]!='\0'; ++i)
    {
        if( IsDBCSLeadByte(str[i]) )
            ++i;
        ++len;
    }
    // ½«»ìºÏ×Ö·ûת»¯Îª¿í×Ö·û
    wstring = (wchar_t*)malloc((len+1) * sizeof(wchar_t));
    MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, str, -1, wstring, len);
    wstring[len] = L'\0';// Ö»ÊÇתÒå·û,Ëü±¾ÉíµÄÀàÐÍÊÇwchar_t
    // Öð¸öÊä³ö×Ö·û
    for(i=0; i<len; ++i)
    {
        wglUseFontBitmapsW(hDC, wstring[i], 1, list);
        glCallList(list);
    }
    // »ØÊÕËùÓÐÁÙʱ×ÊÔ´
    free(wstring);
    glDeleteLists(list, 1);
}
void RenderScene(void)
{
    if(map[X][Y]==2)
    {
        map[X][Y]=0;
        HP-=2;
    }
    else if(map[X][Y]==3) exit(0);
    glClear(GL_COLOR_BUFFER_BIT);
    //glRotatef(1.0f, 1.0f, 0.0f, 0.0f);
    //glRotatef(1.0f, 0.0f, 1.0f, 0.0f);
    glPushMatrix();
    glColor3f(1.0,1.0,1.0);
    glBegin(GL_POLYGON);
    glVertex2f(x1,y2);
    glVertex2f(x1+0.1f,y2);
    glVertex2f(x1+0.1f,y2-0.1f);
    glVertex2f(x1,y2-0.1f);
    glEnd();
    int tmp1=0,tmp2=0;
    for(double i=-1.0f; i<=1.0f; i+=0.1f)
    {
        tmp1=0;
        for(double j=1.0f; j>=-1.0f; j-=0.1f)
        {
            if(map[tmp1][tmp2]==1)
            {
                glColor3f(0.6f,0.4f,0.12f);
                glBegin(GL_POLYGON);
                glVertex2f(i,j);
                glVertex2f(i+0.1f,j);
                glVertex2f(i+0.1f,j-0.1f);
                glVertex2f(i,j-0.1f);
                glEnd();
            }
            if(map[tmp1][tmp2]==2)
            {
                glColor3f(0.0f,1.0f,0.0f);
                glBegin(GL_POLYGON);
                glVertex2f(i,j);
                glVertex2f(i+0.1f,j);
                glVertex2f(i+0.1f,j-0.1f);
                glVertex2f(i,j-0.1f);
                glEnd();
            }
            if(map[tmp1][tmp2]==3)
            {
                glColor3f(0.25f,0.25f,0.25f);
                glBegin(GL_POLYGON);
                glVertex2f(i,j);
                glVertex2f(i+0.1f,j);
                glVertex2f(i+0.1f,j-0.1f);
                glVertex2f(i,j-0.1f);
                glEnd();
            }
            tmp1++;
        }
        tmp2++;
    }
    glColor3f(1.0,1.0,1.0);
    wglUseFontBitmaps(wglGetCurrentDC(),0,256,1000);//Éú³É256¸ö×Ö·ûµÄÏÔʾÁбí
    glListBase(1000);   //ºÍÇ°Ò»Óï¾äÖеÄ1000¶ÔÓ¦
    glRasterPos2f(-1.0f,0.9f);   //Ö¸¶¨×Ö·û´®ÏÔʾµÄλÖÃ
    drawCNString("Ѫ:");
    char A[6];
    sprintf(A,"%6d",HP);
    glCallLists(6,GL_UNSIGNED_BYTE,A)   ;
    glPopMatrix();
    glutSwapBuffers();
}
void processNormalKeys(unsigned char key,int x,int y)
{
    if(key=='a'&&x1>-1.0f
            &&map[X][Y-1]!=1)
    {
        x1-=0.1f;
        Y--;
    }
    if(key=='s'&&y2>-0.9f
            &&map[X+1][Y]!=1)
    {
        y2-=0.1f;
        X++;
    }
    if(key=='d'&&x1<0.9f
            &&map[X][Y+1]!=1)
    {
        x1+=0.1f;
        Y++;
    }
    if(key=='w'&&y2<1.0f
            &&map[X-1][Y]!=1)
    {
        y2+=0.1f;
        X--;
    }
}
void abc()
{
    RenderScene();
}
void SetupRC(void)
{
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
    glColor3f(1.0f, 1.0f, 1.0f);
}
int queue[Dif+10];
int main(int argc, char* argv[])
{
    memset(map,-1,sizeof(map));
    srand(time(NULL));
    int a=19,b=19;
    for(int i=0; i<Dif; i++)
    {
        map[a][b]=rand()%2;
        if(map[a][b]==1) map[a][b]=2;
        while(1)
        {
            int x=rand()%3;
            if(x==0)
            {
                if(a==0)continue;
                if(map[a-1][b]==-1)
                {
                    a--;
                    break;
                }
            }
            else if(x==1)
            {
                if(b==0)continue;
                if(map[a][b-1]==-1)
                {
                    b--;
                    break;
                }
            }
            else if(x==2)
            {
                if(a==19)continue;
                if(map[a+1][b]==-1)
                {
                    a++;
                    break;
                }
            }
            if(a==0||b==0) break;
        }
        //system("start");
    }
    map[a][b]=3;
    for(int i=0; i<20; i++)
        for(int j=0; j<20; j++) if(map[i][j]==-1&&!(i==19&&j==19)) map[i][j]=rand()%3;
    //system("start");
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutCreateWindow("ħËþ");
    glutDisplayFunc(RenderScene);
    glutIdleFunc(abc);
    glutKeyboardFunc(processNormalKeys);
    SetupRC();
    glutMainLoop();
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章