2012年6月5日 星期二

上機考

1.出現五十隻蚊子在畫面上:    
     //取時間亂數的50隻蚊子X&Y座標
     srand(time(NULL));
     int x2[50],y2[50],z2[50];     //用三個陣列記XY座標和一個蚊子是否活著
     for(int i=0;i<50;i++)
    {
        x2[i]=rand()%500;
        y2[i]=rand()%360;
        z2[i]=1;     //產生時把五十隻蚊子設1為活著
    }
2.拍子可隨膚色移動:   
     //捕蚊拍跟著膚色走
    int sx, sy;
    for (int y=1; y<grey->height-1; y++) {
    uchar* ptr1=(uchar*) (grey->imageData +y*grey->widthStep);
    for (int x=1; x<grey->width-1; x++) {
    if (ptr1[x-1]==255 && ptr1[x]==255 && ptr1[x+1]==255) {
   sx=x; sy=y;
   x1=x;y1=y;
   x=grey->width+1; y=grey->height+1;
    }       }     }
3.模擬打蚊子:   
    //拍子碰到蚊子就消失
    if(s<50){
         for(int i=0;i<50;i++){
            if(x2[i]>sx && sx<x2[i]+80&& sy>y2[i] && sy<y2[i]+80){
                 z2[i]=0;    x2[i]=5000;y2[i]=5000;
                 s+=1;
              }   }
          for(int i=0;i<50;i++){
               if(z2[i]==1){          
                     for (int y=0; y<a->height; y++) {
                         uchar* ptr1=(uchar*) (a->imageData +y*a->widthStep);
                         uchar* ptr2=(uchar*) (frame->imageData +(y+y2[i])*frame->widthStep);
                          for (int x=0; x<a->width; x++) {
                              ptr2[3*(x+x2[i])]=alpha*ptr1[3*(x)] + (1-alpha)*ptr2[3*(x+x2[i])];
                              ptr2[3*(x+x2[i])+1]=alpha*ptr1[3*(x)+1] + (1-alpha)*ptr2[3*(x+x2[i])+1];
                              ptr2[3*(x+x2[i])+2]=alpha*ptr1[3*(x)+2] + (1-alpha)*ptr2[3*(x+x2[i])+2];
          }     }     }    }
4.計分:    
     //分數顯示
     cvPutText(frame, "Score ", cvPoint(10,50), &font, cvScalar(0,0,255) );
     int2str(s, str);      //下面的int轉char
     cvPutText(frame, str , cvPoint(120,50), &font, cvScalar(0,0,255) );   //str不能放int

    //int轉char
    void int2str(int i, char *s) {
    sprintf(s,"%d",i);
    }
5.過關畫面:
     cvPutText(frame, "You Win" , cvPoint(280,250), &font, cvScalar(0,0,255) );


上機考卡住的地方:
已經有五十隻蚊子,拍子也能跟著移動

也寫了"存活"的陣列,用來判斷是不是有打到蚊子
分數也能產生,蚊子一直殺不死(圖沒有消失),分數卻一直在加

考完試後:
冷靜的看了看程式碼,發現顯示初始我的蚊子的迴圈寫在while裡面
造成會
顯示蚊子 --> 做判斷是不是分數還沒到達 --> Z陣列改成0表是蚊子死了 --> 分數加一
   --> 在判斷(if(z2[i]==1))蚊子還活著的做顯示 -->但又回到顯示初始的五十隻蚊子
所以我把顯示初始蚊子的迴圈搬到while外面
讓產生蚊子的迴圈在開始while之前就先產生完成
就沒有不斷產生,消不掉蚊子圖形的問題

沒有留言:

張貼留言