bananapi+OLED做的一个打地鼠游戏,c语言编程

说明一下:
BPI是对拍死的BPI的计数,对应最终的成绩
RANK是难度 数值越低难度越高 每当打死10个BPI以后就会减一即难度高一级 默认初始化RANK等于15 
DIE是存在的BPI数量,一旦数量大于或者等于5就GameOver了..........
最后会把最终成绩打印在屏幕和终端上。


下面仅仅是主函数代码:

int main(int argc,char **argv)
{
    byte xx=0,yy=0,BPI[8]={0,0,0,0,0},A_BPI_Start[8]={0,0,0,0,0},A_BPI_Stop[8]={0,0,0,0,0},A_BPI_ii=0;
    byte AA0=0,AA1=0,AA2=0,AA3=0,AA4=0,AA5=0,AA6=0,AA7=0,Rank=15,NumString_Rank[10]={0,0,0,0,0,0,0,0,0,0},NumString_BPI[10]={0,0,0,0,0,0,0,0,0,0};
    byte NumString_Die_Cnt[10];
    byte Die_Cnt[8]={0,0,0,0,0},Die_Num=0,ca=0;
    dword CNT=1,Rand_Cnt=0,BPI_Cnt=0;
    pthread_t pid1, pid2; //thread

    LCD_Init();

     

    Num2String(BPI_Cnt,3,NumString_BPI);
    Num2String(Rank,3,NumString_Rank);
    if(pthread_create(&pid1, NULL, thread_mice, NULL))
    {
        return -1;
    }
    Draw_BMP(bananapi);
    sleep(2);
    Draw_BMP(gImage_start);
    sleep(1);
    Draw_BMP(gImage_start);
    sleep(1);
    Draw_BMP(gImage_anykey);
     
    while(1)
    {
         if(Left_Check==1)
         {
             Left_Check=0;
             break;
         }
    }
    srand((int) time(0));
    while(1)
    {
      if(Pos_Mark)
      {
           
          if(X_LCD_Pos>119)X_LCD_Pos=119;
          if(Y_LCD_Pos>55)Y_LCD_Pos=55;
           
          old_X_LCD_Pos=X_LCD_Pos;
          old_Y_LCD_Pos=Y_LCD_Pos;
          Pos_Mark = 0;
      }
       
      CNT++;
      Rand_Cnt++;
      Num2String(Die_Num,1,NumString_Die_Cnt);
      LCD_W_BMP(0,16,24,24,gImage_A_BPI[BPI[0]],1);
      LCD_W_BMP(30,16,24,24,gImage_A_BPI[BPI[1]],1);
      LCD_W_BMP(60,16,24,24,gImage_A_BPI[BPI[2]],1);
      LCD_W_BMP(90,16,24,24,gImage_A_BPI[BPI[3]],1);
       
      LCD_W_BMP(0,40,24,24,gImage_A_BPI[BPI[4]],1);
      LCD_W_BMP(30,40,24,24,gImage_A_BPI[BPI[5]],1);
      LCD_W_BMP(60,40,24,24,gImage_A_BPI[BPI[6]],1);
      LCD_W_BMP(90,40,24,24,gImage_A_BPI[BPI[7]],1);
       
      LCD_P6x8Str(0,0,"BPI:",1);
      LCD_P6x8Str(0,1,"RANK:",1);
      LCD_P6x8Str(60,1,"DIE:",1);
      LCD_P6x8Str(60,0,"Whac-a-BPI",1);
      LCD_P6x8Str(30,0,NumString_BPI,1);
      LCD_P6x8Str(30,1,NumString_Rank,1);
      LCD_P6x8Str(90,1,NumString_Die_Cnt,1);
       
      LCD_W_BMP(X_LCD_Pos,Y_LCD_Pos,8,8,OLED_mice,1);
       
      Draw_BMP(LCD_Buffer);
      LCD_W_BMP(old_X_LCD_Pos,old_Y_LCD_Pos,8,8,OLED_mice,0);
       
       
       
      LCD_P6x8Str(0,0,"BPI:",0);
      LCD_P6x8Str(0,1,"RANK:",0);
      LCD_P6x8Str(90,1,"DIE:",0);
      LCD_P6x8Str(60,0,"Whac-a-BPI",1);
      LCD_P6x8Str(30,0,NumString_BPI,0);
      LCD_P6x8Str(30,1,NumString_Rank,0);
      LCD_P6x8Str(80,1,NumString_Die_Cnt,0);
       
      LCD_W_BMP(0,16,24,24,gImage_A_BPI[BPI[0]],0);
      LCD_W_BMP(30,16,24,24,gImage_A_BPI[BPI[1]],0);
      LCD_W_BMP(60,16,24,24,gImage_A_BPI[BPI[2]],0);
      LCD_W_BMP(90,16,24,24,gImage_A_BPI[BPI[3]],0);
       
      LCD_W_BMP(0,40,24,24,gImage_A_BPI[BPI[4]],0);
      LCD_W_BMP(30,40,24,24,gImage_A_BPI[BPI[5]],0);
      LCD_W_BMP(60,40,24,24,gImage_A_BPI[BPI[6]],0);
      LCD_W_BMP(90,40,24,24,gImage_A_BPI[BPI[7]],0);
         
      if(Rand_Cnt >= Rank)
      {
          Rand_Cnt=0;
          switch(rand()%8)
          {
              case 0:if(A_BPI_Stop[0]==0) A_BPI_Stop[0]=1,A_BPI_Start[0]=1;break;
              case 1:if(A_BPI_Stop[1]==0) A_BPI_Stop[1]=1,A_BPI_Start[1]=1;break;
              case 2:if(A_BPI_Stop[2]==0) A_BPI_Stop[2]=1,A_BPI_Start[2]=1;break;
              case 3:if(A_BPI_Stop[3]==0) A_BPI_Stop[3]=1,A_BPI_Start[3]=1;break;
              case 4:if(A_BPI_Stop[4]==0) A_BPI_Stop[4]=1,A_BPI_Start[4]=1;break;
              case 5:if(A_BPI_Stop[5]==0) A_BPI_Stop[5]=1,A_BPI_Start[5]=1;break;
              case 6:if(A_BPI_Stop[6]==0) A_BPI_Stop[6]=1,A_BPI_Start[6]=1;break;
              case 7:if(A_BPI_Stop[7]==0) A_BPI_Stop[7]=1,A_BPI_Start[7]=1;break;
              default:break;      
          }
      }
      if(CNT==2)
      {
          for(A_BPI_ii=0;A_BPI_ii<8;A_BPI_ii++)
          {
              if(A_BPI_Start[A_BPI_ii]==1)  
              {
                    if(BPI[A_BPI_ii]<4)BPI[A_BPI_ii]++;
                    else
                    {
                        Die_Num++;
                        A_BPI_Start[A_BPI_ii]=2;
                    }
                         
              }        
              if(A_BPI_Stop[A_BPI_ii]==2)
              {
                  if(BPI[A_BPI_ii]<8)
                      BPI[A_BPI_ii]++;
                  else
                  {
                        BPI[A_BPI_ii]=0;
                        A_BPI_Stop[A_BPI_ii]=0;
                        A_BPI_Start[A_BPI_ii]=0;
                  }
              }
                       
          }
          if(Right_Check==1)
          {
              LCD_Init();
              Right_Check=0;
          }
          if(Left_Check==1)
          {
              if( 4 <Left_Check_X&& 24 >Left_Check_X&& 18 <Left_Check_Y&&35>Left_Check_Y&&A_BPI_Stop[0]==1)
              {
                      A_BPI_Stop[0]=2;
                      BPI[0]=5;
                      BPI_Cnt++;
                      Die_Num--;
                      ca=1;
              }
              else if( 34 <Left_Check_X&& 49 >Left_Check_X&& 18 <Left_Check_Y&& 35 >Left_Check_Y&&A_BPI_Stop[1]==1)
              {
                  A_BPI_Stop[1]=2;
                  BPI[1]=5;
                  BPI_Cnt++;
                  Die_Num--;
                  ca=1;
              }  
              else if( 63 <Left_Check_X&& 80 >Left_Check_X&& 18 <Left_Check_Y&& 35 >Left_Check_Y&&A_BPI_Stop[2]==1)
              {
                  A_BPI_Stop[2]=2;
                  BPI[2]=5;
                  BPI_Cnt++;
                  Die_Num--;
                  ca=1;
              }  
              else if( 93 <Left_Check_X&& 109 >Left_Check_X&& 18 <Left_Check_Y&& 35 >Left_Check_Y&&A_BPI_Stop[3]==1)
              {
                  A_BPI_Stop[3]=2;
                  BPI[3]=5;
                  BPI_Cnt++;
                  Die_Num--;
                  ca=1;
              }  
              else if( 4 <Left_Check_X&& 24 >Left_Check_X&& 43 <Left_Check_Y&&67>Left_Check_Y&&A_BPI_Stop[4]==1)
              {
                  A_BPI_Stop[4]=2;
                  BPI[4]=5;
                  BPI_Cnt++;
                  Die_Num--;
                  ca=1;
              }
              else if( 34 <Left_Check_X&& 49 >Left_Check_X&& 43 <Left_Check_Y&& 67 >Left_Check_Y&&A_BPI_Stop[5]==1)
              {
                  A_BPI_Stop[5]=2;
                  BPI[5]=5;
                  BPI_Cnt++;
                  Die_Num--;
                  ca=1;
              }  
              else if( 63 <Left_Check_X&& 80 >Left_Check_X&& 43 <Left_Check_Y&& 67 >Left_Check_Y&&A_BPI_Stop[6]==1)
              {
                  A_BPI_Stop[6]=2;
                  BPI[6]=5;
                  BPI_Cnt++;
                  Die_Num--;
                  ca=1;
              }  
              else if( 93 <Left_Check_X&& 109 >Left_Check_X&& 43 <Left_Check_Y&& 67 >Left_Check_Y&&A_BPI_Stop[7]==1)
              {
                  A_BPI_Stop[7]=2;
                  BPI[7]=5;
                  BPI_Cnt++;
                  Die_Num--;
                  ca=1;
              }  
              if(ca)
              {
                  if(!(BPI_Cnt%11)) Rank--;
                  Num2String(BPI_Cnt,3,NumString_BPI);
                  Num2String(Rank,3,NumString_Rank);
                  Left_Check=0;
                  ca=0;
              }
          }

          CNT=0;
      }
      if(Die_Num>=5)
      {
       
            Draw_BMP(gImage_gameover);
            LCD_P8x16Str(75,5,NumString_BPI);
            printf("Game Score:%d
",BPI_Cnt);
            return 0;
      }
    }
    return 0;
}

  使用软SPI驱动OLED,有时会出现花屏的现象,一直没查明白这个bug原因也就先这样了....视频里也可以看到突然会全屏花.为了继续游戏我把右击鼠标写成了对OLED重新初始化一次,所以花屏以后需要再右击一下就OK啦,就当这是给游戏提高难度了吧........
这是源码 我都写一个c文件里了:

编译:

gcc game1.c -o game1 -lwiringPi

执行:

./game1

  源码里面没注释,我觉得我现在再看已经无法理解好多变量的作用了....
需要wiringBPI的库,不知道的可以参考这里
http://www.eeboard.com/bbs/thread-40235-1-2.html

原文地址:https://www.cnblogs.com/guanglun/p/8134779.html