// Game.cpp: implementation of the CGame class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "大战僵尸.h"
#include "Game.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CGame::CGame()
{
for(int x=0;x<1000;x++)
{
for(int y=0;y<5;y++)
fr[x][y]=bh[x][y]=-1;
}
for(int i=0;i<5;i++)hjs[i]=0;
m_ks=zk=false;XS=0;
}
CGame::~CGame()
{
m_cc=0;
}
void CGame::DestroyJs(int z)
{
m_jsh[z].shm=-1;
hjs[m_jsh[z].y]-=1;
if(SZZ)return;
m_jshu-=1;
if (z < m_jshu)
{
m_jsh[z] = m_jsh[m_jshu];
m_jsh[z].shu = z;
}
Draw();
}
void CGame::CalZw()
{
for(int y=0;y<5;y++)
{
for(int x=0;x<1000;x++)
fr[x][y]=-1;
}
for(int i=0;i<m_zshu;i++)
fr[m_zhw[i].x][m_zhw[i].y]=i;
for(int y=0;y<5;y++)
{
for(int x=1;x<1000;x++)
{
if(fr[x][y]==-1)
fr[x][y]=fr[x-1][y];
}
}
}
void CGame::DestroyZw(int z)
{
m_zhw[z].shm=-1;
bh[m_zhw[z].x][m_zhw[z].y]=-1;
::KillTimer(m_wnd->m_hWnd,z);
::KillTimer(m_wnd->m_hWnd,z+10000);
m_zshu-=1;
if (z < m_zshu)
{
m_zhw[z] = m_zhw[m_zshu];
m_zhw[z].shu = z;
bh[m_zhw[z].x][m_zhw[z].y]=z;
m_wnd->KillTimer(m_zshu);//重置计时器
m_wnd->SetTimer(z,m_zhw[z].time,NULL);
if(m_zhw[z].time==100)//重置大招
{
m_wnd->KillTimer(m_zshu+10000);
m_wnd->SetTimer(z+10000,m_zhw[z].dztm,NULL);
}
}
CalZw();Draw();
}
void CGame::DestroyZw(int x,int y)
{
int shu=GetZwShu(x,y);
if(shu==-1)
return;
DestroyZw(shu);
}
void CGame::DestroyZd(int z)
{
m_zid[z].y=-1;
m_dshu-=1;
if(z<m_dshu)
m_zid[z]=m_zid[m_dshu];
Draw();
}
int CGame::GetZwShu(int x,int y)const
{
/*for(int i=0;i<m_zshu;i++)//遍历植物
{
if(m_zhw[i].x==x&&m_zhw[i].y==y)
return i;
}
return -1;*/
if(x<0||x>=1000||y<0||y>=5)return -1;
return bh[x][y];
}
void CGame::Eat(int zshu,int jshu)
{
if(m_jsh[jshu].lx==15)
{
Crepeer(jshu);
return;
}
if(m_jsh[jshu].beat)
{
int t=GetJsEat(m_zhw[zshu],m_jsh[jshu],*this);//特殊吃法
if(t)m_jsh[jshu].id=t;
return;
}
m_zhw[zshu].shm-=m_jsh[jshu].eat;
if(m_jsh[jshu].lx<100&&m_jsh[jshu].eat)//吃东西恢复生命
{
if(m_jsh[jshu].lx==0)
m_jsh[jshu].shm+=rand()%200==0;
else if(m_jsh[jshu].lx==1)
m_jsh[jshu].shm+=rand()%160==0;
else if(m_jsh[jshu].lx==6)
m_jsh[jshu].shm+=rand()%50==0;
else if(m_jsh[jshu].lx!=4)
m_jsh[jshu].shm+=rand()%100==0;
m_jsh[jshu].id=GetJsIcon(m_jsh[jshu],*this);
}
m_zhw[zshu].id=GetZwIcon(m_zhw[zshu]);
if(m_zhw[zshu].shm<=0)//吃光
{
m_zhw[zshu].shm=0;
DestroyZw(zshu);
}
}
int CGame::GetFirstJs(int x,int y)
{
int first=10000,rtn=-1;
for(int i=0;i<m_jshu;i++)//遍历僵尸
{
if(m_jsh[i].shm==-1)
continue;
if(m_jsh[i].x<first&&m_jsh[i].x>x&&m_jsh[i].y==y&&m_jsh[i].lx<100)
{
rtn=i;
first=m_jsh[i].x;
}
}
return rtn;
}
int CGame::GetFirstZw(int x,int y)
{
if(x<=0)return -1;
return fr[x-1][y];
}
void CGame::Goj(int zshu)//植物攻击
{
if(m_zhw[zshu].mg&&(m_lx==0||m_lx==1||m_lx==4))
return;
if(m_zhw[zshu].goj<0)//非标准植物
{
NotZw(zshu);
return;
}
if(m_zhw[zshu].zha)
{
m_zhw[zshu].fu-=1;
if(m_zhw[zshu].fu<0)
m_zhw[zshu].fu=0;
m_zhw[zshu].id=GetZwIcon(m_zhw[zshu]);
Draw();
int rtn=GetFirstJs(m_zhw[zshu].x,m_zhw[zshu].y);
if(rtn==-1)return;
if(m_jsh[rtn].x<m_zhw[zshu].x+250&&m_zhw[zshu].fu==0)
{
KillJs(m_jsh[rtn].x,m_jsh[rtn].y,m_zhw[zshu].goj);
if(m_zhw[zshu].hb)
{
DestroyZw(zshu);
return;
}
m_zhw[zshu].fu=m_zhw[zshu].sd;
m_zhw[zshu].id=GetZwIcon(m_zhw[zshu]);
}
return;
}
if(hjs[m_zhw[zshu].y]>0)
{
SZid zd;//发射子弹
zd.color=m_zhw[zshu].color;
zd.sd=m_zhw[zshu].sd;
zd.x=m_zhw[zshu].x;
zd.y=m_zhw[zshu].y;
zd.goj=m_zhw[zshu].goj;
zd.dx=m_zhw[zshu].dx;
zd.hb=m_zhw[zshu].hb;
NewZd(zd);
}
}
void CGame::NewZd(SZid zd)
{
if(m_dshu>150)//上限
return;
m_zid[m_dshu++]=zd;
}
void CGame::NewJs(SJsh js)
{
if(m_jshu>300)//上限
return;
hjs[js.y]+=1;
m_jsh[m_jshu]=js;
m_jsh[m_jshu].shu = m_jshu;
m_jshu+=1;
Draw();
}
bool CGame::NewZw(SZhw zw)
{
if(m_keng[zw.x/110][zw.y]==1||(m_keng[zw.x/110][zw.y]==2&&zw.lx!=14))//有坑,或有水且不是荷叶
return false;
if(GetZwShu(zw.x,zw.y)!=-1)
return false;
m_yg-=zw.yg;
if(m_yg<0)
{
m_yg+=zw.yg;
return false;
}
if(zw.lx==14)
{
if(m_keng[zw.x/110][zw.y]==2)
{
m_keng[zw.x/110][zw.y]=3;
return true;
}
return false;
}
int i=m_zshu;
m_zhw[i]=zw;
bh[zw.x][zw.y]=i;
m_zhw[i].shu=i;
m_zhw[i].id=GetZwIcon(m_zhw[i]);
SetTimer(m_wnd->m_hWnd,i,zw.time,NULL);
m_zshu+=1;
Draw();
if(zw.time==1)
Goj(i);
CalZw();
return true;
}
bool CGame::MoveJs(int shu)
{
if(m_jsh[shu].hb%2==0||(m_jsh[shu].lx==12&&m_jsh[shu].shm>30))//若寒冰效果,速度变为一半,车不受影响
{
int i=GetFirstZw(m_jsh[shu].x,m_jsh[shu].y);
m_jsh[shu].x-=m_jsh[shu].sd;
if(i!=-1&&m_jsh[shu].x-80<=m_zhw[i].x)
{
m_jsh[shu].x+=m_jsh[shu].sd;
Eat(i,shu);
}
if(m_jsh[shu].x<-110&&!m_over)
{
if(m_jsh[shu].lx==11)//?
{
m_jsh[shu].sd=-10;
return false;
}
if(m_jsh[shu].lx>=100)//僵尸的子弹
{
DestroyJs(shu);
return true;
}
if(m_car[m_jsh[shu].y])//车 此处有BUG
{
int ty=m_jsh[shu].y;
KillJsLine(m_jsh[shu].y,1000);
m_car[ty]=false;
Draw();
}
else
{
m_over=true;
int s=0;
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].lx<100)
s+=1;
}
CString st;
st.Format("失败
得分:%d",m_wnd->jd-s);
::MessageBox(m_wnd->m_hWnd,st,"提示",MB_OK);
KillAll();
}
}
}
if(m_jsh[shu].lx==15)//苦力怕走得慢
m_jsh[shu].hb^=1;
else
{
m_jsh[shu].hb+=1;
if(m_jsh[shu].hb>100)
m_jsh[shu].hb=100;
}
if(m_jsh[shu].fs)
{
m_jsh[shu].fss+=1;
if(m_jsh[shu].fss>=35)//发射时间
{
m_jsh[shu].fss=0;
Fash(m_jsh[shu],*this);
}
}
return false;
}
void CGame::Crepeer(int i)
{
if(m_jsh[i].lx==15)//苦力怕
{
int x=(m_jsh[i].x/110)*110,y=m_jsh[i].y;
for(int a=-2;a<=1;a++)
{
for(int b=-1;b<=1;b++)
{
int z=GetZwShu(x+a*110,y+b);
if(z!=-1)
{
m_zhw[z].shm-=300;
if(m_zhw[z].shm<=0)
DestroyZw(z);
else
m_zhw[z].id=GetZwIcon(m_zhw[z]);
}
}
}
}
DestroyJs(i);
}
SZid p_zid[1000];SJsh p_jsh[1000];
int cmp1(const void*a,const void*b)
{
return p_zid[*(int*)a].x-p_zid[*(int*)b].x;
}
int cmp2(const void*a,const void*b)
{
return p_jsh[*(int*)a].x-p_jsh[*(int*)b].x;
}
void CGame::MoveAllZd()//双指针
{
SZZ=true;
int zs[5]={0},js[5]={0};
for(int i=0;i<m_dshu;i++)
{
int y=m_zid[i].y;
pd[y][zs[y]++]=i;
p_zid[i]=m_zid[i];
}
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].lx>=100)continue;
int y=m_jsh[i].y;
pj[y][js[y]++]=i;
p_jsh[i]=m_jsh[i];
}
for(int y=0;y<5;y++)
{
qsort(pd[y],zs[y],sizeof(int),cmp1);
qsort(pj[y],js[y],sizeof(int),cmp2);
for(int a=0,b=0;a<zs[y];a++)
{
int shu=pd[y][a],zx=m_zid[shu].x;
m_zid[shu].x+=m_zid[shu].sd*3;
while(b<js[y]&&(m_jsh[pj[y][b]].x<=zx||m_jsh[pj[y][b]].shm<0))b+=1;
int i=(b==js[y]?-1:pj[y][b]);
if(i!=-1&&m_zid[shu].x+55>=m_jsh[i].x)
{
int tx=m_jsh[i].x;
m_jsh[i].shm-=m_zid[shu].goj;
if(m_zid[shu].hb)
m_jsh[i].hb=0;
m_jsh[i].id=GetJsIcon(m_jsh[i],*this);
if(m_jsh[i].shm<=0)
{
if(m_jsh[i].lx==15&&rand()%2==0)
Crepeer(i);
else
DestroyJs(i);
b+=1;
}
if(m_zid[shu].goj>=4)//群体伤害
{
int y=m_zid[shu].y,z=(m_zid[shu].goj==5?-1:1);
if(y>0)KillJs(tx,y-1,z);
if(y<4)KillJs(tx,y+1,z);
KillJs(tx,y,z);
}
m_zid[shu].y=-1;
}
if(m_zid[shu].x>920)m_zid[shu].y=-1;
}
}
int sa=0,sb=0;
for(int i=0;i<m_dshu;i++)
{
if(m_zid[i].y!=-1)
tmz[sa++]=m_zid[i];
}
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].shm!=-1)
tmj[sb++]=m_jsh[i];
}
m_dshu=sa;m_jshu=sb;
for(int i=0;i<sa;i++)m_zid[i]=tmz[i];
for(int i=0;i<sb;i++)
{
m_jsh[i]=tmj[i];
m_jsh[i].shu=i;
}
SZZ=false;Draw();
}
bool CGame::MoveZd(int shu)
{
int i=GetFirstJs(m_zid[shu].x+52,m_zid[shu].y);//此处待优化
m_zid[shu].x+=m_zid[shu].sd*2;
if(i!=-1&&m_zid[shu].x+55>=m_jsh[i].x)
{
m_jsh[i].shm-=m_zid[shu].goj;
if(m_zid[shu].hb)
m_jsh[i].hb=0;
m_jsh[i].id=GetJsIcon(m_jsh[i],*this);
if(m_jsh[i].shm<=0)
{
if(m_jsh[i].lx==15)
Crepeer(i);
else
DestroyJs(i);
}
if(m_zid[shu].goj>=4)//群体伤害
{
int y=m_zid[shu].y;
if(y>0)KillJs(m_zid[shu].x,y-1,-1);
if(y<4)KillJs(m_zid[shu].x,y+1,-1);
KillJs(m_zid[shu].x,y,-1);
}
DestroyZd(shu);
return true;
}
if(m_zid[shu].x>920)
{
DestroyZd(shu);
return true;
}
return false;
}
void CGame::Draw()
{
CDC *dc=m_wnd->GetDC();
//双缓冲绘图
CDC memdc;
memdc.CreateCompatibleDC(NULL);
CRect r;
m_wnd->GetClientRect(&r);
r.bottom = 600; r.right = 1060;
CBitmap bit;
bit.CreateCompatibleBitmap(dc,r.Width(),r.Height());
memdc.SelectObject(&bit);
COLORREF color=(m_lx==0||m_lx==1||m_lx==4||m_lx==5)?RGB(240,240,240):RGB(28,28,158);
CBrush br(color);
memdc.FillRect(r,&br);
br.DeleteObject();
int s100=100,s150=150;
if(m_lx==2||m_lx==3)s100/=1.5,s150/=1.5;
CBrush br100(RGB(s100,s100,s100)),br150(RGB(s150,s150,s150));
for(int x=0;x<9;x++)
{
for(int y=0;y<5;y++)
{
if((x+y)%2==0)
memdc.FillRect(CRect(x*110+50,y*110,x*110+110+50,y*110+110),&br100);
else
memdc.FillRect(CRect(x*110+50,y*110,x*110+110+50,y*110+110),&br150);
}
}
br100.DeleteObject();br150.DeleteObject();
for(int i=0;i<9;i++)
{
for(int j=0;j<5;j++)
{
if(m_keng[i][j]==0)
continue;
HICON icon=HICON(LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON58+m_keng[i][j]),IMAGE_ICON,110,110,LR_DEFAULTCOLOR));
::DrawIconEx(memdc.m_hDC,i*110+50,j*110,icon,110,110,0,NULL,DI_NORMAL);
::DestroyIcon(icon);
}
}
for(int i=0;i<m_zshu;i++)
{
if(m_zhw[i].shm==-1)
continue;
HICON icon=HICON(LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(m_zhw[i].id),IMAGE_ICON,110,110,LR_DEFAULTCOLOR));
::DrawIconEx(memdc.m_hDC,m_zhw[i].x+50,m_zhw[i].y*110,icon,110,110,0,NULL,DI_NORMAL);
::DestroyIcon(icon);
}
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].shm==-1)
continue;
HICON icon=HICON(LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(m_jsh[i].id),IMAGE_ICON,110,110,LR_DEFAULTCOLOR));
::DrawIconEx(memdc.m_hDC,m_jsh[i].x+50,m_jsh[i].y*110,icon,110,110,0,NULL,DI_NORMAL);
::DestroyIcon(icon);
}
for(int i=0;i<m_dshu;i++)
{
if(m_zid[i].y==-1)
continue;
int left=(110-m_zid[i].dx)/2,right=left+m_zid[i].dx;
CPen p(0,1,m_zid[i].color);
CBrush br(m_zid[i].color);
memdc.SelectObject(&p);
memdc.SelectObject(&br);
memdc.Ellipse(m_zid[i].x+left+50,m_zid[i].y*110+left,m_zid[i].x+right+50,m_zid[i].y*110+right);
p.DeleteObject();
br.DeleteObject();
}
for(int n=0;n<5;n++)
{
if(m_car[n])
memdc.DrawIcon(0,n*110+39,AfxGetApp()->LoadIcon(IDI_ICON28));
}
if(m_lx==1||m_lx==3)
{
bool notmw[6][5]={0};
int next[8][2]={1,0,1,1,0,1,-1,1,-1,0,-1,-1,0,-1,1,-1};
for(int n=0,i=0;n<m_zshu;i++)
{
if(m_zhw[i].shm==-1)
continue;
n+=1;
if(m_zhw[i].lx==11)
{
for(int j=0;j<8;j++)
{
int x=m_zhw[i].x/110+next[j][0]-3;
int y=m_zhw[i].y+next[j][1];
if(!(x<0||x>=6||y<0||y>=5))
notmw[x][y]=true;
}
notmw[m_zhw[i].x/110-3][m_zhw[i].y]=true;
}
}
HICON icon=HICON(LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON91),IMAGE_ICON,110,110,LR_DEFAULTCOLOR));
for(int x=0;x<6;x++)
{
for(int y=0;y<5;y++)
{
if(!notmw[x][y])
::DrawIconEx(memdc.m_hDC,x*110+380,y*110,icon,110,110,0,NULL,DI_NORMAL);
}
}
::DestroyIcon(icon);
}
CFont *f=new CFont();
f->CreatePointFont(200,"宋体");
memdc.SelectObject(f);
CString str;
str.Format("阳光:%d ",m_yg+m_cc);
memdc.SetBkColor(color);
if(m_lx==2||m_lx==3)
memdc.SetTextColor(RGB(200,200,0));
memdc.TextOut(50,560,str);
dc->BitBlt(0,0,r.Width(),r.Height(),&memdc,0,0,SRCCOPY);
f->DeleteObject();
delete f;
memdc.DeleteDC();
m_wnd->ReleaseDC(dc);
bit.DeleteObject();
}
void CGame::NotZw(int shu)//特殊植物
{
int gj=-m_zhw[shu].goj;
int n;
int next[8][2]={110,0,110,1,0,1,-110,1,-110,0,-110,-1,0,-1,110,-1};
switch(gj)
{
case 1://向日葵
m_yg+=25;
break;
case 2://炸弹
for(n=0;n<8;n++)
KillJs(m_zhw[shu].x+next[n][0],m_zhw[shu].y+next[n][1],100);
KillJs(m_zhw[shu].x,m_zhw[shu].y,100);
DestroyZw(shu);
break;
case 3://火爆辣椒
KillJsLine(m_zhw[shu].y,90);
DestroyZw(shu);
break;
case 4://倭瓜
{
bool rtn=false;
rtn=rtn||KillJs(m_zhw[shu].x,m_zhw[shu].y,80);
if(!rtn)
rtn=rtn||KillJs(m_zhw[shu].x-110,m_zhw[shu].y,80);
if(!rtn)
rtn=rtn||KillJs(m_zhw[shu].x+110,m_zhw[shu].y,80);
if(rtn)
DestroyZw(shu);
break;
}
case 5://阳光菇
if(m_zhw[shu].fu<10)
m_yg+=15;
else
m_yg+=25;
m_zhw[shu].fu+=1;//生长
if(m_zhw[shu].fu>10)
m_zhw[shu].fu=10;
m_zhw[shu].id=GetZwIcon(m_zhw[shu]);
break;
case 6://毁灭菇
for(n=0;n<8;n++)
KillJs(m_zhw[shu].x+next[n][0],m_zhw[shu].y+next[n][1],210);
KillJs(m_zhw[shu].x,m_zhw[shu].y,210);
DestroyZw(shu);
m_keng[m_zhw[shu].x/110][m_zhw[shu].y]=1;//坑
break;
case 7://寒冰菇
m_hb=true;
for(int i=0;i<m_jshu;i++)
m_jsh[i].hb=0;
m_wnd->KillTimer(1006);
m_wnd->SetTimer(1006,4000,NULL);
DestroyZw(shu);
break;
case 8://全息坚果
m_zhw[shu].shm+=15;
if(m_zhw[shu].shm>800)
m_zhw[shu].shm=800;
m_zhw[shu].id=GetZwIcon(m_zhw[shu]);
break;
case 9://双子
m_yg+=25;
break;
case 10://医疗
for(int a=-1;a<=1;a++)
{
for(int b=-1;b<=1;b++)
{
if(a==0&&b==0)continue;
int z=GetZwShu(m_zhw[shu].x+a*110,m_zhw[shu].y+b);
if(z!=-1)
{
m_yg-=3;
if(m_yg<0)
{
m_yg=0;
goto ov;
}
if(m_zhw[z].shm<=100)
{
m_zhw[z].shm+=5;
if(m_zhw[z].shm>100)
m_zhw[z].shm=100;
}
else
{
m_zhw[z].shm+=24;
if(m_zhw[z].shm>1800)
m_zhw[z].shm=1800;
}
m_zhw[z].id=GetZwIcon(m_zhw[z]);
}
}
}
ov:
break;
}
Draw();
}
bool CGame::KillJs(int x, int y, int kill)//杀僵尸
{
if(x<0||y<0||x>=990||y>=5)
return false;
bool rtn=false;
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].shm<0)
continue;
if(m_jsh[i].y==y&&m_jsh[i].x<=x+75&&m_jsh[i].x>=x-75&&m_jsh[i].lx<100)
{
rtn=true;
if(kill>0)
m_jsh[i].shm-=kill;
else
{
m_jsh[i].shm+=kill;
m_jsh[i].hb=0;
}
m_jsh[i].id=GetJsIcon(m_jsh[i],*this);
if(m_jsh[i].shm<=0)
{
DestroyJs(i);
i-=1;
}
}
}
return rtn;
}
void CGame::KillJsLine(int y,int kill)//杀行
{
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].shm==-1)
continue;
if(m_jsh[i].y==y)
{
m_jsh[i].shm-=kill;
if(m_jsh[i].shm<=0)
{
DestroyJs(i);
i-=1;
}
else
m_jsh[i].id=GetJsIcon(m_jsh[i],*this);
}
}
}
void CGame::KillAll()
{
while(m_zshu>0)
DestroyZw(0);
while(m_jshu>0)
DestroyJs(0);
while(m_dshu>0)
DestroyZd(0);
Draw();
}
void CGame::CreateGame(int lx)
{
m_jshu=m_zshu=m_dshu=0;
m_yg=50;
m_over=false;
for(int i=0;i<50;i++)
m_zhw[i].shm=-1;
for(int i=0;i<1000;i++)
m_jsh[i].shm=-1;
for(int i=0;i<1000;i++)
m_zid[i].y=-1;
for(int i=0;i<5;i++)
m_car[i]=true;
for(int i=0;i<9;i++)
{
for(int j=0;j<5;j++)
m_keng[i][j]=0;
}
if(lx==4)
{
for(int i=0;i<9;i++)
{
for(int j=1;j<4;j++)
m_keng[i][j]=2;
}
}
m_ks=true;
m_hb=false;
m_lx=lx;
Draw();
}
int CGame::Find(int zz[20],int n,int hg)//找到最优的位置
{
for(int i=0;i<n;i++)
{
if(zz[i]==-1)
return i;
}
int zx=1e9,wz=-1;
for(int i=0;i<n;i++)
{
int t=m_zhw[zz[i]].yg;
if(hg>=10&&(m_zhw[zz[i]].lx==0||m_zhw[zz[i]].lx==20)&&XS<=(18+(m_wnd->m_gq==60?8:0))&&rand()%20<19)//要保留一些葵
t=500;
else if(m_zhw[zz[i]].lx==6&&m_zhw[zz[i]].shm<150)
t=25;
if(t<zx)
zx=t,wz=i;
}
return wz;
}
int CGame::Find(int zz[20],int n)//找到最优的位置
{
for(int i=0;i<n;i++)
{
if(zz[i]==-1)
return i;
}
int zx=1e9,wz=-1;
for(int i=0;i<n;i++)
{
int t=m_zhw[zz[i]].yg;
if((m_zhw[zz[i]].lx==0||m_zhw[zz[i]].lx==20)&&XS<=(18+(m_wnd->m_gq==60?8+rand()%2:0))&&rand()%20<19)//要保留一些葵
t=500;
else if(m_zhw[zz[i]].lx==6&&m_zhw[zz[i]].shm<150)
t=25;
if(t<zx)
zx=t,wz=i;
}
return wz;
}
int CGame::Valid(int x,int sy=0)//植物可行
{
int xu[10]={0,10,7,8,9,11,3,5,12},z=xu[x];
if(m_wnd->m_en[z]>=800&&m_wnd->m_zw[z].yg+sy<=m_yg)
return z;
return -1;
}
int CGame::FakeKill(int xl, int xr, int y, int kill)
{
if(y<0||y>=5)return 0;
int jg=0;
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].shm<0||m_jsh[i].lx>=100)
continue;
if(m_jsh[i].y==y&&m_jsh[i].x>=xl&&m_jsh[i].x<=xr&&m_jsh[i].lx<100)
{
int ad=m_jsh[i].shm;
if(m_jsh[i].shm>150)ad-=50;//不要立刻炸死巨人
if(m_jsh[i].lx==14||m_jsh[i].lx==15)ad+=25;
if(m_jsh[i].lx==13)ad+=10;
if(m_jsh[i].lx==16)ad+=12;
if(m_jsh[i].eat>=4)ad+=15;
jg+=ad;
}
}
return jg;
}
bool CGame::UnderGaint(int x,int y)
{
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].lx==9&&m_jsh[i].y==y&&m_jsh[i].x>=x-30&&m_jsh[i].x<=x+220)//不能在巨人的面前种植
return true;
}
return false;
}
bool CGame::UnderCar(int x,int y)
{
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].eat==40&&m_jsh[i].y==y&&m_jsh[i].x>=x-30)//不能在车的面前种植
return true;
}
return false;
}
bool CGame::BeforeShe(int x,int y)
{
int mi=10000;
for(int i=0;i<m_jshu;i++)
{
if((m_jsh[i].lx==8||m_jsh[i].lx==10)&&m_jsh[i].y==y&&m_jsh[i].x>=x-10&&m_jsh[i].x<mi)//不能在射手的面前种植
mi=m_jsh[i].x;
}
if(mi==10000)return false;
for(int i=x;i<=mi;i+=110)
{
int z=GetZwShu(i,y);
if(z!=-1&&m_zhw[z].shm>=400)//有坚果挡着
return false;
}
return true;
}
int CGame::FakeKillL(int y,int kill)//计算一行的价值
{
int jg=0;
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].y==y&&m_jsh[i].lx<100)
{
int ad=m_jsh[i].shm;
if(m_jsh[i].shm>150)ad-=60;//不要立刻炸死巨人
if(m_jsh[i].lx==14||m_jsh[i].lx==15)ad+=25;
if(m_jsh[i].lx==13)ad+=10;
if(m_jsh[i].lx==16)ad+=12;
if(m_jsh[i].eat>=4)ad+=15;
jg+=ad;
}
}
return jg;
}
void CGame::AI()
{
/*if(m_yg<250)//存储阳光(已废弃)
{
m_yg+=m_cc;
m_cc=0;
}*/
int ma=1e9,zy=-1,zx;bool ff=false;
for(int i=0;i<m_jshu;i++)//判断危机情况
{
if(m_jsh[i].lx>=100||m_jsh[i].eat==0||m_jsh[i].lx==16||m_jsh[i].sd==0)continue;//不对子弹,苦力怕,小偷进行处理
int x=((m_jsh[i].x+30)/110)*110,y=m_jsh[i].y,z;
int he=0;bool ji=false;
for(int j=x,tm=0;j>=0;j-=110)
{
int z=GetZwShu(j,y);
if(z!=-1)
{
if(m_zhw[z].lx==6||m_jsh[i].lx!=8)//不会跳过
tm+=(m_zhw[z].shm/m_jsh[i].eat)*(m_wnd->m_gq==60?34:40);
if(m_zhw[z].lx==4||m_zhw[z].lx==8||m_zhw[z].lx==10)
he+=(tm/m_zhw[z].time)*m_zhw[z].goj;
if(m_zhw[z].shm>=400)ji=true;//扫描到坚果
}
if(m_jsh[i].lx!=8)//特判跳跳
tm+=110/m_jsh[i].sd*40;
else
tm-=40;
}
int t=x/m_jsh[i].sd;//进家的时间
if(m_jsh[i].fs&&m_jsh[i].lx!=16)t+=100;
if(!m_car[y])t+=200;
if(he<=m_jsh[i].shm&&t<ma||(t==ma&&m_jsh[i].shm>zx))
ma=t,zy=y,zx=x,ff=(m_jsh[i].fs&&m_jsh[i].lx!=16);
if(!ji&&m_jsh[i].fs&&m_jsh[i].lx!=16)//种植坚果挡住子弹
{
for(int tx=x-110;tx>=0;tx-=110)
{
if(GetZwShu(tx,y)!=-1)
break;
if(!UnderGaint(tx,y))//找到第一个不在巨人脚下的位置
{
if((z=Valid(2,0))!=-1)
{
m_wnd->m_nzw=z;
int r=GetZwShu(tx,y);
if(r==-1||m_zhw[r].lx!=6)
{
DestroyZw(tx,y);
m_wnd->Plant(tx,y);
}
}
else if((z=Valid(1,0))!=-1)
{
m_wnd->m_nzw=z;
int r=GetZwShu(tx,y);
if(r==-1||m_zhw[r].lx!=6)
{
DestroyZw(tx,y);
m_wnd->Plant(tx,y);
}
}
break;
}
}
}
}
if(zy!=-1)//出现紧急情况
{
int zz[20];
for(int j=0;j<zx;j+=110)
zz[j/110]=GetZwShu(j,zy);
int rt=Find(zz,zx/110),z;//找到最优位置
if(rt!=-1)
{
bool un=UnderCar(rt*110,zy)||UnderGaint(rt*110,zy)||BeforeShe(rt*110,zy);//不能在巨人和车的下面种植
if((z=Valid(3,0))!=-1)//窝瓜
{
int zz[3]={GetZwShu(zx-110,zy),GetZwShu(zx,zy),GetZwShu(zx+110,zy)};
int r=Find(zz,3);//找到最优位置
m_wnd->m_nzw=z;DestroyZw(zx-110+r*110,zy);
m_wnd->Plant(zx-110+r*110,zy);
}
else if((z=Valid(4,0))!=-1&&!un)//西瓜
{
m_wnd->m_nzw=z;DestroyZw(rt*110,zy);
m_wnd->Plant(rt*110,zy);
}
else if(ff&&(z=Valid(2,0))!=-1)
{
m_wnd->m_nzw=z;
int r=GetZwShu(zx-110,zy);
if(r==-1||m_zhw[r].lx!=6)
{
DestroyZw(zx-110,zy);
m_wnd->Plant(zx-110,zy);
}
}
else if(ff&&(z=Valid(1,0))!=-1)
{
m_wnd->m_nzw=z;
int r=GetZwShu(zx-110,zy);
if(r==-1||m_zhw[r].lx!=6)
{
DestroyZw(zx-110,zy);
m_wnd->Plant(zx-110,zy);
}
}
else if((z=Valid(5,0))!=-1&&!un)
{
m_wnd->m_nzw=z;DestroyZw(rt*110,zy);
m_wnd->Plant(rt*110,zy);
}
else if(zx<=110&&(z=Valid(7,0))!=-1)//马上进家时可以炸死
{
m_wnd->m_nzw=z;DestroyZw(zx,zy);
m_wnd->Plant(zx,zy);
}
else if(zx<=110&&(z=Valid(6,0))!=-1)//马上进家时可以炸死
{
m_wnd->m_nzw=z;DestroyZw(zx,zy);
m_wnd->Plant(zx,zy);
}
}
}
int jian[5]={0};
if(Valid(2,25)!=-1)//种植高坚果
{
for(int i=0;i<m_zshu;i++)
{
if(m_zhw[i].lx==6&&m_zhw[i].shm>300&&m_zhw[i].x>=440)
jian[m_zhw[i].y]+=1;
}
zy=ma=-1;
for(int y=0;y<5;y++)
{
if(jian[y])continue;
int sh=0;
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].lx<100&&m_jsh[i].y==y)
sh+=m_jsh[i].shm+int(m_jsh[i].fs)*40;
}
if(sh>ma)ma=sh,zy=y;
}
if(zy!=-1)
{
int tx[4]={770,660,550,880},zz[20];
for(int s=0;s<4;s++)zz[s]=GetZwShu(tx[s],zy);
int rt=Find(zz,4);
if(!UnderGaint(tx[rt],zy)&&(!UnderCar(tx[rt],zy)||rand()%10==0))
{
m_wnd->m_nzw=7;DestroyZw(tx[rt],zy);
m_wnd->Plant(tx[rt],zy);jian[zy]+=1;
}
}
else if(rand()%(m_wnd->m_gq==60?8:20)==0)//有一定概率种植两排
{
zy=ma=-1;
for(int y=0;y<5;y++)
{
if(jian[y]>=2)continue;
int sh=0;
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].lx<100&&m_jsh[i].y==y)
sh+=m_jsh[i].shm+int(m_jsh[i].fs)*40;
}
if(sh>ma)ma=sh,zy=y;
}
if(zy!=-1)
{
int tx[4]={770,660,550,880},zz[20];
for(int s=0;s<4;s++)zz[s]=GetZwShu(tx[s],zy);
int rt=Find(zz,4);
if(!UnderGaint(tx[rt],zy)&&(!UnderCar(tx[rt],zy)||rand()%10==0))
{
m_wnd->m_nzw=7;DestroyZw(tx[rt],zy);
m_wnd->Plant(tx[rt],zy);jian[zy]+=1;
}
}
else if(m_wnd->m_gq==60&&rand()%15==0)//60关有一定概率种植三排
{
zy=ma=-1;
for(int y=0;y<5;y++)
{
if(jian[y]>=3)continue;
int sh=0;
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].lx<100&&m_jsh[i].y==y)
sh+=m_jsh[i].shm+int(m_jsh[i].fs)*40;
}
if(sh>ma)ma=sh,zy=y;
}
if(zy!=-1)
{
int tx[4]={770,660,550,880},zz[20];
for(int s=0;s<4;s++)zz[s]=GetZwShu(tx[s],zy);
int rt=Find(zz,4);
if(!UnderGaint(tx[rt],zy)&&(!UnderCar(tx[rt],zy)||rand()%10==0))
{
m_wnd->m_nzw=7;DestroyZw(tx[rt],zy);
m_wnd->Plant(tx[rt],zy);jian[zy]+=1;
}
}
}
}
}
int xs=0,s1=0;
for(int i=0;i<m_zshu;i++)
{
if(m_zhw[i].lx==1)
xs+=1,s1+=1;
if(m_zhw[i].lx==20)
xs+=2;
}
int mx=28+(m_wnd->m_gq==60?6:0);
if(m_jshu>=10)mx=15+(m_wnd->m_gq==60?4:0);
if(m_jshu>=15)mx=8+(m_wnd->m_gq==60?2:0);//僵尸太多就不要着急种葵了
if(m_jshu>=20)mx=0;
if(xs<=mx&&Valid(8,25))
{
bool zd=false;
bool yj[5]={0};
if(m_jshu>3&&zk)//有僵尸就需要坚果
{
for(int y=0;y<5;y++)
yj[y]=(jian[y]==0);
}
for(int x=0;x<=880;x+=110)
{
for(int y=0;y<5;y++)
{
if(yj[y])continue;//后面没有坚果就不种植
int r=GetZwShu(x,y);
if(r!=-1&&m_zhw[r].lx==6)yj[y]=true;
if(r==-1&&!UnderGaint(x,y)&&!UnderCar(x,y)&&!BeforeShe(x,y))
{
m_wnd->m_nzw=12;m_wnd->Plant(x,y);
xs+=2;zd=true;break;
}
}
if(zd)break;
}
}
if(xs<=mx&&(m_zshu==0||(Valid(0,50)!=-1&&(rand()%18==0||s1<5))))//种植向日葵
{
bool zd=false;
bool yj[5]={0};
if(m_jshu>3&&zk)//有僵尸就需要坚果
{
for(int y=0;y<5;y++)
yj[y]=(jian[y]==0);
}
for(int x=0;x<=880;x+=110)
{
for(int y=0;y<5;y++)
{
if(yj[y])continue;//后面没有坚果就不种植
int r=GetZwShu(x,y);
if(r!=-1&&m_zhw[r].lx==6)yj[y]=true;
if(r==-1)
{
if(!UnderGaint(x,y)&&!UnderCar(x,y)&&!BeforeShe(x,y))//不能在巨人的面前种植
{
m_wnd->m_nzw=0;m_wnd->Plant(x,y);
if(m_wnd->m_dzs>0&&!zk)
{
DaZhao(m_zhw[m_zshu-1],m_wnd);
m_wnd->m_dzs-=1;
}
else zk=true;
xs+=1;zd=true;break;
}
}
}
if(zd)break;
}
}
XS=xs;
if(xs>=5&&(m_yg>=600||rand()%5==0))//种瓜
{
int hg[5]={0},hj[5]={0};
for(int i=0;i<m_zshu;i++)
{
if(m_zhw[i].lx==4||m_zhw[i].lx==8||m_zhw[i].lx==10)
{
hg[m_zhw[i].y]+=m_zhw[i].goj;
if(m_zhw[i].hb)hg[m_zhw[i].y]+=1;
}
}
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].lx<100)
hj[m_jsh[i].y]+=(m_jsh[i].shm+(m_jsh[i].eat-1)*4+int(m_jsh[i].fs)*25);
}
ma=1e9,zy=-1;int z,zz[20],mz;
for(int y=0;y<5;y++)
{
if(!m_car[y])hg[y]-=4;
if(hg[y]-hj[y]/16<ma)
ma=hg[y]-hj[y]/16,mz=hg[y],zy=y;
}
if(mz<12+(m_wnd->m_gq==60?3:0)||rand()%24==0)//如果攻击力很高就先不种植
{
for(int x=0;x<=660;x+=110)
zz[x/110]=GetZwShu(x,zy);
int rt=Find(zz,7,mz);
if(rt!=-1&&!UnderGaint(rt*110,zy)&&!UnderCar(rt*110,zy)&&!BeforeShe(rt*110,zy))//不能在危险处种植
{
if((z=Valid(5,100))!=-1&&(zz[rt]==-1||m_zhw[zz[rt]].yg<=200))
{
m_wnd->m_nzw=z;DestroyZw(rt*110,zy);
m_wnd->Plant(rt*110,zy);
}
else if(((z=Valid(4,75))!=-1)&&rand()%12==0&&(zz[rt]==-1||m_zhw[zz[rt]].yg<=200))
{
m_wnd->m_nzw=z;DestroyZw(rt*110,zy);
m_wnd->Plant(rt*110,zy);
}
}
}
}
if(Valid(3,0)!=-1)//种植窝瓜
{
ma=-1;
for(int x=0;x<=880;x+=110)
{
for(int y=0;y<5;y++)
{
int r=GetZwShu(x,y);
if(r==-1||m_zhw[r].yg<=50)
{
int rt=FakeKill(x-75,x+75,y,90);
if(rt>ma)ma=rt,zx=x,zy=y;
}
}
}
if(ma>=90)
{
m_wnd->m_nzw=8;DestroyZw(zx,zy);
m_wnd->Plant(zx,zy);
}
}
else if(Valid(6,0)!=-1)//种植炸弹
{
ma=-1;
int next[8][2]={110,0,110,1,0,1,-110,1,-110,0,-110,-1,0,-1,110,-1};
for(int x=0;x<=880;x+=110)
{
for(int y=0;y<5;y++)
{
int r=GetZwShu(x,y);
if(r==-1||m_zhw[r].yg<=50)
{
int rt=0;
for(int s=-1;s<=1;s++)
rt+=FakeKill(x-185,x+185,y+s*110,100);
if(rt>ma)ma=rt,zx=x,zy=y;
}
}
}
if(ma>=(m_wnd->jd<=100?120:140)+(m_wnd->m_gq==60?30:0))
{
m_wnd->m_nzw=3;DestroyZw(zx,zy);
m_wnd->Plant(zx,zy);
}
}
else if(Valid(7,25)!=-1)//种植辣椒
{
ma=-1;
for(int y=0;y<5;y++)
{
int rt=FakeKillL(y,100);
if(rt>ma)ma=rt,zy=y;
}
if(ma>(m_wnd->jd<=100?100:120))
{
int zz[20];
for(int s=0;s<=880;s+=110)
zz[s/110]=GetZwShu(s,zy);
zx=Find(zz,9)*110;
m_wnd->m_nzw=5;DestroyZw(zx,zy);
m_wnd->Plant(zx,zy);
}
}
else if(m_wnd->m_dzs>0)
{
int xh[5]={0};
for(int i=0;i<m_jshu;i++)
{
if(m_jsh[i].lx<100)
xh[m_jsh[i].y]+=m_jsh[i].shm;
}
ma=-1,zy=-1;
for(int y=0;y<5;y++)
{
if(xh[y]>ma)
ma=xh[y],zy=y;
}
if(ma>=200)
{
bool zd=false;
for(int x=0;x<=220;x++)
{
int z=GetZwShu(x,zy);
if(z!=-1&&m_zhw[z].lx==10&&m_zhw[z].time==100)
{
zd=true;
break;
}
}
if(!zd)
{
for(int x=0;x<=220;x++)
{
int z=GetZwShu(x,zy);
if(z!=-1&&m_zhw[z].lx==10&&m_zhw[z].time!=100)
{
DaZhao(m_zhw[z],m_wnd);
m_wnd->m_dzs-=1;break;
}
}
}
}
}
if(Valid(1,150)!=-1&&rand()%16==0)//在最右侧种植小坚果
{
int x=770+(rand()%2)*110,y=rand()%5;
if(GetZwShu(x,y)==-1)
{
m_wnd->m_nzw=10;
m_wnd->Plant(x,y);
}
}
if(m_yg>1300&&m_wnd->m_dzs<5)
{
m_yg-=400;
m_wnd->m_dzs+=1;
}
/*if(m_yg>700)
{
m_cc+=50;
m_yg-=50;
}*/
}
// 大战僵尸Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "大战僵尸.h"
#include "大战僵尸Dlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
m_gq = 0;
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDI_ICON3);
}
void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMyDlg)
DDX_Control(pDX, IDC_PROGRESS1, cpr_jd);
DDX_Control(pDX, IDC_BUTTON1, cbu_zt);
DDX_Text(pDX, IDC_EDIT1, m_gq);
DDX_Check(pDX, IDC_CHECK1, m_ai);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_BUTTON3, OnButton3)
ON_BN_CLICKED(IDC_BUTTON4, OnButton4)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_CHECK1, &CMyDlg::OnBnClickedCheck1)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers
BOOL CMyDlg::OnInitDialog()
{
MessageBox(_T("规则:阳光自动收集。拖动植物种植,双击植物挖去,右键放大招。"));
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
//创建植物:子弹颜色,攻击力,攻击时间,移动速度(子弹)
m_zw[0].Create(0,-1,9000,1500,0,60,0,0,IDI_ICON2,50,1);//向日葵
m_zw[1].Create(RGB(0,255,0),1,2400,2000,4,60,0,0,IDI_ICON1,100,0);//豌豆射手
m_zw[2].Create(0,0,1000000000,1000000000,0,600,0,0,IDI_ICON4,50,2);//坚果
m_zw[3].Create(0,-2,1,0,0,50,0,0,IDI_ICON7,150,3);//炸弹
m_zw[4].Create(RGB(255,0,0),2,2300,2000,4,60,0,0,IDI_ICON8,200,4);//火球射手
m_zw[5].Create(0,-3,1,0,0,50,0,0,IDI_ICON9,125,5);//火爆辣椒
m_zw[6].Create(RGB(0,255,255),1,2400,2000,4,60,0,0,IDI_ICON48,175,9,10,true);//寒冰射手
m_zw[7].Create(0,0,1000000000,1000000000,0,1600,0,0,IDI_ICON11,125,6);//高坚果
m_zw[8].Create(0,-4,1,0,0,50,0,0,IDI_ICON12,50,7);//倭瓜
m_zw[9].Create(RGB(0,200,0),4,2400,2500,6,60,0,0,IDI_ICON43,375,8,30);//西瓜
m_zw[10].Create(0,-8,1000,1000000000,0,600,0,0,IDI_ICON82,75,19);//恢复坚果
m_zw[11].Create(RGB(0,255,255),5,2600,2400,5,60,0,0,IDI_ICON55,500,10,30,true);//冰瓜
m_zw[12].Create(0,-9,5000,1500,0,60,0,0,IDI_ICON94,125,20);//双子
m_zw[13].Create(0,-10,1000,1500,0,20,0,0,IDI_ICON95,125,21);//医疗
m_zw[14].Create(0,90,500,0,40,60,0,0,IDI_ICON68,150,16,0,false,false,true);//大嘴花
m_zw[15].Create(0,0,1000000000,0,0,60,0,0,IDI_ICON56,25,11);//灯
m_zw[16].Create(0,90,500,0,0,60,0,0,IDI_ICON71,25,17,40,true,false,true);//土豆地雷
m_zw[17].Create(0,-5,8900,0,0,60,0,0,IDI_ICON57,25,12,0,false,true);//阳光菇
m_zw[18].Create(RGB(255,0,255),1,4800,1600,4,60,0,0,IDI_ICON58,0,13,5,false,true);//小喷菇
m_zw[19].Create(0,-6,1,0,0,50,0,0,IDI_ICON63,125,15,10,false,true);//毁灭菇
m_zw[20].Create(0,-7,1,0,0,60,0,0,IDI_ICON72,125,18,0,false,true);//寒冰菇
m_zw[21].Create(0,0,1000000000,0,0,0,0,0,IDI_ICON62,25,14);//荷叶
//创建僵尸:速度,生命,吃的速度,0,0,图片ID,编号,是否能跳跃,是否发射
m_js[0].Create(1,5,1,0,0,IDI_ICON3,0);//普通僵尸
m_js[1].Create(1,12,1,0,0,IDI_ICON5,1);//塑料僵尸
m_js[2].Create(2,15,1,0,0,IDI_ICON29,5,true);//撑杆跳僵尸
m_js[3].Create(1,30,1,0,0,IDI_ICON6,2);//铁桶僵尸
m_js[4].Create(1,20,4,0,0,IDI_ICON32,6);//大嘴僵尸
m_js[5].Create(3,16,1,0,0,IDI_ICON10,3);//跑步僵尸
m_js[6].Create(1,15,1,0,0,IDI_ICON24,4);//报纸僵尸
m_js[7].Create(1,75,2,0,0,IDI_ICON36,7);//盾牌僵尸
m_js[8].Create(1,18,1,0,0,IDI_ICON73,13,false,true);//豌豆射手僵尸
m_js[9].Create(2,20,1,0,0,IDI_ICON44,8,true);//跳跳僵尸
m_js[10].Create(1,20,1,0,0,IDI_ICON79,14,false,true);//冰瓜僵尸
m_js[11].Create(2,90,40,0,0,IDI_ICON65,12);//小车僵尸
m_js[12].Create(1,200,200,0,0,IDI_ICON49,9);//巨人僵尸
m_js[13].Create(1,20,0,0,0,IDI_ICON93,15);//苦力怕
m_js[14].Create(2,25,2,0,0,IDI_ICON96,16,false,true);//末影人
//冷却速度
m_hf[0]=12;
m_hf[1]=15;
m_hf[2]=6;
m_hf[3]=0.9;
m_hf[4]=12;
m_hf[5]=1.1;
m_hf[6]=12;
m_hf[7]=5;
m_hf[8]=4;
m_hf[9]=10;
m_hf[10]=7.5;
m_hf[11]=3.8;
m_hf[12]=8;
m_hf[13]=3;
m_hf[14]=2.5;
m_hf[15]=12;
m_hf[16]=5;
m_hf[17]=15;
m_hf[18]=12;
m_hf[19]=2;
m_hf[20]=1.8;
m_hf[21]=12;
//相对概率
m_p[0]=3;
m_p[1]=4;
m_p[2]=4;
m_p[3]=5;
m_p[4]=6;
m_p[5]=6;
m_p[6]=5;
m_p[7]=8;
m_p[8]=8;
m_p[9]=9;
m_p[10]=6;
m_p[11]=4;
m_p[12]=3;
m_p[13]=8;
m_p[14]=7;
int zws[MAXGQS+1]={2,1,1,1,1,1,1,2,2,2,2,0,0,1,0,0,0,0,0,0,2,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0},n=0;//植物增加量
for(n=1;n<MAXGQS;n++)
zws[n]+=zws[n-1];
zws[n]=0;
for(n=0;n<=MAXGQS;n++)
m_zws[n]=zws[n];
m_game.m_wnd=this;
for(n=0;n<XUAN;n++)
m_xuan[n]=-1;
SHU=JSH=ND=0;
m_nzw=-1;
m_dzs=0;
//PlaySound("e:\bjyy.wav",NULL,SND_FILENAME|SND_ASYNC);
return TRUE; // return TRUE unless you set the focus to a control
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CMyDlg::OnPaint()
{
CDC *dc=GetDC();
CBrush b(RGB(128,128,128)),b2(RGB(240,240,240));
dc->FillRect(CRect(0,660,XUAN*110,800),&b2);
for(int n=0;n<XUAN;n++)
{
if(n>=SHU-(m_b11))
break;
dc->FillRect(CRect(n*110, 600,n*110+110,770),&b2);
dc->DrawIcon(n*110+39, 600,AfxGetApp()->LoadIcon(m_zw[m_xuan[n]].id));
if(!m_b11)
{
dc->FillRect(CRect(n*110, 600,n*110+110, 600 +int((800-m_en[m_xuan[n]])/800.0*80.0)),&b);
CString str;
str.Format("%d",m_zw[m_xuan[n]].yg);
dc->SetBkColor(RGB(240,240,240));
dc->TextOut(n*110+42,640,str);
}
dc->SetBkColor(RGB(240,240,240));
CString nu;nu.Format("快捷键:%d",n+1);
dc->TextOut(n*110+40,680,nu);
}
if(m_b11&&SHU)
dc->FillRect(CRect((SHU-1)*110, 600,(SHU-1)*110+110,770),&b2);
if(m_nzw!=-1)
{
dc->FillRect(CRect(1100,570,1210,680),&b2);
HICON icon=HICON(LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(m_zw[m_nzw].id),IMAGE_ICON,110,110,LR_DEFAULTCOLOR));
::DrawIconEx(dc->m_hDC,1100,570,icon,110,110,0,NULL,DI_NORMAL);
}
for(int n=0;n<5;n++)
{
if(n<m_dzs)
dc->DrawIcon(1060,n*110+50,AfxGetApp()->LoadIcon(IDI_ICON78));
else
dc->FillRect(CRect(1060, n * 110 + 50,1100,n*1150+110),&b2);
}
ReleaseDC(dc);
b.DeleteObject();
b2.DeleteObject();
m_game.m_wnd=this;
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CMyDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
bool CMyDlg::Plant(int x,int y)
{
bool rt=false;
if(x>=0&&x<=880&&y>=0&&y<5&&m_nzw!=-1)
{
if(!m_b11)
{
if(m_en[m_nzw]>=800)
{
m_zw[m_nzw].x=x;
m_zw[m_nzw].y=y;
if(m_game.NewZw(m_zw[m_nzw]))
m_en[m_nzw]=0;
}
OnPaint();
}
else
{
m_zw[m_nzw].x=x;
m_zw[m_nzw].y=y;
if(m_game.NewZw(m_zw[m_nzw]))
{
int n = 0;
for(n=0;n<SHU;n++)
{
if(m_xuan[n]==m_nzw)
break;
}
ASSERT(n<SHU);
for(n+=1;n<SHU;n++)
m_xuan[n-1]=m_xuan[n];
SHU-=1;
m_xuan[SHU]=-1;
m_game.m_yg=9999;
OnPaint();
m_game.Draw();
}
}
rt=true;
}
m_nzw=-1;return rt;
}
bool CMyDlg::Plant(CPoint pt)
{
ScreenToClient(&pt);
return Plant(((pt.x-50)/110)*110,pt.y/110);
}
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
CString str;
cbu_zt.GetWindowText(str);
if(m_game.m_over)
return CDialog::PreTranslateMessage(pMsg);
if(pMsg->message==WM_KEYDOWN)//快捷键
{
int z=pMsg->wParam;
if(z==' ')
{
OnButton1();
return true;
}
if(str=="继续")
return CDialog::PreTranslateMessage(pMsg);
if(z>='1'&&z<='9')
{
m_nzw=z-'1';
if(m_nzw>=XUAN||m_nzw>=SHU-(m_b11))
m_nzw=-1;
else
m_nzw=m_xuan[m_nzw];
}
}
if(str=="继续")
return CDialog::PreTranslateMessage(pMsg);
if(pMsg->message==WM_LBUTTONDBLCLK)//挖
{
CPoint pt=pMsg->pt;
ScreenToClient(&pt);
int x=int((pt.x-50)/110.0)*110;
int y=int(pt.y/110.0);
if(x>=0&&x<=880&&y>=0&&y<5)
m_game.DestroyZw(x,y);
}
else if(pMsg->message==WM_LBUTTONUP)
Plant(pMsg->pt);
else if(pMsg->message==WM_LBUTTONDOWN)
{
bool t=(m_nzw==-1);
if(m_nzw!=-1)
{
if(!Plant(pMsg->pt))
t=true;
}
if(t)
{
CPoint pt=pMsg->pt;
ScreenToClient(&pt);
int x=int(pt.x/110.0);
int y=int(pt.y/110.0);
if(y==5&&x<XUAN&&x<SHU-(m_b11))
m_nzw=m_xuan[x];
}
}
else if(pMsg->message==WM_RBUTTONUP)
{
if(m_dzs>0)
{
CPoint pt=pMsg->pt;
ScreenToClient(&pt);
int x=int((pt.x-50)/110.0)*110;
int y=int(pt.y/110.0);
if(x>=0&&x<=880&&y>=0&&y<5)
{
int rt=m_game.GetZwShu(x,y);
if(rt!=-1)
{
bool rtn=DaZhao(m_game.m_zhw[rt],this);
m_game.Draw();
if(rtn)
m_dzs-=1;
}
}
}
}
return CDialog::PreTranslateMessage(pMsg);
}
void CMyDlg::OnTimer(UINT nIDEvent)
{
if(m_game.m_over)
{
GameOver();
return;
}
CString str;
cbu_zt.GetWindowText(str);
if(str=="继续")
return;
if(nIDEvent<1000)
m_game.Goj(nIDEvent);
else
{
if(nIDEvent==1000)//移动僵尸
{
for(int i=0;i<m_game.m_jshu;i++)
{
if(!m_game.m_hb||m_game.m_jsh[i].lx>=100||m_game.m_jsh[i].lx==12)
{
if(m_game.MoveJs(i))
i-=1;
}
}
for(int n=0;n<MAXSHU;n++)//冷却
{
m_en[n]+=m_hf[n];
if(m_en[n]>800)
m_en[n]=800;
}
tm+=1;
m_game.Draw();
OnPaint();
}
else if(nIDEvent==1001)//移动子弹
m_game.MoveAllZd();
else if(nIDEvent==1002)//产生僵尸
{
if(m_b11)//Boss关卡
{
int r2=rand()%m_p[m_nd],n=0;
for(n=0;n<JSH;n++)
{
if(r2<m_p[n])
break;
}
m_js[n].x=885;
double r=double(rand())/RAND_MAX;
int wz=int(r*5);
if(wz<0)wz=0;
if(wz>=5)wz=4;
m_js[n].y=wz;
if(m_jwbs[m_js[n].y]>0)
m_game.NewJs(m_js[n]);
return;
}
if(m_n==ND-1)//结束
{
if(m_game.m_jshu==0)
{
KillTimer(1002);
m_game.m_over=true;
CString st;int yg=400*m_dzs+m_game.m_yg;
for(int i=0;i<m_game.m_zshu;i++)
yg+=m_game.m_zhw[i].yg;
int sc=jd+1+yg/25;
for(int y=0;y<5;y++)
{
if(m_game.m_car[y])
sc+=30;
}
st.Format("胜利
得分:%d",sc);
GameOver();
MessageBox(st,"提示");
m_game.KillAll();
}
return;
}
int r=rand()%m_p[m_nd],n=0;
for(n=0;n<JSH;n++)
{
if(r<m_p[n])
break;
}
m_js[n].x=885;
if(n==10)
{
int maxs=-100,wz;
if(m_hbzw)
{
for(int j=0;j<5;j++)
{
int shu=(tm-m_lstB[j])-(tm-m_lstC[j]);
if(shu>maxs)
{
maxs=shu;
wz=j;
}
}
}
if(maxs==-100)
{
for(int j=0;j<5;j++)
{
int shu=(tm-m_lstB[j])-(tm-m_lstJ[j]);
if(shu>maxs)
{
maxs=shu;
wz=j;
}
}
if(maxs==-100)
{
for(int j=0;j<5;j++)
{
int shu=(tm-m_lstB[j])-(tm-m_lstD[j]);
if(shu>maxs)
{
maxs=shu;
wz=j;
}
}
if(maxs==-100)
{
for(int j=0;j<5;j++)
{
int shu=(tm-m_lstB[j])-(tm-m_lstT[j]);
if(shu>maxs)
{
maxs=shu;
wz=j;
}
}
if(maxs==-100)
{
double r=double(rand())/RAND_MAX;
wz=int(r*5);
if(wz<0)
wz=0;
if(wz>=5)
wz=4;
}
}
}
}
m_js[n].y=wz;
m_lstB[wz]=tm;
}
else if(n==8||n==4)
{
int maxs=200,wz;
for(int j=0;j<5;j++)
{
int shu=tm-m_lstC[j];
if(shu<maxs)
{
maxs=shu;
wz=j;
}
}
if(maxs==200)
{
for(int j=0;j<5;j++)
{
int shu=tm-m_lstJ[j];
if(shu<maxs)
{
maxs=shu;
wz=j;
}
}
if(maxs==200)
{
for(int j=0;j<5;j++)
{
int shu=tm-m_lstD[j];
if(shu<maxs)
{
maxs=shu;
wz=j;
}
}
if(maxs==200)
{
for(int j=0;j<5;j++)
{
int shu=tm-m_lstT[j];
if(shu<maxs)
{
maxs=shu;
wz=j;
}
}
if(maxs==200)
{
double r=double(rand())/RAND_MAX;
wz=int(r*5);
if(wz<0)
wz=0;
if(wz>=5)
wz=4;
}
}
}
}
m_js[n].y=wz;
}
else if(n==12)
{
int max=-1,wz;
for(int j=0;j<5;j++)
{
int shu=tm-m_lstJ[j];
if(shu>max)
{
max=shu;
wz=j;
}
}
m_js[n].y=wz;
m_lstJ[wz]=tm;
}
else if(n==11)
{
int max=-1,wz;
for(int j=0;j<5;j++)
{
int shu=tm-m_lstC[j];
if(shu>max)
{
max=shu;
wz=j;
}
}
m_js[n].y=wz;
m_lstC[wz]=tm;
}
else if(n==7)
{
int max=-1,wz;
for(int j=0;j<5;j++)
{
int shu=tm-m_lstD[j];
if(shu>max)
{
max=shu;
wz=j;
}
}
m_js[n].y=wz;
m_lstD[wz]=tm;
}
else if(n==3)
{
int max=-1,wz;
for(int j=0;j<5;j++)
{
int shu=tm-m_lstT[j];
if(shu>max)
{
max=shu;
wz=j;
}
}
m_js[n].y=wz;
m_lstT[wz]=tm;
}
else
{
double r=double(rand())/RAND_MAX;
int wz=int(r*5);
if(wz<0)wz=0;
if(wz>=5)wz=4;
m_js[n].y=wz;
}
m_game.NewJs(m_js[n]);
if(!m_b11)
{
jd+=1;
cpr_jd.SetPos(jd);
}
}
else if(nIDEvent==1003)//阳光
{
m_game.m_yg+=25;
m_game.Draw();
}
else if(nIDEvent==1004)//改变速度
{
if(m_b11)
{
KillTimer(1002);
SetTimer(1002,1500,NULL);
KillTimer(1004);
return;
}
KillTimer(1002);
int lj=m_jg[m_n];m_n+=1;
if(m_n>ND-1)
m_n=ND-1;
SetTimer(1002,m_time[m_n],NULL);//重置生成速度
KillTimer(1004);
SetTimer(1004,m_jg[m_n],NULL);//重置修改速度
t_ne=clock()+int(m_jg[m_n]/1000.0*CLOCKS_PER_SEC);
if(lj!=1)
{
m_nd+=1;
if(m_nd>JSH-1)
m_nd=JSH-1;
}
if(m_time[m_n]<3000&&m_time[m_n]>1&&m_time[m_n-1]>3000&& m_time[m_n]!=100)
{
OnButton1();
//MessageBox("一大波僵尸即将来袭!","提示");
SJsh js;
js.Create(2,5,1,885,2,IDI_ICON40,-1);
m_game.NewJs(js);
OnButton1();
}
}
else if(nIDEvent==1005)//产生植物
{
if(SHU<XUAN)
{
int r;
while(1)
{
r=rand()%(MAXSHU-1)+1;
if((m_zw[r].lx==3||m_zw[r].lx==5||m_zw[r].lx==16)&&rand()%2==0)continue;
if(!m_zw[r].mg&&m_zw[r].lx!=14&&m_zw[r].lx!=11&&m_zw[r].lx!=12&&m_zw[r].lx!=20&&m_zw[r].lx!=21)
break;
}
m_xuan[SHU]=r;
SHU+=1;
}
for(int n=0;n<5;n++)
m_jwbs[n]=0;
int n=0;
for(int i=0;n<m_game.m_jshu;i++)
{
if(m_game.m_jsh[i].shm==-1)
continue;
n+=1;
if(m_game.m_jsh[i].lx==11)
m_jwbs[m_game.m_jsh[i].y]=m_game.m_jsh[i].shm;
}
jd=0;
for(int n=0;n<5;n++)
jd+=1000-m_jwbs[n];
cpr_jd.SetPos(jd);
if(jd==5000)
{
KillTimer(1002);
m_game.m_over=true;
GameOver();
MessageBox("胜利","提示",MB_OK);
m_game.KillAll();
}
for(int y=0;y<5;y++)
{
if(m_jwbs[y]<=0||m_game.m_jsh[y].lx!=11)
continue;
if(m_game.m_jsh[y].x>885)
{
m_game.m_jsh[y].x=885;
m_game.m_jsh[y].sd=0;
}
}
}
else if(nIDEvent==1006)//取消寒冰
{
KillTimer(1006);
m_game.m_hb=false;
}
else if(nIDEvent==1007)//踩
{
int ma[5]={0},max=-1,may;
for(int n=0,i=0;n<m_game.m_zshu;i++)
{
if(m_game.m_zhw[i].shm==-1)
continue;
n+=1;
ma[m_game.m_zhw[i].y]+=m_game.m_zhw[i].yg;
}
for(int y=0;y<5;y++)
{
if(m_jwbs[y]<=0||m_game.m_jsh[y].lx!=11)
continue;
if(ma[y]>max)
{
max=ma[y];
may=y;
}
}
m_game.m_jsh[may].sd=10;
m_game.KillJsLine(may,200);
m_jwbs[may]+=200;
m_game.m_jsh[may].shm+=200;
}
else if(nIDEvent==1008)
{
m_game.AI();
OnPaint();
m_game.Draw();
}
else
{
KillTimer(nIDEvent);
QxDaZhao(m_game.m_zhw[nIDEvent-10000],this);
}
}
CDialog::OnTimer(nIDEvent);
}
void CMyDlg::OnButton1()
{
CString str;
cbu_zt.GetWindowText(str);
if(str=="暂停")
{
cbu_zt.SetWindowText("继续");
t_la=clock();
KillTimer(1004);
}
else
{
cbu_zt.SetWindowText("暂停");
int t=int(double(t_ne-t_la)/CLOCKS_PER_SEC*1000)+100;
if(t<0)t=10;
SetTimer(1004,t,NULL);
t_ne=clock()+(t_ne-t_la);
}
}
int CMyDlg::MakeGq(int gq)//制作关卡
{
int lx=(gq-1)/GQS;
if(lx==5)
{
for(int s=10;s<=12;s++)
m_p[s]+=1;
for(int s=0;s<=21;s++)
{
if(s!=3&&s!=5&&s!=8&&s!=13)
m_hf[s]*=0.8;
}
m_hf[3]*=0.704+0.02;
m_hf[5]*=0.704+0.02;
m_hf[8]*=0.704+0.02;
m_hf[13]*=0.704+0.02;
m_zw[0].time+=300;
m_zw[12].time+=150;
for(int s=1;s<=21;s++)m_zw[s].yg+=5;
for(int s=3;s<=13;s++)
m_js[s].shm+=3;
}
for(int n=1;n<MAXJSH;n++)
m_p[n]+=m_p[n-1];
int gq2=gq;
gq=(gq-1)%GQS+1;
m_b11=false;
double mr=(lx==0?1.0:3.0);
double jad=(MAXJSH-mr)/(MANG-1.0);
JSH=int(mr)+int(jad*(gq-1)+0.5);
SHU=m_zws[gq2-1];
if(JSH>MAXJSH)
JSH=MAXJSH;
if(SHU>MAXSHU)
SHU=MAXSHU;
ND=5+int(DBS*(gq-1+(lx==5?1:0))*4+0.5)+4;
m_jg[1]=m_jg[2]=m_jg[3]=1;m_time[1]=m_time[2]=m_time[3]=1e9;
if(gq<=8)
m_time[0]=20000,m_jg[0]=41000;
else
{
m_time[0]=16000,m_jg[0]=17000;
if(gq>=9)m_time[1]=100,m_jg[1]=180;
if(gq>=10)m_time[2]=100,m_jg[2]=180;
m_time[3] = 8000; m_jg[3] = 21000;
}
if(gq<=8)m_time[4] = 10000;
else if(gq==9)m_time[4] = 9000;
else m_time[4] = 7040;
m_jg[4] = 22000;
double dad=1010.0/(GQS-1.0);
int dbs=1704-int(dad*(gq-1)+0.5)-(lx==5?140:0);
int dbt=5000+(gq-1)*480+(lx==5?704:0);
for(int n=5;n<ND;n+=4)
{
int i = 0, j = 0;
for(i=n,j=0;i<ND-1&&j<3;i++,j++)
m_time[i]=dbs+j*500,m_jg[i]=dbt;
m_time[i]=4000,m_jg[i]=20000;
dbt+=2100;
}
for(int n=0;n<ND;n++)
{
if(m_jg[n]%m_time[n]==0)
m_jg[n]+=500;
}
int ms=-1;
for(int n=0;n<ND-1;n++)
ms+=int(m_jg[n]/m_time[n]);
m_time[ND-1]=3000,m_jg[ND-1]=1000000000;
if(gq2==MAXGQS+1)
{
SHU=0;
JSH=MAXJSH;
XUAN=8;
m_b11=true;
cpr_jd.SetRange(0,5000);
SetTimer(1005,2500,NULL);
SetTimer(1007,100000,NULL);
return 0;
}
cpr_jd.SetRange(0,ms);
XUAN=9;
int tim=0;
for(int i=0;i<ND-1;i++)
tim+=m_jg[i];
CString str;
str.Format("游戏时间约为%.2lf分钟,约生成僵尸%d个。",tim/60000.0,ms);
MessageBox(str,_T("提示"),MB_OK);
if(SHU<=XUAN)
{
for(int n=0;n<XUAN;n++)
m_xuan[n]=-1;
for(int n=0;n<SHU;n++)
m_xuan[n]=n;
}
else if(m_ai)
{
int xu[10]={0,10,7,8,9,11,3,5,12};
for(int i=0;i<9;i++)
m_xuan[i]=xu[i];
}
else
{
CXuan xuan;
CString bt[6]={"普通","迷雾","黑夜","黑夜+迷雾","水池","极限"};
xuan.m_ms=bt[lx];
for(int n=0;n<MAXSHU;n++)
{
xuan.m_icon[n]=m_zw[n].id;
xuan.m_ygs[n]=m_zw[n].yg;
}
for(int n=0;n<MAXJSH;n++)
xuan.m_js[n]=m_js[n].id;
for(int n=0;n<MAXSHU;n++)
{
if(n<SHU)
xuan.m_show[n]=true;
else
xuan.m_show[n]=false;
}
for(int n=0;n<MAXJSH;n++)
{
if(n<JSH)
xuan.m_jshow[n]=true;
else
xuan.m_jshow[n]=false;
}
if(xuan.DoModal()!=IDOK)
{
OnClose();
return 0;
}
m_hbzw=false;
for(int n=0;n<XUAN;n++)
{
m_xuan[n]=xuan.m_xuan[n];
if(m_zw[m_xuan[n]].hb)
m_hbzw=true;
}
}
if(lx==2||lx==3)
m_zw[0].time=10000,m_zw[12].time=5300;
//if(m_gq==60)m_gq=59;
m_gq=60;
return lx;
}
void CMyDlg::OnButton2()
{
UpdateData();
if(m_gq<1||m_gq>MAXGQS+1)
return;
GameOver();
if(m_game.m_ks)
m_game.KillAll();
GetDlgItem(IDC_BUTTON3)->EnableWindow(1);
StartGame(MakeGq(m_gq));
if(m_b11)
{
SJsh j;
j.Create(0,1000,2000,885,0,IDI_ICON54,11);
for(int n=0;n<5;n++)
{
j.y=n;
m_game.NewJs(j);
}
}
}
void CMyDlg::GameOver()
{
KillTimer(1000);
KillTimer(1001);
KillTimer(1002);
KillTimer(1003);
KillTimer(1004);
KillTimer(1005);
KillTimer(1006);
KillTimer(1007);
m_zw[0].time=6500;
SHU=JSH=ND=0;
}
void CMyDlg::StartGame(int lx)
{
m_nzw=-1;
m_game.m_wnd=this;
m_n=0;
m_nd=m_b11?JSH-1:0;
srand(time(NULL));
SetTimer(1000,lx==5?34:40,NULL);
SetTimer(1001,20,NULL);
SetTimer(1002,m_b11?10000:m_time[0],NULL);
if(lx==0||lx==1||lx==4||lx==5)
SetTimer(1003,6000,NULL);
SetTimer(1004,m_b11?80000:m_jg[0],NULL);
if(m_ai)SetTimer(1008,400,NULL);
t_ne=clock()+int((m_jg[0]/1000.0)*CLOCKS_PER_SEC);
for(int n=0;n<MAXSHU;n++)
m_en[n]=800.0;
m_game.CreateGame(lx);
if(m_b11)
{
for(int n=0;n<5;n++)
{
m_game.m_car[n]=false;
m_jwbs[n]=1000;
}
GetDlgItem(IDC_BUTTON3)->EnableWindow(0);
m_game.m_yg=9999;
m_game.Draw();
}
for(int n=0;n<5;n++)
m_lstB[n]=-99999999;
for(int n=0;n<5;n++)
m_lstC[n]=-99999999;
for(int n=0;n<5;n++)
m_lstD[n]=-99999999;
for(int n=0;n<5;n++)
m_lstJ[n]=-99999999;
for(int n=0;n<5;n++)
m_lstT[n]=-99999999;
jd=tm=0;
m_dzs=5;
if(lx==5)m_dzs=3;
//m_dzs=1;
OnPaint();
}
void CMyDlg::OnClose()
{
GameOver();
CDialog::OnCancel();
}
void CMyDlg::OnButton3()
{
if(MessageBox(" 花费400阳光购买一颗能量豆","提示",MB_OKCANCEL)==IDOK)
{
if(m_dzs==5)
{
MessageBox("能量豆数量已达到上限!","提示",MB_OK|MB_ICONWARNING);
return;
}
if(m_game.m_yg<400)
{
MessageBox("阳光不足。","提示",MB_OK|MB_ICONWARNING);
return;
}
m_game.m_yg-=400;
m_dzs+=1;
OnPaint();
}
}
void CMyDlg::OnButton4()
{
UpdateData(1);
if(m_gq<MAXGQS+1)
{
m_gq+=1;
UpdateData(0);
OnButton2();
}
}
void CMyDlg::OnBnClickedCheck1()
{
// TODO: 在此添加控件通知处理程序代码
}
// stdafx.cpp : source file that includes just the standard includes
// 大战僵尸.pch will be the pre-compiled header
// stdafx.obj will contain the pre-compiled type information
#include "stdafx.h"
#include "resource.h"
int XUAN;
int GetZwIcon(SZhw &zw)
{
int rtn;
switch(zw.lx)
{
case 0:
return IDI_ICON1;
case 1:
return IDI_ICON2;
case 2:
if(zw.shm>600)
return IDI_ICON76;
else if(zw.shm>300)
return IDI_ICON4;
else if(zw.shm>100)
return IDI_ICON13;
else
return IDI_ICON14;
case 3:
return IDI_ICON7;
case 4:
return IDI_ICON8;
case 5:
return IDI_ICON9;
case 6:
if(zw.shm>1600)
return IDI_ICON77;
else if(zw.shm>800)
return IDI_ICON11;
else if(zw.shm>300)
return IDI_ICON15;
else
return IDI_ICON16;
case 7:
return IDI_ICON12;
case 8:
return IDI_ICON43;
case 9:
return IDI_ICON48;
case 10:
return IDI_ICON55;
case 11:
return IDI_ICON56;
case 12:
return zw.fu<10?IDI_ICON57:IDI_ICON64;
case 13:
return IDI_ICON58;
case 15:
return IDI_ICON63;
case 16:
return zw.fu==0?IDI_ICON68:IDI_ICON69;
case 17:
if(zw.fu>20)
return IDI_ICON70;
else if(zw.fu>0)
return IDI_ICON90;
else
return IDI_ICON71;
case 18:
return IDI_ICON72;
case 19:
rtn=IDI_ICON82-(zw.shm-1)/100+7;
if(rtn<IDI_ICON82)
rtn=IDI_ICON82;
return rtn;
case 20:
return IDI_ICON94;
case 21:
return IDI_ICON95;
default:
return 0;
}
}
int GetJsIcon(SJsh &js,CGame &ga)
{
/*if(js.lx!=2||js.shm<=10)
PlaySound("e:\zid.wav",NULL,SND_FILENAME|SND_ASYNC);
else
PlaySound("e:\tt.wav",NULL,SND_FILENAME|SND_ASYNC);*/
switch(js.lx)
{
case -1:
if(js.shm>3)
return IDI_ICON40;
else if(js.shm>1)
return IDI_ICON41;
else
return IDI_ICON42;
case 0:
if(js.shm>3)
return IDI_ICON3;
else if(js.shm>1)
return IDI_ICON17;
else
return IDI_ICON18;
case 1:
if(js.shm>9)
return IDI_ICON5;
else if(js.shm>6)
return IDI_ICON19;
else if(js.shm>3)
return IDI_ICON3;
else if(js.shm>1)
return IDI_ICON17;
else
return IDI_ICON18;
case 2:
if(js.shm>23)
return IDI_ICON6;
else if(js.shm>16)
return IDI_ICON20;
else if(js.shm>10)
return IDI_ICON21;
else if(js.shm>3)
return IDI_ICON3;
else if(js.shm>1)
return IDI_ICON17;
else
return IDI_ICON18;
case 3:
if(js.shm>7)
return IDI_ICON10;
else if(js.shm>4)
return IDI_ICON22;
else
return IDI_ICON23;
case 4:
if(js.shm>11)
return IDI_ICON24;
else if(js.shm>8)
return IDI_ICON25;
else
{
js.sd=js.eat=3;
if(js.shm>4)
return IDI_ICON26;
else
return IDI_ICON27;
}
case 5:
if(js.shm>5)
return js.beat?IDI_ICON29:IDI_ICON30;
else
return js.beat?IDI_ICON35:IDI_ICON31;
case 6:
if(js.shm>12)
return IDI_ICON32;
else if(js.shm>4)
return IDI_ICON33;
else
return IDI_ICON34;
case 7:
if(js.shm>55)
return IDI_ICON36;
else if(js.shm>40)
return IDI_ICON37;
else if(js.shm>25)
return IDI_ICON38;
else if(js.shm>10)
return IDI_ICON39;
else if(js.shm>3)
return IDI_ICON3;
else if(js.shm>1)
return IDI_ICON17;
else
return IDI_ICON18;
case 8:
if(js.shm>9)
return js.beat?IDI_ICON44:IDI_ICON45;
else
return js.beat?IDI_ICON46:IDI_ICON47;
case 9:
if(js.shm<=90)
{
if(!js.fu)
{
SJsh j;
int x=js.x-300;
if(x<220)
x=220;
j.Create(2,3,1,x,js.y,IDI_ICON50,10);
ga.NewJs(j);
js.fu=true;
}
return js.shm<40?IDI_ICON52:IDI_ICON51;
}
else
return IDI_ICON49;
case 10:
if(js.shm>3)
return IDI_ICON50;
else
return IDI_ICON53;
case 11:
return IDI_ICON54;
case 12:
if(js.shm>70)
return IDI_ICON65;
else if(js.shm>50)
return IDI_ICON66;
else if(js.shm>30)
return IDI_ICON67;
else if(js.shm>10)
{
js.sd=1;
js.eat=2;
return IDI_ICON50;
}
else
{
js.sd=1;
js.eat=2;
return IDI_ICON53;
}
case 13:
if(js.shm>8)
return IDI_ICON73;
else
return IDI_ICON74;
case 14:
if(js.shm>10)
return IDI_ICON79;
else
return IDI_ICON80;
case 15:
if(js.shm>5)
return IDI_ICON93;
else
return IDI_ICON92;
case 16:
if(js.shm>12)
return IDI_ICON96;
else
return IDI_ICON97;
case 100:
return IDI_ICON75;
case 101:
return IDI_ICON81;
default:
return 0;
}
}
int GetJsEat(SZhw&zw,SJsh&js,CGame &ga)//获得僵尸的跳跃,返回图标
{
switch(js.lx)
{
case 5:
if(zw.lx!=6)//并非高坚果
js.x-=110;
js.sd=1;
js.beat=false;
return IDI_ICON30;
case 8:
if(zw.lx!=6)//并非高坚果
{
js.x-=82;
return IDI_ICON44;
}
js.sd=1;
js.beat=false;
return IDI_ICON45;
case 100://豌豆
if(zw.shm<=100)
zw.shm-=20;
else
zw.shm-=37;
if(zw.shm<=0)
ga.DestroyZw(zw.shu);
ga.DestroyJs(js.shu);
return 0;
case 101://冰瓜
if(zw.shm<=100)
zw.shm-=30;
else
zw.shm-=100;
if(zw.shm<=0)
ga.DestroyZw(zw.shu);
ga.DestroyJs(js.shu);
zw.hbs=0;
return 0;
default:
return 0;
}
zw.id=GetZwIcon(zw);
}
void Fash(SJsh &js,CGame &ga)
{
switch(js.lx)
{
case 13://豌豆僵尸
SJsh js2;
js2.Create(10,10000,0,js.x,js.y,IDI_ICON75,100,true);
ga.NewJs(js2);
break;
case 14://冰瓜僵尸
SJsh js3;
js3.Create(10,10000,0,js.x,js.y,IDI_ICON81,101,true);
ga.NewJs(js3);
break;
case 16://末影人
js.x=rand()%880;
ga.hjs[js.y]-=1;
js.y=rand()%5;
ga.hjs[js.y]+=1;
break;
}
}
bool DaZhao(SZhw &zw,CWnd *wnd)
{
switch(zw.lx)
{
case 1:
case 0:
case 4:
case 9:
case 8:
case 10:
case 13:
zw.time=100;
wnd->KillTimer(zw.shu);
wnd->SetTimer(zw.shu,100,NULL);
break;
case 2:
case 6:
case 19:
zw.shm+=zw.shm/2;
break;
default:
return false;
}
zw.id=GetZwIcon(zw);
wnd->SetTimer(10000+zw.shu,zw.dztm,NULL);
return true;
}
void QxDaZhao(SZhw &zw,CWnd *wnd)
{
switch(zw.lx)
{
case 0:
case 4:
case 9:
case 8:
zw.time=2400;
break;
case 10:
zw.time=2600;
break;
case 13:
zw.time=5000;
break;
case 1:
zw.time=6500;
break;
}
wnd->KillTimer(zw.shu);
wnd->SetTimer(zw.shu,zw.time,NULL);
}