共有回帖数  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 回复 
 
 
   
             
                  
                  
 
 
 
     
	 
  
	Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知