• 备份


    // 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);
    }
    
  • 相关阅读:
    随感
    LIKE运算符
    数据库运行时的关键字先后顺序
    联表查询
    进程、线程、协程
    算法复杂度
    redis支持的数据类型
    面向对象编程和面向过程编程的区别总结
    判断对象的变量是否存在,isset和property_exists区别
    构造函数和析构函数
  • 原文地址:https://www.cnblogs.com/lnzwz/p/14494953.html
Copyright © 2020-2023  润新知