签到

05月11日
尚未签到

共有回帖数 0

    做月子

    等级:
    MFC贪吃蛇(豆子和蛇都会,变色,边速度)[原创](没位图)194行代码
    #includeafxwin.h
    #includetime.h
    #includestdlib.h
    class CMainWnd:public CFrameWnd{
    public:
       CMainWnd():uAddX(0),uAddY(0),lpptSNK(NULL),uSNKLong(0),ptBEA(5,5),
           Eat(false),SNKPace(500),BEAPace(4000){
           Create(NULL,"show",WS_OVERLAPPED|WS_SYSMENU|WS_CAPTION,
               CRect(0,0,408,465),NULL,NULL,WS_EX_OVERLAPPEDWINDOW);
       }
       void OnPaint();
       void OnChar(UINT,UINT,UINT);
       void OnTimer(UINT);
       int OnCreate(LPCREATESTRUCT);
       void OnClose();
    protected:
       void SNKMove();
       void CreateBEA();
       bool EatIt();
       void Start();
       int uAddX;
       int uAddY;
       bool Eat;
       UINT SNKPace;
       UINT BEAPace;
       CPoint ptBEA;
       CBrush **lpMapBrush;
       UINT uSNKLong;
       CPoint *lpptSNK;
    DECLARE_MESSAGE_MAP();
    };
    BEGIN_MESSAGE_MAP(CMainWnd,CFrameWnd)
        ON_WM_CREATE()
        ON_WM_CLOSE()
        ON_WM_PAINT()
        ON_WM_CHAR()
        ON_WM_TIMER()
    END_MESSAGE_MAP()
    class CWinMain:public CWinApp{
    public:
       virtual BOOL InitInstance(){
           m_pMainWnd=new CMainWnd;
           m_pMainWnd-ShowWindow(SW_SHOW);
           m_pMainWnd-UpdateWindow();
           m_pMainWnd-SetTimer(1,500,NULL);
           m_pMainWnd-SetTimer(2,4000,NULL);
           return TRUE;
       }
    }theMain;
    void CMainWnd::OnPaint(){
       CDC *pDC=this-GetDC();
       pDC-Rectangle(0,0,400,430);
       pDC-Rectangle(0,0,400,400);
       char cBuffer[100];
       sprintf(cBuffer,"蛇的长度是:%d,蛇的速度是:%d,豆的出现速度是:%d       ",
           uSNKLong,500-SNKPace,4000-BEAPace);
       pDC-TextOut(20,400,cBuffer);
       for(UINT i=0;iuSNKLong;i++){
           pDC-SelectObject(*(lpMapBrush+(lpptSNK+i)-x)+(lpptSNK+i)-y);
           pDC-Rectangle((lpptSNK+i)-x*20,(lpptSNK+i)-y*20,
               (lpptSNK+i)-x*20+20,(lpptSNK+i)-y*20+20);
       }
       if(!Eat){
           pDC-SelectObject(*(lpMapBrush+ptBEA.x)+ptBEA.y);
           pDC-Ellipse(ptBEA.x*20,ptBEA.y*20,
               ptBEA.x*20+20,ptBEA.y*20+20);
       }
       pDC-ReleaseAttribDC();
       ValidateRect(NULL);
    }
    void CMainWnd::OnTimer(UINT uID){
       if(uID==1)
           SNKMove();
       else if(uID==2)
           CreateBEA();
    }
    void CMainWnd::OnChar(UINT nChar,UINT,UINT){
       if(nChar=='w'){
           uAddX=0;
           uAddY=-1;
       }
       else if(nChar=='s'){
           uAddX=0;
           uAddY=1;
       }
       else if(nChar=='a'){
           uAddX=-1;
           uAddY=0;
       }
       else if(nChar=='d'){
           uAddX=1;
           uAddY=0;
       }
    }
    int CMainWnd::OnCreate(LPCREATESTRUCT){
       lpMapBrush=new CBrush*[20];
       for(int i=0;i20;i++){
           *(lpMapBrush+i)=new CBrush[20];
           for(int j=0;j20;j++)
               (*(lpMapBrush+i)+j)-
               CreateSolidBrush(RGB(50+i*10-j*8,50+i*10,255-j*10));
       }
       Start();
       return 1;
    }
    void CMainWnd::OnClose(){
       if(lpptSNK)
           delete[]lpptSNK;
       for(int i=0;i20;i++)
           delete[]*(lpMapBrush+i);
       delete[]lpMapBrush;
       DestroyWindow();
    }
    void CMainWnd::Start(){
       if(lpptSNK)
           delete[]lpptSNK;
       lpptSNK=new CPoint[6];
       uAddX=0;
       uAddY=0;
       SNKPace=500;
       BEAPace=4000;
       uSNKLong=6;
       for(int i=1;i=6;i++)
           *(lpptSNK+i-1)=CPoint(6-i,0);
       InvalidateRect(NULL);
    }
    bool CMainWnd::EatIt(){
       if(!uAddX&&!uAddY)
           return false;
       for(UINT i=0;iuSNKLong;i++)
           if((lpptSNK-x+uAddX)==(lpptSNK+i)-x&&
               (lpptSNK-y+uAddY)==(lpptSNK+i)-y)
               return true;
       return false;
    }
    void CMainWnd::SNKMove(){
       if(uAddX+lpptSNK-x0||uAddX+lpptSNK-x=20||

      uAddX+lpptSNK-y0||uAddX+lpptSNK-y=20||EatIt()){
           if(IDOK==MessageBox("GameOver"))
               Start();
           else
               PostMessage(WM_CLOSE);
       }
       else if(uAddX||uAddY){
           CPoint ptBuffer=*(lpptSNK),ptBuffer2;
           *(lpptSNK)+=CPoint(uAddX,uAddY);
           for(UINT i=1;iuSNKLong;i++){
               ptBuffer2.x=(lpptSNK+i)-x;
               ptBuffer2.y=(lpptSNK+i)-y;
               (lpptSNK+i)-x=ptBuffer.x;
               (lpptSNK+i)-y=ptBuffer.y;
               ptBuffer.x=ptBuffer2.x;
               ptBuffer.y=ptBuffer2.y;
           }
           if(!Eat)
               if(*(lpptSNK)==ptBEA){
                   Eat=true;
                   uSNKLong+=1;
                   CPoint *lpptOldSNK=lpptSNK;
                   lpptSNK=new CPoint[uSNKLong];
                   *(lpptSNK+uSNKLong-1)=ptBuffer;
                   for(UINT j=0;juSNKLong-1;j++)
                       *(lpptSNK+j)=*(lpptOldSNK+j);
                   SNKPace-=10;
                   BEAPace-=90;
                   SetTimer(1,SNKPace,NULL);
                   SetTimer(2,BEAPace,NULL);
               }
       }
       InvalidateRect(NULL);
    }
    void CMainWnd::CreateBEA(){
       if(Eat){
           srand((unsigned)time(0));
           CPoint ptBuffer;
           bool beaTrue=true;
           for(int i=0;i10;i++){
               ptBuffer.x=rand()%20;
               ptBuffer.y=rand()%20;
               for(UINT j=0;juSNKLong;j++)
                   if(ptBuffer==*(lpptSNK+j)){
                       beaTrue=false;
                       break;
                   }
               if(beaTrue){
                   ptBEA.y=ptBuffer.y;
                   ptBEA.x=ptBuffer.x;
                   Eat=false;
                   break;
               }
           }
           InvalidateRect(NULL);
       }
    }


    楼主 2016-01-15 16:21 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知