Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 25 kết quả

Đề tài: Mô phỏng đèn tín hiệu giao thông | Cần giúp gấp về ý tưởng đề tài này

  1. #1
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Exclamation Mô phỏng đèn tín hiệu giao thông | Cần giúp gấp về ý tưởng đề tài này

    Đề tài : Mô phỏng tín hiệu giao thông.
    IDE : Tubor C++ ( làm trên thư viện graphics.h trên TC nên phải dùng TC )
    Ý tưởng : vẽ ngã tư đèn, cho đèn sáng và thay đổi trạng thái ngẫu nhiến cách liên tục , xe chạy phụ thuộc vào tín hiệu đèn như sau:
    1 - Đang chạy gặp đèn đỏ và nếu chưa vượt vạch dừng trên
    đường thì chạy tới vạch dừng rồi dừng nếu vẫn đỏ, nếu
    đèn chuyển sang xanh thì xe chạy
    hết đoạn còn lại.

    2 - Đèn xanh thì chạy bthường.
    3 - Đèn vàng thì đi chậm.
    Code chạy được mình để ở dưới ( bài post thứ 2 ý ), và đính kèm luôn ở đó, mấy bạn xem giúp với
    Đây là class Car của mình :
    C++ Code:
    1. class   Car
    2. {  
    3.     private:
    4.         int     xshow,yshow; // show xe tại vị trí xshow, yshow
    5.         char  *ptr;             // con trỏ luưu ảnh xe sẽ
    6.         int     showStatus;   // trạng thái xe ( ẩn/ hiện )
    7.                                                      //  show : showStatus=1
    8.                                                      //  hide   : showStatus=0
    9.              public:       
    10.         void    drawCar()
    11.         {
    12.             unsigned n;
    13.             char *scrPtr;  //con tro man hinh, lưu ảnh trước
    14.                                                           // khi vẽ xe
    15.        
    16.             /*n là số  byte cần thiết để lưu ảnh trong
    17.                                        pham vi hcn
    18.             co có tọa độ(365,425) , (395,465) */
    19.                 n = imagesize( 365,425, 395,465 );
    20.        
    21.                                        //cấp phát
    22.             scrPtr=new char [n];
    23.  
    24.             //ham getimage lưu ảnh tại tọa độ dưới
    25.                                        // vào vùng nhớ do scrPtr trỏ
    26.             getimage( 365,425, 395,465, scrPtr );
    27.         { các lệnh vẽ xe trong hcn có tọa độ(365,425), (395,465) };
    28.  
    29.                   // cấp phát vùng nhớ để lưu ảnh xe
    30.             ptr=new char [n];
    31.                   // lưu ảnh xe đã vẽ ở trên
    32.             getimage( 365,425, 395,465, ptr);
    33.  
    34.                   // xóa xe để trả lại BackGround cũ
    35.             putimage( 365,425, scrPtr, COPY_PUT );
    36.  
    37.                   //xóa con trỏ scrPtr
    38.             delete scrPtr;
    39.             scrPtr = NULL;
    40.         }
    41.  
    42.                    //hiện xe
    43.         void    show(const int &x3, const int &y3)
    44.         {
    45.             if( ptr!=NULL && !showStatus) //chua show
    46.             {
    47.                 showStatus = 1;
    48.                 xshow = x3;
    49.                 yshow = y3;
    50.  
    51.             putimage( xshow,yshow, ptr, XOR_PUT );
    52.             }
    53.         }
    54.  
    55.                   //ẩn xe
    56.         void    hide()
    57.         {
    58.             if( showStatus ) //dang show
    59.             {
    60.                 showStatus=0;
    61.                 putimage( xshow,yshow, ptr,XOR_PUT);
    62.             }
    63.         }      
    64. };

    Đây là hàm đèn đổi màu xe chạy, vẫn chưa viết được vì chưa biết làm thê nào :

    C++ Code:
    1. void dendoimau_xechay()
    2. {
    3.     Car chut_chit;
    4.     chut_chit.drawCar(); // vẽ xe
    5.     while( !kbhit() )
    6.     {  
    7.  
    8.         for( int i = 0; i<3; i++ )  // 3 trang thai cua den
    9.                                                                 // 0 : đỏ, 1: vàng, 2 :xanh
    10.         {
    11.             drawLight( i ); // vẽ đèn theo giá trị nhận vào 0 : đỏ sáng, 1 : vàng sáng, 2: xanh sáng
    12.            
    13.             /*for( int y = 500; y> - 20; y-=5 )
    14.             {
    15.                 chut_chit.hide();
    16.                 chut_chit.show( 360,y );
    17.             }*/
    18.             if( i == 0 )        delay ( 8000 );      // đèn đỏ trong 8 giây
    19.             else if( i ==1 )    delay ( 3000 );    // đèn vàng trong 3 giây
    20.             else                delay ( 8000 );   // đèn xanh trong 8 giây
    21.         }
    22.     }
    23.  
    24. }
    Xe chạy từ (360,500) ( phía dưới màn hình ) lên (360, -5 ) (-5 để cho xe chạy ra khỏi màn hình) .

    Tới đây tui nghĩ là : lớp Car cần thêm 1 biến ( tạm gọi là _statusLight ) lưu giá trị đèn, đây là thuộc tính của lớp xe , giá trị này được quy định bởi hàm đèn đổi màu ( tức là nó đựoc gán giá trị trong hàm dendoimau_xechay ), nhưng ko biết kết hợp với hàm show như thế nào để thỏa các yêu cầu đã đặt ra ở đầu topic.

    Đang cần gấp ý tưởng code chỗ này, ai có bất kỳ ý kiến gì thì cho xin nha, bất ký ý kiến gì cũng được
    Đã được chỉnh sửa lần cuối bởi camping29 : 26-11-2008 lúc 06:45 PM.

  2. #2
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Đã viết được method di chuyển cho xe, vấn đề cần giải quyết ở đây là làm thế nào để đèn thay đổi độc lập với phương thức go_up, trong code sau đây, đèn chỉ thay đổi khi go_up thực hiện xong -> go_up lặp vô tận tại 1 lượt đèn.

    Phương thức go_up :
    C++ Code:
    1. void Car::go_up(const int &statusColor )
    2. {
    3.      if( yshow < -20 ) yshow = 500;
    4.      //den` do? thi` ........
    5.      while( statusColor == 0 && yshow > -20)   
    6.      {
    7.             if( yshow == 370 )
    8.             {
    9.                     hide();
    10.                     show( 360,370 );
    11.                     delay( 100 );
    12.             }
    13.             else if( yshow >370 )
    14.             {
    15.                  hide();
    16.                  show( 360,yshow );
    17.                  yshow -= 2;
    18.                  delay( 100 );
    19.             }
    20.             else
    21.             {
    22.                 hide();
    23.                 show( 360,yshow );
    24.                 yshow -= 7;
    25.                 delay( 100 );
    26.             }
    27.      }
    28.      
    29.      //den` vang chua vuout vach dung`, di cham.....
    30.      while( statusColor == 1 && yshow > 370)   
    31.      {
    32.             hide();
    33.             show( 360,yshow );
    34.             delay( 100 );
    35.             yshow -=2;
    36.      }
    37.      
    38.      //den` vang` vuot vach dung` hoac den` xanh .........
    39.      while( (statusColor == 1 && yshow < 370 && yshow > -20) || (statusColor == 2 && yshow > -20) )                  
    40.      {            
    41.               hide();
    42.               show( 360,yshow );
    43.               delay( 100 );
    44.               yshow -= 7;
    45.      }
    46. }

    Hàm xe_chay_theo_den :
    C++ Code:
    1. void xe_chay_theo_den()
    2. {
    3.     Car chut_chit;
    4.     chut_chit.drawCar();
    5.     do
    6.     {
    7.         for( int statusColor = 0; statusColor < 3; statusColor++)
    8.         {
    9.                      //vẽ đèn theo màu được truyền vào  
    10.             drawLight( statusColor );
    11.                      //cho xe chạy lên, LỖI Ở ĐOẠN NÀY, HÀM LẶP VÔ TẬN
    12.             chut_chit.go_up( statusColor );
    13.  
    14.                      //đặt thời gian đèn đỏ, đèn xanh, đèn vàng,
    15.                      //LỖI Ở ĐÂY, ĐÈN CHỈ THAY ĐỔI SAU KHI go_up THỰC HIỆN
    16.                      //XONG, MÀ go_up ĐANG BỊ LẶP VÔ TẬN
    17.            
    18.             if( statusColor == 0 )          delay( 8000 );
    19.             else if( statusColor == 1 )     delay( 3000 );
    20.             else                            delay( 8000 );
    21.         }
    22.     }   while( !kbhit() );
    23. }

    VẤN ĐỀ LÀ TÌM RA CÁCH ĐỂ HÀM DELAY TRONG PHƯƠNG THỨC xe_chay_theo_den THAY ĐỔI ĐỘC LẬP VỚI PHƯƠNG THỨC go_up của lớp xe!!!.
    HOẶC BẤT CỨ CÁCH GÌ CÓ THỂ GIÚP ĐÈN THAY ĐỔI ĐỘC LẬP VỚI THỰC TẾ XE CHẠY
    Ai có ý kiến gì cũng được, cho mình xin gấp.


    ************************************************** ****
    Đây là code của mình, chạy được rồi nhưng ko đúng yêu cầu.
    Chỉ chạy đựoc bằng TC++, các bạn có thể mở ra chỉnh sửa bằng VC++ cho dễ rồi dùng TC++ để open vì dùng thư viện đồ họa của nó.
    C++ Code:
    1.  
    2.  
    3. #include<conio.h>
    4. #include<graphics.h>
    5. #include<stdio.h>
    6. #include<stdlib.h>
    7. #include<alloc.h>
    8. #include<dos.h>
    9. #include<time.h>
    10. #include<math.h>
    11.  
    12. const int MAXSTAR = 100;
    13.  
    14. //Cac class can dung sau nay
    15. class Point
    16. {
    17.     private:
    18.         int x,y;
    19.     public:
    20.         Point()     { x= y= 0; }
    21.         Point(const int &x1, const int &y1 )
    22.         {
    23.             x= x1;
    24.             y= y1;
    25.         }
    26.         void setx(const int &x1)    { x = x1; }
    27.         void sety(const int &y1)    { y = y1; }
    28.         int getx()  {  return x; }
    29.         int gety()  {  return y; }
    30. };
    31. class Star : public Point
    32. {
    33.     private:
    34.             int status, color, zoom;
    35.     public:
    36.             void setStatus( const int &status1 )    { status = status1; }
    37.             void setColor( const int &color1 )      { color = color1; }
    38.             void setZoom( const int &zoom1 )        { zoom = zoom1; }
    39.            
    40.             int getStatus() { return status; }
    41.             int getColor()  { return color; }
    42.             int getZoom()   { return zoom; }
    43.            
    44.             void Star::drawStar( const int &);
    45. };
    46. void Star::drawStar( const int &draw)
    47. {
    48.     int color;
    49.     if (draw)   color = this->color;
    50.     else        color = BLACK;
    51.    
    52.     setcolor( color );
    53.     switch( status )    // Lon dân` tu 1 -> 4
    54.     {
    55.         case 0: putpixel(getx(), gety(), color);
    56.                 break;
    57.  
    58.         case 1: line( getx()-1, gety(), getx()+1, gety() );
    59.                 line( getx(), gety()-1, getx(), gety() + 1 );
    60.                 break;
    61.  
    62.         case 2: line( getx()-2, gety(), getx()+2, gety());
    63.                 line( getx(), gety()-2, getx(), gety()+2);
    64.                 break;
    65.        
    66.         case 3: line( getx()-4, gety(), getx()+4, gety() );
    67.                 line( getx(), gety()-4, getx(), gety()+4 );
    68.                 rectangle( getx()-1, gety()-1, getx()+1, gety()+1 );
    69.                 break;
    70.     }
    71. }
    72. class Circle : public Point
    73. {
    74.     private:
    75.         //Point tam;    // tam hinh tron
    76.         int radius;       // ban kinh hinh tron
    77.         int drawColor;   // mau ve hinh tron
    78.         int fillColor;   // mau to hinh tron
    79.     public:
    80.        
    81.         Circle() : Point()
    82.         {
    83.             radius = drawColor = fillColor = 0;
    84.         }
    85.         Circle(int x1,int y1,int radius1,int color1,int color2) : Point(x1,y1)
    86.         {
    87.             radius = radius1;
    88.             drawColor = color1;
    89.             fillColor = color2;
    90.         }
    91.        
    92.         void drawCircle()
    93.         {
    94.             setcolor( drawColor );
    95.             circle( getx(), gety(), radius );
    96.             setfillstyle( SOLID_FILL, fillColor );
    97.             floodfill( getx(), gety(), drawColor );
    98.         }
    99. };
    100.  
    101. class Rectangle
    102. {
    103.     private:
    104.             Point vertex1,vertex2;
    105.             int drawColor;
    106.             int fillColor;
    107.     public:
    108.         Rectangle()
    109.         {
    110.             drawColor = fillColor = 0;
    111.         }
    112.         Rectangle(int x1, int y1, int x2, int y2, int color1, int color2) : vertex1( x1, y1 ), vertex2( x2, y2 )
    113.         {
    114.             drawColor = color1;
    115.             fillColor = color2;
    116.         }
    117.         void drawRectangle()
    118.         {
    119.             setcolor( drawColor );
    120.             rectangle( vertex1.getx(), vertex2.gety(), vertex1.getx(), vertex2.gety() );
    121.             setfillstyle( SOLID_FILL, fillColor );
    122.             floodfill( vertex1.getx() + 5, vertex2.gety() + 5, drawColor );
    123.         }
    124. };
    125.  
    126.  
    127.  
    128.  
    129. // Cac ham ve BackGround
    130. void drawStreetCorner()   //ve 4 goc duong
    131. {
    132.    
    133.     int Corner1[]={ 230,0,   230,150, -2,150,  -2,120,  200,120, 200,0  };
    134.     int Corner2[]={ 400,0,   400,150, 639,150, 639,120, 430,120, 430,0  };
    135.     int Corner3[]={ 0,330,   230,330, 230,479, 200,479, 200,360, 0,360  };
    136.     int Corner4[]={ 639,330, 400,330, 400,479, 430,479, 430,360, 639,360};
    137.    
    138.     setcolor(10);
    139.     //ve cac goc duong
    140.     drawpoly( 6, Corner1 );
    141.     drawpoly( 6, Corner2 );
    142.     drawpoly( 6, Corner3 );
    143.     drawpoly( 6, Corner4 );
    144.    
    145.     //to mau vien ngoai duong
    146.     setfillstyle( SOLID_FILL, YELLOW );
    147.     floodfill( 210,130, 10 );
    148.     floodfill( 410,130, 10 );
    149.     floodfill( 210,340, 10 );
    150.     floodfill( 410,340, 10 );
    151.    
    152.     //to mau ben trong khu dat
    153.     setfillstyle( CLOSE_DOT_FILL, LIGHTGREEN );
    154.     floodfill( 100,100, 10 );
    155.     floodfill( 500,100, 10 );
    156.     floodfill( 100,400, 10 );
    157.     floodfill( 500,400, 10 );
    158.    
    159.     // ve hoa mau hong trong khu dat
    160.     setfillstyle( SOLID_FILL, LIGHTMAGENTA );
    161.     for( int x= 5; x<= 190; x+= 20 )    //Tren trai
    162.     for( int y= 5; y<= 110; y+= 20 )
    163.         pieslice( x,y, 0,360, 5 );
    164.    
    165.     for( int c= 5  ; c<=190; c+= 20 )   //Duoi trai
    166.     for( int d= 370; d<=479; d+= 20 )
    167.         pieslice( c,d, 0,360, 5 );
    168.    
    169.     for( int e= 440; e<= 639; e+= 20 )  //Tren phai
    170.     for( int f= 5  ; f<= 110; f+= 20 )
    171.         pieslice( e,f, 0,360, 5 );
    172.    
    173.     for( int a= 440; a<= 639; a+= 20 )  //Duoi phai
    174.     for( int b= 370; b<= 479; b+= 20 )
    175.         pieslice( a,b, 0,360, 5);
    176. }
    177.  
    178. void bungbinh()
    179. {
    180.     //Mau ve
    181.     setcolor( WHITE );
    182.    
    183.     setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    184.     circle( 320,240, 20 );     //drawCircle vong tron ben trong
    185.     circle( 320,240, 40 );     //drawCircle vong tron ben ngoai
    186.  
    187.     setfillstyle( WIDE_DOT_FILL, YELLOW );  //To vong tron trong
    188.     floodfill( 320,240, WHITE );
    189.  
    190.     setfillstyle( XHATCH_FILL, BROWN );     //To vong tron ngoai
    191.     floodfill( 320,270, WHITE );
    192. }
    193.  
    194. void drawTree()
    195. {
    196.     //Mau drawCircle
    197.     setcolor( GREEN );
    198.    
    199.     for( int x= 20; x<= 170; x+= 30 )
    200.     {
    201.         ellipse( x,100, 0,360, 10,30 ); //Goc tren trai
    202.         ellipse( x,310, 0,360, 10,30 ); //Goc tren phai
    203.        
    204.         //Thiet lap kieu to va` to mau cho cay
    205.         setfillstyle( 1, GREEN );
    206.         floodfill( x,100, GREEN );     
    207.         floodfill( x,300, GREEN );
    208.  
    209.         //drawCircle thhide cay
    210.         setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    211.         line( x,110, x,140 );   //Tren trai
    212.         line( x,320 ,x,350 );   //Tren phai
    213.        
    214.     }
    215.     for( int a= 450; a<= 639; a+= 30 )
    216.     {
    217.         ellipse( a,100, 0,360, 10,30 ); //Goc duoi trai
    218.         ellipse( a,310, 0,360, 10,30 ); //Goc duoi phai
    219.        
    220.         //Thiet lap kieu to va to mau cho cay
    221.         setfillstyle( 1, GREEN );
    222.         floodfill( a,100, GREEN );
    223.         floodfill( a,300, GREEN );
    224.        
    225.         //drawCircle than cay
    226.         setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    227.         line( a,110, a,140 );   //Duoi trai
    228.         line( a,320, a,350 );   //Duoi phai
    229.        
    230.     }
    231. }
    232.  
    233. void vachduong()
    234. {
    235.     setcolor( WHITE );
    236.     setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    237.     // vach duong
    238.     line( 190,150, 190,330 );
    239.     line( 450,150, 450,330 );
    240.     line( 230,110, 400,110 );
    241.     line( 230,370, 400,370 );
    242.      // vach duong cho nguoi di bo
    243.     for( int y= 160; y<= 320; y+= 10 )
    244.     {
    245.         line( 200,y, 220,y );
    246.         line( 420,y, 440,y );
    247.     }
    248.     for(int x= 240; x<= 390; x+= 10 )
    249.     {
    250.         line( x,340, x,360 );
    251.         line( x,120, x,140 );
    252.     }
    253.     // vach duong o giua
    254.     setlinestyle( CENTER_LINE, 0, THICK_WIDTH );
    255.     line( 0,240,   190,240 );
    256.     line( 450,240, 639,240 );
    257.     line( 320,0,   320,110 );
    258.     line( 320,370, 320,479 );
    259. }
    260.  
    261.  
    262.  
    263. void drawLightPanel()
    264. {
    265.     setcolor( LIGHTGRAY );
    266.     setlinestyle( SOLID_LINE, 0, NORM_WIDTH );
    267.     rectangle( 400,270, 440,350 );     //ve bang den
    268.  
    269.     setfillstyle( SOLID_FILL, BROWN );  //to mau bang den
    270.     floodfill( 410,346, LIGHTGRAY );
    271.  
    272.     setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    273.     line( 420,350, 420,370 );           //ve chan den
    274. }
    275.  
    276. void drawLight( const int &statusColor )    // 0 = do, 1 = vang, 2 = xanh
    277. {
    278.     switch( statusColor )
    279.     {
    280.         case 0 :
    281.                 Circle yellowLight_stt0( 420,310, 10, LIGHTGRAY, LIGHTGRAY );
    282.                 yellowLight_stt0.drawCircle();
    283.  
    284.                 Circle redLight_stt0( 420,285, 10, RED, RED );
    285.                 redLight_stt0.drawCircle();
    286.  
    287.                 Circle greenLight_stt0( 420,335, 10, LIGHTGRAY, LIGHTGRAY );
    288.                 greenLight_stt0.drawCircle();
    289.  
    290.                 break;
    291.         case 1 :
    292.                 Circle yellowLight_stt1( 420,310, 10, YELLOW, YELLOW );
    293.                 yellowLight_stt1.drawCircle();
    294.  
    295.                 Circle redLight_stt1( 420,285, 10, LIGHTGRAY, LIGHTGRAY );
    296.                 redLight_stt1.drawCircle();
    297.  
    298.                 Circle greenLight_stt1( 420,335, 10, LIGHTGRAY, LIGHTGRAY );
    299.                 greenLight_stt1.drawCircle();
    300.  
    301.                 break;
    302.         case 2 :
    303.                 Circle yellowLight_stt2( 420,310, 10, LIGHTGRAY, LIGHTGRAY );
    304.                 yellowLight_stt2.drawCircle();
    305.  
    306.                 Circle redLight_stt2( 420,285, 10, LIGHTGRAY, LIGHTGRAY );
    307.                 redLight_stt2.drawCircle();
    308.  
    309.                 Circle greenLight_stt2( 420,335, 10, GREEN, GREEN );
    310.                 greenLight_stt2.drawCircle();
    311.  
    312.                 break;
    313.         };
    314. }
    315.  
    316. void drawStarSky()
    317. {
    318.     Star s[MAXSTAR];
    319.  
    320.     randomize();
    321.    
    322.     for( int i = 0; i< MAXSTAR; i++ )
    323.     {
    324.         s[i].setx( random( getmaxx() ) );
    325.         s[i].sety( random( getmaxy() ) );
    326.         s[i].setColor ( random( getmaxcolor() ) );
    327.         s[i].setStatus ( random( 4 ) );
    328.         s[i].setZoom ( random( 2 ) );
    329.     }
    330.  
    331.     // ve troi sao
    332.     while( !kbhit() )
    333.     {
    334.         for( int i = 0; i< MAXSTAR; i++ )
    335.             s[i].drawStar( 1 );
    336.         delay( 100 );
    337.  
    338.         for( i = 0; i< MAXSTAR; i++ )
    339.             s[i].drawStar( 0 );
    340.  
    341.         // Nhap nhay
    342.         for( i = 0; i< MAXSTAR; i++ )
    343.         {
    344.             if( s[i].getZoom() )    //1 = zoom in
    345.             {
    346.                 s[i].setStatus ( s[i].getStatus() + 1 );
    347.                 if( s[i].getStatus() == 3 ) s[i].setZoom ( 0 );
    348.             }
    349.             else    // 2 = zoom out
    350.             {
    351.                 s[i].setStatus ( s[i].getStatus() - 1 );
    352.                 if( s[i].getStatus() == 0 ) s[i].setZoom ( 1 );
    353.             }
    354.         }
    355.     }
    356.     getch();
    357. }
    358.  
    359.  
    360.  
    361.  
    362. //Ve hinh` nen`
    363. void drawBackGround()
    364. {
    365.     setbkcolor( DARKGRAY );
    366.     drawStreetCorner();
    367.     bungbinh();
    368.     drawTree();
    369.     vachduong();
    370.     drawLightPanel();
    371. }
    372. //class Xe
    373. class Car
    374. {  
    375.     private:
    376.         int xshow,yshow;  //show xe tai vi tri xshow, yshow
    377.         char *ptr;           //tro toi vung nho luu anh xe
    378.         int showStatus;       //trang thai show (showStatus=1),hide (showStatus=0)
    379.     public:
    380.         void drawCar()
    381.         {
    382.             unsigned n;
    383.             char *scrPtr;  //con tro man hinh
    384.        
    385.             /*n la so byte can thiet de luu tru anh trong pham vi hcn
    386.             co toa do 365,425,395,465 */
    387.                 n = imagesize( 365,425, 395,465 );
    388.        
    389.              // ph la con tro tro toi vung nho n byte moi duoc cap phat
    390.             scrPtr=new char [n];
    391.  
    392.             //ham getimage chep thong tin hcn vao vung nho do bitmap tro toi
    393.             getimage( 365,425, 395,465, scrPtr );
    394.             setlinestyle( SOLID_LINE, 0, NORM_WIDTH);
    395.  
    396.             Circle a( 380,450, 15, WHITE, WHITE );         // than xe
    397.             a.drawCircle();
    398.  
    399.             Circle b( 380,435, 10, WHITE, WHITE );         //dau xe
    400.             b.drawCircle();
    401.  
    402.             Circle c( 370,430, 2, WHITE ,WHITE );          //tai xe (den)
    403.             c.drawCircle();
    404.  
    405.             Circle d( 390,430, 2, WHITE, WHITE );          //tai xe (den)
    406.             d.drawCircle();
    407.  
    408.             ptr=new char [n];
    409.             getimage( 365,425, 395,465, ptr);
    410.             putimage( 365,425, scrPtr, COPY_PUT );
    411.  
    412.             delete scrPtr;
    413.             scrPtr = NULL;
    414.         }
    415.  
    416.         //void drawVan()
    417.         void show(const int &x3, const int &y3)
    418.         {
    419.             if( ptr!=NULL && !showStatus) //chua show
    420.             {
    421.                 showStatus = 1;
    422.                 xshow = x3;
    423.                 yshow = y3;
    424.  
    425.                 putimage( xshow,yshow, ptr, XOR_PUT );
    426.             }
    427.         }
    428.         void hide()
    429.         {
    430.             if(showStatus) //dang show
    431.             {
    432.                 showStatus=0;
    433.                 putimage( xshow,yshow, ptr,XOR_PUT);
    434.             }
    435.         }
    436.         void Car::go_up( const int & );
    437. };
    438. void Car::go_up(const int &statusColor )
    439. {
    440.      if( yshow < -20 ) yshow = 500;
    441.      //den` do? thi` ........
    442.      while( statusColor == 0 && yshow > -20)   
    443.      {
    444.             if( yshow == 370 )
    445.             {
    446.                     hide();
    447.                     show( 360,370 );
    448.                     delay( 100 );
    449.             }
    450.             else if( yshow >370 )
    451.             {
    452.                  hide();
    453.                  show( 360,yshow );
    454.                  yshow -= 2;
    455.                  delay( 100 );
    456.             }
    457.             else
    458.             {
    459.                 hide();
    460.                 show( 360,yshow );
    461.                 yshow -= 7;
    462.                 delay( 100 );
    463.             }
    464.      }
    465.      
    466.      //den` vang chua vuout vach dung`, di cham.....
    467.      while( statusColor == 1 && yshow > 370)   
    468.      {
    469.             hide();
    470.             show( 360,yshow );
    471.             delay( 100 );
    472.             yshow -=2;
    473.      }
    474.      
    475.      //den` vang` vuot vach dung` hoac den` xanh .........
    476.      while( (statusColor == 1 && yshow < 370 && yshow > -20) || (statusColor == 2 && yshow > -20) )                  
    477.      {            
    478.               hide();
    479.               show( 360,yshow );
    480.               delay( 100 );
    481.               yshow -= 7;
    482.      }
    483. }
    484.                            
    485. //Xe chay theo den`
    486. void xe_chay_theo_den()
    487. {
    488.     Car chut_chit;
    489.     chut_chit.drawCar();
    490.     do
    491.     {
    492.         for( int statusColor = 0; statusColor < 3; statusColor++)
    493.         {
    494.             drawLight( statusColor );
    495.             chut_chit.go_up( statusColor );
    496.            
    497.             if( statusColor == 0 )          delay( 8000 );
    498.             else if( statusColor == 1 )     delay( 3000 );
    499.             else                            delay( 8000 );
    500.         }
    501.     }   while( !kbhit() );
    502. }
    503.  
    504.        
    505. // Den` chay theo xe
    506. /*void xe_chay()
    507. {
    508.     int y;
    509.     while( !kbhit() )
    510.     {
    511.         Car chut_chit;
    512.         chut_chit.drawCar();
    513.  
    514.         for( y=460; y>370; y -= 2 )
    515.         {
    516.             chut_chit.hide();
    517.             chut_chit.show( 360,y );
    518.             delay(100);
    519.  
    520.             drawLight( 0 );
    521.  
    522.             if(kbhit()) break;
    523.         }
    524.         if( y == 370 )
    525.         {
    526.             drawLight( 1 );
    527.  
    528.             chut_chit.hide();
    529.             chut_chit.show( 360,y );
    530.             delay( 5000 );
    531.  
    532.             if( kbhit() )   break;
    533.         }
    534.  
    535.         for(y=365;y>=0;y-=5)
    536.         {
    537.             chut_chit.hide();
    538.             chut_chit.show( 360,y );
    539.             delay(100);
    540.  
    541.             drawLight( 2 );
    542.  
    543.             if( kbhit() )   break;
    544.         }
    545.         if(kbhit()) break;
    546.      } //ket thuc while
    547. }*/
    548.  
    549.  
    550. void main()
    551. {
    552.     int mh= 0, mode= 0;
    553.     initgraph( &mh, &mode, "C:\\TC\\BGI" );
    554.  
    555.     drawStarSky();
    556.     cleardevice();
    557.  
    558.     drawBackGround();
    559.     xe_chay_theo_den();
    560.    
    561.     getch();
    562.     closegraph();
    563. }
    ************************************************** ****
    Code có đính kèm ở dưới, ai lấy về coi hộ với, có thể chỉnh sửa bằng VC++ rồi lưu lại, open = TC++.
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi camping29 : 26-11-2008 lúc 06:48 PM. Lý do: Thêm thông tin bài viết.

  3. #3
    Ngày gia nhập
    11 2008
    Nơi ở
    Neverland
    Bài viết
    48

    Mình nghĩ bạn làm kiểu này không ổn lặp vô hạn là phải . Theo mình chỉ cần làm đơn giản áp dụng cách lập trình xử lí theo sự kiện là được . Hàm go_up của bạn không cần kiểm tra trạng thái đèn nữa chỉ đơn giản là vẽ xe thôi . Còn trong hàm đổi trạng thái đèn dendoimau_xechay() mới bắt đầu xử lí sự kiện và làm xe chuyển động dựa vào thay đổi vị trí xe liên tục :
    Lặp :
    -Lấy giờ hiện tại .
    -So sánh với giờ bắt đầu sự kiện nếu đạt được yêu cầu nào đó ví như lớn hơn 8s thì đổi trạng thái đèn đỏ --> xanh , xanh -->vàng ....thì sẽ thiết lập lại khởi điểm giờ bắt đầu là thời điểm hiện tại . Nếu chưa đạt yêu cầu thì giữ nguyên trạng thái đèn .
    -Dựa vào trạng thái đèn lúc đó mới vẽ xe chạy nhanh chậm ra sao :chỉ cần vẽ ra cái xe ở tại thời điểm đó thôi sau đó cho nó delay để tạo cảm giác nhanh chậm và thay đổi các biến vị trí của xe sang vị trí tiếp theo .
    Ý tưởng của mình dựa trên cái đèn đỏ thực tế đó và mình nghĩ làm một lớp riêng là lớp đèn đi . Cả bầu trời cây cối ven đường cũng vậy mình nghĩ coi nó là đối tượng hết đi chứ bạn dùng hàm riêng để vẽ mình thấy thế nào ấy .
    I'm superman

  4. #4
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Cảm ơn Trung nha, giờ trễ rồi, để mai mình đọc rồi nghiên cứu. Nếu Trung hoặc ai có thêm ý kiến gì thì cho mình xin, bất kỳ ý kiến gì cũng được. Cảm ơn rất nhiều.

  5. #5
    Ngày gia nhập
    11 2008
    Nơi ở
    Neverland
    Bài viết
    48

    Ừm mình làm Demo minh họa điều đó bạn xem xem . Chuyển động trong Demo của mình phụ thuộc vào trạng thái nếu stop nó sẽ dừng lại , slow_down chuyển động chậm đi , speed_up chuyển động nhanh lên . Có đếm thời gian để chuyển trạng thái tương tự hệ thống đèn giao thông . Hi vọng giúp được bạn .
    C++ Code:
    1. #include <graphics.h>
    2. #include <time.h>
    3. #include <dos.h>
    4. #include <conio.h>
    5. const int SIZE=100;
    6. const int WAIT=800;
    7. const int SPEED=500;
    8. enum {slow_down,stop,speed_up} status;
    9. unsigned long int getHund(void)
    10. {
    11.     static struct time ti;
    12.     unsigned long int hund;
    13.     gettime(&ti);
    14.     hund=(ti.ti_hour*3600 + ti.ti_min*60 + ti.ti_sec)*100 + ti.ti_hund;
    15.     return hund;
    16. }
    17. int main()
    18. {
    19.     int grMode = 0,grDriver = 0;
    20.     int x , y;
    21.     unsigned long start_time,curr_time;
    22.     unsigned long speed;
    23.     initgraph(&grDriver,&grMode,"D:\\TC\\BGI");
    24.     x = 0;
    25.     y = getmaxy()/2;
    26.     setwritemode(XOR_PUT);
    27.     start_time = curr_time = getHund();
    28.     status = speed_up;
    29.     rectangle(x,y-SIZE/2,x+SIZE,y+SIZE/2);
    30.     while (!kbhit())
    31.     {
    32.         curr_time = getHund();
    33.         if (curr_time - start_time > WAIT)
    34.         {
    35.             start_time = curr_time;
    36.             if (status == slow_down) status = stop;
    37.             else if (status == stop) status = speed_up;
    38.             else status = slow_down;
    39.         }
    40.         if (status == slow_down) speed = SPEED + 500;
    41.         if (status == speed_up) speed = SPEED - 490;
    42.         if (status == stop) continue;
    43.         rectangle(x,y-SIZE/2,x+SIZE,y+SIZE/2);
    44.         x++;
    45.         if (x > 640) x = 0;
    46.         rectangle(x,y-SIZE/2,x+SIZE,y+SIZE/2);
    47.         delay(speed);
    48.     }
    49.     closegraph();
    50.     return 0;
    51. }
    mới sáng ra Code vội cho bạn nên không chăm chút đồ họa lắm .
    I'm superman

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Mô phỏng đèn tín hiệu giao thông | Cần giúp gấp về ý tưởng đề tài này

    Sorry, camping ! Không phải anh không muốn giúp mà vì không có tool test, anh cũng chẳng biết hình dung nó ra sao. Cài thử thằng graphics.h cho Linux( nó dùng SDL wrapper ) code 1 nữa đồ họa 1 nửa console -> pótay, không test được gì. Với lại library đó cũng thiếu 1 số hàm, cụ thể mấy hàm em dùng anh tìm document không có :( ! Hay em thử dùng openGL coi sao ! openGL nó cũng có 2D để vẽ, và chắc có lẽ sẽ dễ dàng hơn vì có rất nhiều cao thủ đồ họa trong diễnd đàn( ZCoder chẳng hạn )

  7. #7
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Anyway, thx Trung và r2 vì đã ghé qua nha, mà em mới học thôi, đã bít openGL là cái gì đâu :(, nge qua rồi, nhưng chỉ là nge qua thôi, giới thiệu nó lun đi

    Bây giờ qua lại nghiên cứu cái demo của Trung với cái seminar đã. Ai có ý kiến gì thì cứ thoải mái lên tiếng nha.

    Ah Trung ah, chạy cái code của mình đi, thấy có 2 cái xe ko?
    1 cái là mình tạo cho nó chạy, còn 1 cái chỗ cái đèn ko biết ở đâu ra, tìm mãi mà ko đc nên mới hỏi đây:(
    Tìm lỗi chỗ đó cho mình với :(
    Đã được chỉnh sửa lần cuối bởi camping29 : 27-11-2008 lúc 10:19 AM.

  8. #8
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Dựa vào demo của Trung + chỉnh sửa, tớ đã viết được nhưng gặp phải lỗi gây crash!!!
    Tìm mãi ko ra lỗi, đành đưa lên đây nhờ anh em tìm hộ với.
    Nếu có gì ko rõ về code thì cứ ý kiến.
    Sai chỗ nào, chỗ nào nên sửa, chỗ nào viết lung tunh thi cứ thoải mái phát bỉu nha

    Theo mình thì sai ở lớp Car+ mấy method của nó thôi, nhất là medthod xechay()
    Đang cần bài này lắm lắm, giúp với nha.
    File mình đính kèm ở cuối bài, tải về mở cho tiện.
    C++ Code:
    1.  
    2. #include<conio.h>
    3. #include<graphics.h>
    4. #include<stdio.h>
    5. #include<stdlib.h>
    6. #include<alloc.h>
    7. #include<dos.h>
    8. #include<time.h>
    9. #include<math.h>
    10.  
    11. const int MAXSTAR = 100;
    12.  
    13. //Cac class can dung sau nay
    14. class Point
    15. {
    16.     private:
    17.         int x,y;
    18.     public:
    19.         Point()     { x= y= 0; }
    20.         Point(const int &_x, const int &_y )
    21.         {
    22.             x= _x;
    23.             y= _y;
    24.         }
    25.         void setx(const int &_x)    { x = _x; }
    26.         void sety(const int &_y)    { y = _y; }
    27.         int getx()  {  return x; }
    28.         int gety()  {  return y; }
    29. };
    30. class Star : public Point
    31. {
    32.     private:
    33.             int status, color, zoom;
    34.     public:
    35.             void setStatus( const int &status1 )    { status = status1; }
    36.             void setColor( const int &_drawColor )      { color = _drawColor; }
    37.             void setZoom( const int &zoom1 )        { zoom = zoom1; }
    38.            
    39.             int getStatus() { return status; }
    40.             int getColor()  { return color; }
    41.             int getZoom()   { return zoom; }
    42.            
    43.             void Star::drawStar( const int &);
    44. };
    45. void Star::drawStar( const int &draw)
    46. {
    47.     int color;
    48.     if (draw)   color = this->color;
    49.     else        color = BLACK;
    50.    
    51.     setcolor( color );
    52.     switch( status )    // Lon dhide` tu 1 -> 4
    53.     {
    54.         case 0: putpixel(getx(), gety(), color);
    55.                 break;
    56.  
    57.         case 1: line( getx()-1, gety(), getx()+1, gety() );
    58.                 line( getx(), gety()-1, getx(), gety() + 1 );
    59.                 break;
    60.  
    61.         case 2: line( getx()-2, gety(), getx()+2, gety());
    62.                 line( getx(), gety()-2, getx(), gety()+2);
    63.                 break;
    64.        
    65.         case 3: line( getx()-4, gety(), getx()+4, gety() );
    66.                 line( getx(), gety()-4, getx(), gety()+4 );
    67.                 rectangle( getx()-1, gety()-1, getx()+1, gety()+1 );
    68.                 break;
    69.     }
    70. }
    71. class Circle : public Point
    72. {
    73.     private:
    74.         //Point tam;    // tam hinh tron
    75.         int radius;       // ban kinh hinh tron
    76.         int drawColor;   // mau ve hinh tron
    77.         int fillColor;   // mau to hinh tron
    78.     public:
    79.        
    80.         Circle() : Point()
    81.         {
    82.             radius = drawColor = fillColor = 0;
    83.         }
    84.         Circle(int _x,int _y,int radius1,int _drawColor,int _fillColor) : Point(_x,_y)
    85.         {
    86.             radius = radius1;
    87.             drawColor = _drawColor;
    88.             fillColor = _fillColor;
    89.         }
    90.        
    91.         void drawCircle()
    92.         {
    93.             setcolor( drawColor );
    94.             circle( getx(), gety(), radius );
    95.             setfillstyle( SOLID_FILL, fillColor );
    96.             floodfill( getx(), gety(), drawColor );
    97.         }
    98. };
    99.  
    100. class Rectangle
    101. {
    102.     private:
    103.             Point vertex1,vertex2;
    104.             int drawColor;
    105.             int fillColor;
    106.     public:
    107.         Rectangle()
    108.         {
    109.             drawColor = fillColor = 0;
    110.         }
    111.         Rectangle(int _x,int _y, int m,int n, int _drawColor, int _fillColor) : vertex1( _x, _y ), vertex2( m, n )
    112.         {
    113.             drawColor = _drawColor;
    114.             fillColor = _fillColor;
    115.         }
    116.         void drawRectangle()
    117.         {
    118.             setcolor( drawColor );
    119.             setlinestyle( SOLID_LINE, 0, NORM_WIDTH );
    120.             rectangle( vertex1.getx(), vertex1.gety(), vertex2.getx(), vertex2.gety() );
    121.             setfillstyle( SOLID_FILL, fillColor );
    122.             floodfill( vertex1.getx() + 2, vertex1.gety() + 2, drawColor );
    123.         }
    124. };
    125.  
    126.  
    127.  
    128.  
    129. // Cac ham ve BackGround
    130. void drawStreetCorner()   //ve 2 goc duong
    131. {
    132.  
    133.     //int Corner1[]={ 230,0,   230,150, -2,150,  -2,120,  200,120, 200,0  };
    134.     int Corner1[]={ 0,120,   76,120,  76,130,  56,150,  0,150 };
    135.     int Corner1b[]={ 200,0,   200,120, 124,120, 124,130, 144,150, 230,150, 230,0 };
    136.     int Corner2[]={ 400,0,   400,150, 639,150, 639,120, 430,120, 430,0  };
    137.     int Corner3[]={ 0,330,   230,330, 230,479, 200,479, 200,360, 0,360  };
    138.     int Corner4[]={ 639,330, 400,330, 400,479, 430,479, 430,360, 639,360};
    139.  
    140.     setcolor( LIGHTGREEN );
    141.     //ve cac goc duong
    142.  
    143.     drawpoly( 5, Corner1 );
    144.     drawpoly( 7, Corner1b );
    145.     drawpoly( 6, Corner2 );
    146.     drawpoly( 6, Corner3 );
    147.     drawpoly( 6, Corner4 );
    148.  
    149.     //to mau vien ngoai duong
    150.     setfillstyle( SOLID_FILL, YELLOW );
    151.     //floodfill( 210,130, LIGHTGREEN );
    152.     floodfill( 30,130, LIGHTGREEN );
    153.     floodfill( 210,130, LIGHTGREEN );
    154.     floodfill( 410,130, LIGHTGREEN );
    155.     floodfill( 210,340, LIGHTGREEN );
    156.     floodfill( 450,340, LIGHTGREEN );
    157.  
    158.     //to mau ben trong khu dat
    159.     setfillstyle( CLOSE_DOT_FILL, LIGHTGREEN );
    160.     floodfill( 100,400, LIGHTGREEN );   //Duoi trai
    161.     setfillstyle( SOLID_FILL, BROWN );
    162.     floodfill( 500,100, LIGHTGREEN );   //Tren phai
    163.  
    164.     // ve hoa mau hong trong khu dat
    165.     setfillstyle( SOLID_FILL, LIGHTMAGENTA );
    166.  
    167.     for( int c= 5  ; c<=190; c+= 20 )   //Duoi trai
    168.     for( int d= 370; d<=479; d+= 20 )
    169.         pieslice( c,d, 0,360, 5 );
    170. }
    171.  
    172. void drawPark()
    173. {
    174.     //ve cong vien
    175.     setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    176.  
    177.     //ve co trong cong vien
    178.     line( 76,120, 124,120 );
    179.     setfillstyle( INTERLEAVE_FILL, LIGHTGREEN );
    180.     floodfill( 100,100, LIGHTGREEN );
    181.  
    182.     //ve va to bang
    183.     Rectangle *rec = new Rectangle( 60,50, 140,80, LIGHTBLUE, WHITE );
    184.     (*rec).drawRectangle();
    185.     delete rec;
    186.  
    187.     //In chu PARK
    188.     settextstyle( 0, HORIZ_DIR, 2 );
    189.     outtextxy( 70,60, "PARK" );
    190.  
    191.     setcolor( BROWN );
    192.     setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    193.     //ve cot dung
    194.     line( 25,120, 25,85 );
    195.     line( 50,120, 50,85 );
    196.     line( 155,120, 155,85 );
    197.     line( 180,120, 180,85 );
    198.     line( 198,120, 198,0 );
    199.     //ve thanh ngang
    200.     line( 70,90, -1,90 );
    201.     line( 70,105, -1,105 );
    202.     line( 130,90, 198, 90 );
    203.     line( 130,105, 198, 105 );
    204.  
    205.     //ve 2 tru
    206.     Rectangle *column1 = new Rectangle( 70,80, 76,120, WHITE, WHITE );
    207.     Rectangle *column2 = new Rectangle( 124,80, 130,120, WHITE, WHITE );
    208.     (*column1).drawRectangle();
    209.     (*column2).drawRectangle();
    210.     delete column1;
    211.     delete column2;
    212.  
    213.     //to duong vao cong vien
    214.     setfillstyle( SOLID_FILL, DARKGRAY );
    215.     bar( 76,82, 124,150 );
    216.  
    217.     //vach duong vao cong vien
    218.     setlinestyle( DASHED_LINE, 0, THICK_WIDTH );
    219.     line( 100,130, 100,81 );
    220. }
    221. void drawLake()
    222. {
    223.     //ve ho nuoc
    224.     Rectangle *lake = new Rectangle( 430,360, 639,479, YELLOW, LIGHTBLUE );
    225.     (*lake).drawRectangle();
    226.  
    227.     //ve nuoc
    228.     setcolor( WHITE );
    229.     setlinestyle( DASHED_LINE, 0, THICK_WIDTH );
    230.     for( int y = 370; y<=480; y+=40 )
    231.     for( int x = 440; x <= 680; x+=30 )
    232.     line( x,y, x+15,y );
    233.  
    234.     for( y = 390; y<=500; y+=40)
    235.     for( x = 455; x<=680; x+=30)
    236.     line( x,y, x+15,y );
    237. }
    238.  
    239. void bungbinh()
    240. {
    241.     //Mau ve
    242.     setcolor( DARKGRAY );
    243.  
    244.     setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    245.     circle( 320,240, 20 );     //drawCircle vong tron ben trong
    246.     circle( 320,240, 40 );     //drawCircle vong tron ben ngoai
    247.  
    248.     setfillstyle( INTERLEAVE_FILL, LIGHTBLUE ); //To vong tron trong
    249.     floodfill( 320,240, DARKGRAY );
    250.  
    251.     setfillstyle( SOLID_FILL, WHITE );      //To vong tron ngoai
    252.     floodfill( 320,270, DARKGRAY );
    253. }
    254.  
    255. void drawTree()
    256. {
    257.     //Mau drawCircle
    258.     setcolor( GREEN );
    259.  
    260.     for( int x= 20; x<= 170; x+= 30 )
    261.     {
    262.         ellipse( x,310, 0,360, 10,30 ); //Goc duoi trai
    263.  
    264.         //Thiet lap kieu to va` to mau cho cay
    265.         setfillstyle( 1, GREEN );
    266.         floodfill( x,300, GREEN );
    267.  
    268.         //drawCircle than cay
    269.         setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    270.         line( x,320 ,x,350 );   //Duoi trai
    271.  
    272.     }
    273.     for( x= 450; x<= 639; x+= 30 )
    274.     {
    275.         ellipse( x,310, 0,360, 10,30 ); //Goc duoi phai
    276.  
    277.         //Thiet lap kieu to va to mau cho cay
    278.         setfillstyle( 1, GREEN );
    279.         floodfill( x,300, GREEN );
    280.  
    281.         //drawCircle than cay
    282.         setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    283.         line( x,325, x,350 );   //Duoi phai
    284.  
    285.     }
    286.     //for( int y = 0; y<120; y+=60 )
    287.     for( x = 450; x<= 650; x+=60)
    288.     {
    289.         ellipse( x,0, 0,360, 10, 30 );
    290.         setfillstyle( SOLID_FILL, GREEN );
    291.         floodfill( x,0, GREEN );
    292.         setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    293.         line( x,25, x,50 );
    294.  
    295.     }
    296.     for( x = 480; x<=650; x+=60 )
    297.     {
    298.         ellipse( x,60, 0 ,360, 10, 30 );
    299.         setfillstyle( SOLID_FILL,GREEN );
    300.         floodfill( x,60, GREEN );
    301.         line ( x,85, x,110 );
    302.     }
    303.    
    304. }
    305.  
    306. void vachduong()
    307. {
    308.     setcolor( WHITE );
    309.     setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    310.     // vach duong
    311.     line( 190,150, 190,330 );
    312.     line( 450,150, 450,330 );
    313.     line( 230,110, 400,110 );
    314.     line( 230,370, 400,370 );
    315.      // vach duong cho nguoi di bo
    316.     for( int y= 160; y<= 320; y+= 10 )
    317.     {
    318.         line( 200,y, 220,y );
    319.         line( 420,y, 440,y );
    320.     }
    321.     for(int x= 240; x<= 390; x+= 10 )
    322.     {
    323.         line( x,340, x,360 );
    324.         line( x,120, x,140 );
    325.     }
    326.     // vach duong o giua
    327.     setlinestyle( DASHED_LINE, 0, THICK_WIDTH );
    328.     line( 0,240,   190,240 );
    329.     line( 450,240, 639,240 );
    330.     line( 320,0,   320,110 );
    331.     line( 320,370, 320,479 );
    332. }
    333.  
    334.  
    335.  
    336. void drawLightPanel()
    337. {
    338.     setcolor( LIGHTGRAY );
    339.     setlinestyle( SOLID_LINE, 0, NORM_WIDTH );
    340.     rectangle( 400,270, 440,350 );     //ve bang den
    341.  
    342.     setfillstyle( SOLID_FILL, BROWN );  //to mau bang den
    343.     floodfill( 410,346, LIGHTGRAY );
    344.  
    345.     setlinestyle( SOLID_LINE, 0, THICK_WIDTH );
    346.     line( 420,350, 420,370 );           //ve chan den
    347. }
    348.  
    349. void drawLight( const int &statusColor )    // 0 = do, 1 = vang, 2 = xanh
    350. {
    351.     switch( statusColor )
    352.     {
    353.         case 0 :
    354.                 Circle yellowLight_stt0( 420,310, 10, LIGHTGRAY, LIGHTGRAY );
    355.                 yellowLight_stt0.drawCircle();
    356.  
    357.                 Circle redLight_stt0( 420,285, 10, RED, RED );
    358.                 redLight_stt0.drawCircle();
    359.  
    360.                 Circle greenLight_stt0( 420,335, 10, LIGHTGRAY, LIGHTGRAY );
    361.                 greenLight_stt0.drawCircle();
    362.  
    363.                 break;
    364.         case 1 :
    365.                 Circle yellowLight_stt1( 420,310, 10, YELLOW, YELLOW );
    366.                 yellowLight_stt1.drawCircle();
    367.  
    368.                 Circle redLight_stt1( 420,285, 10, LIGHTGRAY, LIGHTGRAY );
    369.                 redLight_stt1.drawCircle();
    370.  
    371.                 Circle greenLight_stt1( 420,335, 10, LIGHTGRAY, LIGHTGRAY );
    372.                 greenLight_stt1.drawCircle();
    373.  
    374.                 break;
    375.         case 2 :
    376.                 Circle yellowLight_stt2( 420,310, 10, LIGHTGRAY, LIGHTGRAY );
    377.                 yellowLight_stt2.drawCircle();
    378.  
    379.                 Circle redLight_stt2( 420,285, 10, LIGHTGRAY, LIGHTGRAY );
    380.                 redLight_stt2.drawCircle();
    381.  
    382.                 Circle greenLight_stt2( 420,335, 10, GREEN, GREEN );
    383.                 greenLight_stt2.drawCircle();
    384.  
    385.                 break;
    386.         };
    387. }
    388.  
    389. void drawStarSky()
    390. {
    391.     Star s[MAXSTAR];
    392.  
    393.     randomize();
    394.  
    395.     for( int i = 0; i< MAXSTAR; i++ )
    396.     {
    397.         s[i].setx( random( getmaxx() ) );
    398.         s[i].sety( random( getmaxy() ) );
    399.         s[i].setColor ( random( getmaxcolor() ) );
    400.         s[i].setStatus ( random( 4 ) );
    401.         s[i].setZoom ( random( 2 ) );
    402.     }
    403.  
    404.     // ve troi sao
    405.     while( !kbhit() )
    406.     {
    407.         for( int i = 0; i< MAXSTAR; i++ )
    408.             s[i].drawStar( 1 );
    409.         delay( 100 );
    410.  
    411.         for( i = 0; i< MAXSTAR; i++ )
    412.             s[i].drawStar( 0 );
    413.  
    414.         // Nhap nhay
    415.         for( i = 0; i< MAXSTAR; i++ )
    416.         {
    417.             if( s[i].getZoom() )    //1 = zoom in
    418.             {
    419.                 s[i].setStatus ( s[i].getStatus() + 1 );
    420.                 if( s[i].getStatus() == 3 ) s[i].setZoom ( 0 );
    421.             }
    422.             else    // 2 = zoom out
    423.             {
    424.                 s[i].setStatus ( s[i].getStatus() - 1 );
    425.                 if( s[i].getStatus() == 0 ) s[i].setZoom ( 1 );
    426.             }
    427.         }
    428.     }
    429.     getch();
    430. }
    431.  
    432.  
    433.  
    434.  
    435. //Ve hinh` nen`
    436. void drawBackGround()
    437. {
    438.     setbkcolor( DARKGRAY );
    439.     drawStreetCorner();
    440.     drawPark();
    441.     drawLake();
    442.     bungbinh();
    443.     vachduong();
    444.     drawTree();
    445.     drawLightPanel();
    446. }
    447. //class Xe
    448. class Car
    449. {
    450.     private:
    451.         int xshow,yshow;  //show xe tai vi tri xshow, yshow
    452.         char *ptr;          //tro toi vung nho luu anh xe
    453.         char *_ptr;         //luu anh man hinh nen duoi gam xe
    454.         int showStatus;       //trang thai show (showStatus=1),hide (showStatus=0)
    455.         enum {slow_down,stop,speed_up} movableStatus;
    456.     public:
    457.        
    458.         //Hàm này vẽ chiếc xe tải rồi lưu ảnh nó lại để khi vẽ dùng
    459.         void drawVan()
    460.         {
    461.             unsigned n;
    462.             char *scrPtr;  //con tro man hinh
    463.        
    464.             /*n la so byte can thiet de luu tru anh trong pham vi hcn
    465.             co toa do 530,190, 600,230 */
    466.                 n = imagesize( 530,190, 600,230 );
    467.        
    468.              // ph la con tro tro toi vung nho n byte moi duoc cap phat
    469.             scrPtr = new char [n];
    470.             //ham getimage chep thong tin hcn vao vung nho do bitmap tro toi
    471.             getimage( 530,190, 600,230, scrPtr );
    472.        
    473. //Bắt đầu vẽ                    
    474.            
    475.             setcolor( LIGHTGRAY );
    476.             setlinestyle( SOLID_LINE, 0, NORM_WIDTH);
    477.            
    478.             //Banh
    479.             Circle *wheel1 = new Circle( 550,220, 8, LIGHTGRAY, BROWN );
    480.             Circle *wheel2 = new Circle( 585,220, 8, LIGHTGRAY, BROWN );
    481.             Circle *wheel3 = new Circle( 550,220, 5, LIGHTGRAY, WHITE );
    482.             Circle *wheel4 = new Circle( 585,220, 5, LIGHTGRAY, WHITE );
    483.  
    484.             (*wheel1).drawCircle();
    485.             (*wheel2).drawCircle();
    486.             (*wheel3).drawCircle();
    487.             (*wheel4).drawCircle();
    488.            
    489.             delete wheel1;
    490.             delete wheel2;
    491.             delete wheel3;
    492.             delete wheel4;
    493.  
    494.             //Dau xe
    495.             int poly[] = { 535,210, 540,200, 550,200, 550,220, 530,220, 530,210, 535,210 };
    496.             drawpoly( 7, poly );
    497.             //To dau xe
    498.             setfillstyle( SOLID_FILL, WHITE );
    499.             floodfill( 540,215, LIGHTGRAY);
    500.             //ve cua xe
    501.             setfillstyle( SOLID_FILL, BLUE );
    502.             int poly2[] = { 538,210, 547,210, 547,203, 543,203 };
    503.             fillpoly( 4, poly2 );
    504.                
    505.             //Ve va to thung xe
    506.             Rectangle *tank = new Rectangle( 550,190, 600,220, LIGHTGRAY, WHITE );
    507.             (*tank).drawRectangle();
    508.             delete tank;
    509. //Kết thúc vẽ
    510.         //Lưu ảnh xe vào còn trỏ ptr, xóa con trỏ tạm scrPtr.
    511.  
    512.             ptr=new char [n];
    513.             getimage( 530,190, 600,230, ptr);
    514.             putimage( 530,190, scrPtr, COPY_PUT );
    515.  
    516.             delete scrPtr;
    517.             scrPtr = NULL;
    518. }
    519.  
    520.         //void drawVan()
    521.         void show(const int &_x, const int &_y)
    522.         {
    523.             if( ptr!=NULL && !showStatus) //chua show
    524.             {
    525.                 showStatus = 1;
    526.                 xshow = _x;
    527.                 yshow = _y;
    528.  
    529.                 putimage( xshow,yshow, ptr, COPY_PUT );
    530.             }
    531.         }
    532.         void hide()
    533.         {
    534.             if(showStatus) //dang show
    535.             {
    536.                 showStatus=0;
    537.                 putimage( xshow,yshow, _ptr,COPY_PUT);
    538.             }
    539.         }
    540.        
    541.         //Hàm này lưu ảnh vùng hcn trên đường trước khi vẽ xe vào contrỏ
    542.         //_ptr
    543.         //_x,_y, _x+70,_y+40 la toa do cua hcn chua xe
    544.         void luu_anh(const int &_x, const int &_y)
    545.         {
    546.             unsigned tmp = imagesize( _x,_y, _x+70,_y+40 );
    547.             _ptr = new char[tmp];
    548.             getimage( _x,_y, _x+70,_y+40, _ptr );
    549.         }
    550.    
    551.         //Hàm này trả về thời gian, mình sửa hund -> TIME cho dễ hiểu tí   
    552.         unsigned long int getTIME()
    553.         {
    554.             static struct time ti;
    555.             unsigned long int TIME;
    556.             gettime(&ti);
    557.             TIME = (ti.ti_hour*3600 + ti.ti_min*60 + ti.ti_sec)*1000 + ti.ti_hund*10 ;
    558.             return TIME;
    559.         }
    560.         //hàm này lưu ảnh trước khi vẽ xe, sau đó vẽ xe, cho delay, rồi lại xóa
    561.         //Kết hợp với lặp thì tạo được ảnh xe đi trên đường 
    562.         void move( const int &_x, const int &_y, const int &speed )
    563.         {
    564.             luu_anh( _x,_y );
    565.             show( _x,_y );
    566.             delay( speed );
    567.             hide();
    568.         }
    569.  
    570.         void Car::xechay( );
    571. };
    572.  
    573. //Cho xe chạy, lấy thời gian hiện tại, nếu thời gian hiện tại trừ thời gianbắt
    574. //đầu lớn hơn thời gian chờ thì thay đổi trạng thái của xe và đèn, nếu không
    575. //thì giữ trạng thái hiện taị
    576. //Thời gian chờ hiện tại ở đây là 3s
    577. void Car::xechay( )
    578. {
    579.     unsigned long start_time,curr_time;
    580.     start_time = curr_time = getTIME();
    581.     movableStatus = speed_up;
    582.     while( !kbhit() )
    583.     {
    584.         curr_time = getTIME();
    585.         if (curr_time - start_time > 3000)
    586.         {
    587.                 start_time = curr_time;
    588.                 if ( movableStatus == slow_down )
    589.                 {
    590.                     movableStatus = stop;
    591.                     drawLight( 0 );
    592.                 }
    593.                 else if ( movableStatus == stop )
    594.                 {
    595.                     movableStatus = speed_up;
    596.                     drawLight( 2 );
    597.                 }
    598.                 else
    599.                 {
    600.                     movableStatus = slow_down;
    601.                     drawLight( 1 );
    602.                 }
    603.         }
    604.         if ( movableStatus == slow_down)    move( 600,160, 100 - 50 );
    605.         if ( movableStatus == speed_up)     move( 600,160, 100 - 90 );
    606.         if ( movableStatus == stop) continue;
    607.         xshow--;
    608.         if( xshow < 0 ) xshow = 600;
    609.     }
    610. }                          
    611. void main()
    612. {
    613.     int mh= 0, mode= 0;
    614.     initgraph( &mh, &mode, "C:\\TC\\BGI" );
    615.  
    616.     drawStarSky();
    617.     cleardevice();
    618.  
    619.     drawBackGround();
    620.     Car Van;
    621.     Van.drawVan();
    622.     Van.xechay();
    623.    
    624.     getch();
    625.     closegraph();
    626. }
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi camping29 : 27-11-2008 lúc 04:56 PM. Lý do: Thêm thông tin bài viết.

  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    - Vấn đề đồ họa thì anh chịu, nhưng về C++ thì code thiếu const quá nhiều, constructor cũng vậy, dùng initialization list thay về phép gán.
    - Design idea không rõ ràng : Start và Circle tại sao là Point, is-a chẳng có ý nghĩa gì ở đây cả.
    - Tên biến tồi, ví dụ :
    C++ Code:
    1. void Star::drawStar( const int &draw)
    tại sao int lại mang tên là draw, nó chẳng thể hiện ý nghĩa gì ở đây cả !
    Đoạn này :
    C++ Code:
    1. switch( statusColor )
    2.     {
    3.         case 0 :
    4.                 Circle yellowLight_stt0( 420,310, 10, LIGHTGRAY, LIGHTGRAY );
    5.                 yellowLight_stt0.drawCircle();
    6.  
    7.                 Circle redLight_stt0( 420,285, 10, RED, RED );
    8.                 redLight_stt0.drawCircle();
    9.  
    10.                 Circle greenLight_stt0( 420,335, 10, LIGHTGRAY, LIGHTGRAY );
    11.                 greenLight_stt0.drawCircle();
    12.  
    13.                 break;
    14.         case 1 :
    15.                 Circle yellowLight_stt1( 420,310, 10, YELLOW, YELLOW );
    16.                 yellowLight_stt1.drawCircle();
    17.  
    18.                 Circle redLight_stt1( 420,285, 10, LIGHTGRAY, LIGHTGRAY );
    19.                 redLight_stt1.drawCircle();
    20.  
    21.                 Circle greenLight_stt1( 420,335, 10, LIGHTGRAY, LIGHTGRAY );
    22.                 greenLight_stt1.drawCircle();
    23.  
    24.                 break;
    25.         case 2 :
    26.                 Circle yellowLight_stt2( 420,310, 10, LIGHTGRAY, LIGHTGRAY );
    27.                 yellowLight_stt2.drawCircle();
    28.  
    29.                 Circle redLight_stt2( 420,285, 10, LIGHTGRAY, LIGHTGRAY );
    30.                 redLight_stt2.drawCircle();
    31.  
    32.                 Circle greenLight_stt2( 420,335, 10, GREEN, GREEN );
    33.                 greenLight_stt2.drawCircle();
    34.  
    35.                 break;
    36.         };
    Em có thể dùng polymorphism để implement it.
    Đây chỉ là 1 số design view points thôi. Vì anh không thể test nhưng theo anh code trên lỏng lẻo quá, nên viết kĩ hơn 1 chút.

  10. #10
    Ngày gia nhập
    03 2008
    Nơi ở
    Đà Nẵng city
    Bài viết
    40

    Hì thx r2 nha, mấy cái đó sẽ cố gắng khắc phục.
    Em có thể dùng polymorphism để implement it
    Dùng cái này ntn, em chưa học. :(

    Vẫn đang tiếp tục sửa code, nếu ai có thêm ý kiến gì thì cho xin nha

Các đề tài tương tự

  1. Giải thích giúp Giải thuật Euclid (tìm ƯSCLN)
    Gửi bởi duoirong trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 15
    Bài viết cuối: 15-04-2015, 12:06 PM
  2. Đệm nước - Gối nước: Mát mẻ - Êm ái - giúp cho giấc ngủ sâu hơn: Giải pháp cho mùa hè - tốt cho sức khỏe
    Gửi bởi aochoang_den04 trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 08-06-2012, 10:36 PM
  3. Dùng thuốc giảm cân giúp bạn nhanh giảm cân
    Gửi bởi nhontq trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 27-02-2011, 04:46 PM
  4. viên giảm cân giúp giảm cân nhanh nhất
    Gửi bởi nhontq trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 15-01-2011, 11:46 AM
  5. Tài liệu SQL bài tập về SQL và đại số quan hệ không biết giải các bạn giải giúp mình với!
    Gửi bởi doanketct trong diễn đàn Tài liệu, ebooks DB
    Trả lời: 2
    Bài viết cuối: 02-07-2010, 07:38 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn