10月18日_我恨杭电_By PureMilk

10月18日_我恨杭电_By PureMilk
代码进化到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.0f 0.0f 0.0f  );
        
break ;
    
case  YELLOW:
        glColor3f( 
1.0f 1.0f 0.0f  );
        
break ;
    
case  BLUE:
        glColor3f( 
0.0f 0.0f 1.0f  );
        
break ;
    
case  RED:
        glColor3f( 
1.0f 0.0f 0.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.0f 1.0f 1.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 + 10 10 , 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(  3 320 160  );
    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.0f 0.0f 0.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( 
50 50  );
    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 ;
}


你可能感兴趣的:(10月18日_我恨杭电_By PureMilk)