• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            天地之靈學習小組
            我們學習小組的OpenGL學習筆記 大家一定要互相折磨呀~~
            posts - 150,  comments - 156,  trackbacks - 0
            代碼進化到324行。
            今天不標記行號了,方便大家copy paste,希望能稍微地給大家點幫助。
            瓶口的二值圖已經畫好了,今天晚上畫蟲子的二值圖,稍后再畫醫生的彩圖,或者,嘿嘿,能不能麻煩糖糖畫了咱們一起用,我就偷懶一下。然后今晚的任務就是學怎樣讀取二值圖和彩圖,明天把move函數完成并debug,簡易的瑪麗醫生就差不多可以完成了,之后慢慢添加功能,做的完善點兒。
            我恨杭電,更恨我的菜。我想徹底放棄ICPC了,我不像貓什么都很強,做做算法還蠻好的。現在我的水平,最好還是老老實實地,一次只做好一件事。
            //需要蟲子的二值圖,瓶口的二值圖,醫生的彩色圖,bmp格式
            //需要學會讀取bmp格式圖片并處理
            //move函數的代碼,預計50行左右

            #include 
            <GL/glut.h>
            #include 
            <ctime>
            #include 
            <cstdlib>
            #include 
            <cstdio>

            static const int WindowWidth = 640;
            static const int WindowHeight = 480;

            int count = 0;
            int speed = 8;
            bool dead = false;

            enum GridType
            {
                NOTHING, CAPSULE, WORM
            };

            enum Connect
            {
                NOT_CONNECTED, LEFT, RIGHT, UP, DOWN
            };

            enum Color
            {
                BLACK, YELLOW, BLUE, RED
            };

            enum DoctorDirect
            {
                DD_NODIRECT, DD_UP, DD_DOWN, DD_LEFT, DD_RIGHT
            };

            void setColor( Color color )
            {
                
            switch (color)
                {
                
            case BLACK:
                    glColor3f( 
            0.0f0.0f0.0f );
                    
            break;
                
            case YELLOW:
                    glColor3f( 
            1.0f1.0f0.0f );
                    
            break;
                
            case BLUE:
                    glColor3f( 
            0.0f0.0f1.0f );
                    
            break;
                
            case RED:
                    glColor3f( 
            1.0f0.0f0.0f );
                    
            break;
                
            default:
                    
            break;
                }
            }

            class Bottle
            {
            private:
                
            int b_x,b_y; //bottle可以容納藥丸的最左上角位置
                GridType b_grid_type[16][8]; //每個格子20像素長寬
                Color b_color[16][8];
                Connect b_connect[
            16][8];
            public:
                
            int getx( void )
                {
                    
            return b_x;
                }
                
            int gety( void )
                {
                    
            return b_y;
                }
                
            void drawBottle( void )
                {
                    
            int i,j;
                    glColor3f( 
            0.0f1.0f1.0f );//青色
                    
            //**************先畫瓶口再畫瓶身******
                    
            //畫瓶子的內部,根據b_x,b_y和瓶子的內容物
                    for ( i = 0; i < 16++i )
                    {
                        
            for ( j = 0; j < 8++j )
                        {
                            setColor( b_color[i][j] );
                            
            if ( b_grid_type[i][j] == WORM )
                                drawWorm( b_x
            +i*20, b_y+j*20 );
                            
            else if ( b_grid_type[i][j] == CAPSULE )
                            {
                                drawCapsule( b_x
            +i*20+10, b_y+i*20+1010, b_connect[i][j] );
                            }
                        }
                    }
                }
                
                
            void drawCapsule( int x, int y, int r, Connect connect )
                {
                    
            //將相連的部分畫上
                    switch ( connect )
                    {
                    
            case LEFT:
                        glRectf( x
            -10, y-10, x, y+10 );
                        
            break;
                    
            case RIGHT:
                        glRectf( x, y
            -10, x+10, y+10 );
                        
            break;
                    
            case UP:
                        glRectf( x
            -10, y-10, x+10, y );
                        
            break;
                    
            case DOWN:
                        glRectf( x
            -10, y, x+10, y+10 );
                        
            break;
                    
            default:
                        
            break;
                    }
                    
            //***********畫圓并填充*********
                }

                
            void drawWorm( int x, int y )
                {
                    
            //*************從坐標x,y開始畫蟲子,20像素長寬*******************
                }

                Bottle( 
            int level, int xx, int yy )
                {
                    
            int i; //vc6這點真恨人
                    b_x = xx;
                    b_y 
            = yy;
                    
            for ( i = 0; i < 16++i )
                    {
                        
            for ( int j = 0; j < 8++j )
                        {
                            b_grid_type[i][j] 
            = NOTHING;
                            b_color[i][j] 
            = BLACK;
                            b_connect[i][j] 
            = NOT_CONNECTED;
                        }
                    }
                    
            for ( i = 0; i < level*4++i )
                    {
                        
            int x = rand()%16;
                        
            int y = rand()%8;
                        Color color 
            = (Color)(rand()%3);
                        
            if ( ok( x, y, color, level ) )
                        {
                            b_grid_type[x][y] 
            = WORM;
                            b_color[x][y] 
            = color;
                        }
                        
            else
                            
            --i;
                    }
                }
                
            bool ok( int x, int y, Color color, int level )
                {
                    
            if ( level < 15 && x <= 6 ) return false;
                    
            if ( ((level+1)>>1)+3+< 16 ) return false;
                    
            if ( x-2 >= 0 && b_grid_type[x-1][y] == WORM && b_color[x-1][y] == color 
                        
            && b_grid_type[x-2][y] == WORM && b_color[x-2][y] == color ) return false;
                    
            if ( x+2 < 8 && b_grid_type[x+1][y] == WORM && b_color[x+1][y] == color 
                        
            && b_grid_type[x+2][y] == WORM && b_color[x+2][y] == color ) return false;
                    
            if ( y+2 < 16 && b_grid_type[x][y+1== WORM && b_color[x][y+1== color 
                        
            && b_grid_type[x][y+2== WORM && b_color[x][y+2== color ) return false;
                    
            if ( b_grid_type[x][y-1== WORM && b_color[x][y-1== color 
                        
            && b_grid_type[x][y-2== WORM && b_color[x][y-2== color ) return false;
                    
            return true;
                }
            };

            class Doctor
            {
            private:
                
            int d_x,d_y; //活動藥丸(左下角)相對于瓶子的位置,不是像素點
                bool d_state; //橫的false,豎的true
                Color d_color[2]; //倆藥丸的顏色
                DoctorDirect d_direct;
            public:
                
            void drawDoctor( void )
                {
                    
            //***************畫醫生的形象*******************
                    if ( d_state )
                    {
                        bottle
            ->drawCapsule( bottle->getx()+20*d_x+10, bottle->gety()+20*d_y+10, UP );
                        bottle
            ->drawCapsule( bottle->getx()+20*d_x+10, bottle->gety()+20*d_y-10, DOWN );
                    }
                    
            else
                    {
                        bottle
            ->drawCapsule( bottle->getx()+20*d_x+10, bottle->gety()+20*d_y+10, RIGHT );
                        bottle
            ->drawCapsule( bottle->getx()+20*(d_x+1)+10, bottle->gety()+20*d_y+10, LEFT );
                    }
                }
                Doctor( 
            void )
                {
                    d_x 
            = 3; d_y = 0
                    d_state 
            = false
                    d_direct 
            = DD_NODIRECT;
                    d_color[
            0= (Color)(rand()%3);
                    d_color[
            1= (Color)(rand()%3);
                }
                
            void move( void )
                {
                    
            //*****************偽碼*********************
                    /*
                    if 下移
                    {
                        if 落地,也就是不能下移
                        {
                            if 可消
                            {
                                消除;
                                與消去相連的部分落地;
                            }
                            產生新藥;
                        }
                    }
                    else 其它方向
                        判斷是否可移,可移則移,不可移不移
                    
            */
                }
                
            void fall( void )
                {
                    d_direct 
            = DD_DOWN;
                    move();
                }
                
            void setDirect( DoctorDirect direct )
                {
                    d_direct 
            = direct;
                }
            };

            static Bottle* bottle = NULL;
            static Doctor* doctor = NULL;

            void init( void )
            {
                bottle 
            = new Bottle( 3320160 );
                doctor 
            = new Doctor();
            }

            void key( unsigned char key_char, int not_use, int not_use_1 )
            {
                
            switch ( key_char )
                {
                
            case 'w':
                
            case 'W':
                    doctor
            ->setDirect( DD_UP );
                    
            break;
                
            case 's':
                
            case 'S':
                    doctor
            ->setDirect( DD_DOWN );
                    
            break;
                
            case 'a':
                
            case 'A':
                    doctor
            ->setDirect( DD_LEFT );
                    
            break;
                
            case 'd':
                
            case 'D':
                    doctor
            ->setDirect( DD_RIGHT );
                    
            break;
                
            default:
                    doctor
            ->setDirect( DD_NODIRECT );
                    
            break;
                }
            }


            void step( void )
            {
                
            if ( dead ) return ;
                doctor
            ->move();
                
            ++count; if ( count == speed ) { count = 0; doctor->fall(); }
            }

            void timer( int not_use )
            {
                step();
                glutPostRedisplay();
                
            if ( !dead() )
                {
                    glutTimerFunc( 
            1000/speed, timer, 0 );
                }
            }

            void drawBG( void )
            {
                
            int i,j;
                glColor3f( 
            0.0f0.0f0.7f );
                
            for ( i = 0; i < 32++i )
                {
                    
            for ( j = 0; j < 30++j )
                    {
                        
            if ( ((i+j)&1== 0 )
                            glRectf( i
            *20, j*16, (i+1)*20, (j+1)*16 );
                    }
                }
            }

            void draw( void )
            {
                drawBG();
                bottle
            ->drawBottle();
                doctor
            ->drawDoctor();
            }

            void display( void )
            {
                glClear( GL_COLOR_BUFFER_BIT );
                draw();
                glutSwapBuffers();
            }

            int main( int argc, char * argv[] )
            {
                srand( (unsigned 
            int)time(NULL) );
                glutInit( 
            &argc, argv );
                glutInitDisplayMode( GLUT_RGBA
            |GLUT_DOUBLE );
                glutInitWindowPosition( 
            5050 );
                glutInitWindowSize( WindowWidth, WindowHeight );
                glutCreateWindow( 
            "Dr Mario By PureMilk" );
                glutDisplayFunc( display );
                glutKeyboardFunc( key );
                glutTimerFunc( 
            1000/speed, timer, 0 );
                gluOrtho2D( 
            0, WindowWidth, WindowHeight, 0 );
                glutMainLoop();
                
                
            return 0;
            }



            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(6)

            隨筆分類(149)

            隨筆檔案(150)

            同道中人

            搜索

            •  

            積分與排名

            • 積分 - 47509
            • 排名 - 471

            最新隨筆

            最新評論

            閱讀排行榜

            評論排行榜

            99久久99久久精品国产片果冻 | 国产伊人久久| 99久久无色码中文字幕人妻| 国产精品成人久久久久久久| 精品久久777| 久久国产精品一国产精品金尊 | 久久久久久久99精品免费观看| 国产成人精品综合久久久久| 久久婷婷五月综合97色直播| 国产亚洲色婷婷久久99精品91| 99久久精品费精品国产| 日本三级久久网| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 99re这里只有精品热久久| 青青草原精品99久久精品66| 久久人人爽人人爽人人AV| 狠狠色噜噜色狠狠狠综合久久 | 77777亚洲午夜久久多人| 精品国产乱码久久久久久呢 | 国内精品久久久久久99蜜桃| 97精品伊人久久大香线蕉app| avtt天堂网久久精品| 青青青青久久精品国产| 久久99精品国产99久久6| 久久天天躁狠狠躁夜夜2020老熟妇| 久久久久99精品成人片| 久久久久久极精品久久久| 久久午夜福利无码1000合集| 久久综合亚洲鲁鲁五月天| 久久精品国产精品亚洲毛片| 久久免费精品视频| 欧美性猛交xxxx免费看久久久| 国内精品久久久久久久久电影网 | 亚洲伊人久久大香线蕉苏妲己| 久久精品国产72国产精福利| 久久久无码精品亚洲日韩京东传媒 | 久久99精品免费一区二区| 欧美精品乱码99久久蜜桃| 国产高潮国产高潮久久久| 久久精品国产精品亚洲| 色婷婷综合久久久久中文|