共有回帖数 0 个
- MFC贪吃蛇(豆子和蛇都会,变色,边速度)[原创](没位图)194行代码
-
只看楼主
收藏
回复
-
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号
意见反馈 |
关于直线 |
版权声明 |
会员须知