⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wendlg.cpp

📁 原创的一个贪食蛇程序的源码,使用CDC绘图,数据处理使用链表方法,是学习链表操作的好例程.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	this->GetWindowRect(&rect);
	CPaintDC dc(this); // 用于绘制的设备上下文
	dc.BitBlt(0,0,rect.right-rect.left,rect.bottom-rect.top,op_dc,0,0,SRCCOPY); 
}

//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR CwenDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}

void CwenDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
	if(tss.k_b)
		return;
	
/*	CBrush m_Brush,*m_pBrush;
	int x,y;

	x=point.x-(point.x+11)%20;
	y=point.y-(point.y+11)%20;

	if((x>809)|(y>609)|(x<10)|(y<10))				//超出表格退出
		return;

	tss.k_b=1;

	k_x=(point.x+11)/20-1;
	k_y=(point.y+11)/20-1;

	m_Brush.CreateSolidBrush(RGB(0,255,255));
	m_pBrush=bg_dc->SelectObject(&m_Brush);
	my_dc->Rectangle(0,0,19,19);
	my_dc->SetBkColor(RGB(255,0,0));
	my_dc->TextOutA(1,1,"ab");
	my_dc->SelectObject(m_pBrush);
	m_Brush.DeleteObject();
	op_dc->BitBlt(x,y,19,19,my_dc,0,0,SRCCOPY);
	
	gdc->BitBlt(0,0,tss.window_k-90,tss.window_g,op_dc,0,0,SRCCOPY);	//复制到显示缓存 OnPaint
*/
}

void CwenDlg::OnDestroy()
{
	delete op_bitmap;				// 背景图
	delete op_dc;
	delete bg_bitmap;				// 背景图
	delete bg_dc;
	delete my_bitmap;				// 背景图
	delete my_dc;

	m_this=m_head->next;

	while(m_head!=m_this)	
	{
		m_new=m_this;				// 2
		m_this=m_new->next;			// 3
		free(m_new);	
	}
	free(m_head);
	
	if(d_head!=NULL)
	{
		while(d_head->next!=NULL)	
		{
			d_new=d_head;			// 2
			d_head=d_new->next;		// 3
			free(d_new);	
		}
		free(d_head);
	}
}

void CwenDlg::OnTimer(UINT_PTR nIDEvent)
{
 switch(nIDEvent) 

    {
	case 1:
		{	
			CString tmp;
			bool j=0,k=0;		
			int x,y;
			
			if(tss.dell)						//删除一个色块标志()
			{
				tss.dell=0;
				return;
			}
			if(tss.k_b)
			{
				switch(tss.fx[0])				// 检测当前点位置
				{
					case 1:{y=m_head->y-1;	x=m_head->x;}	break;
					case 2:{y=m_head->y+1;	x=m_head->x;}	break;
					case 3:{x=m_head->x-1;	y=m_head->y;}	break;
					case 4:{x=m_head->x+1;	y=m_head->y;}	break;
				}

				if((k_x==x)&(k_y==y))			// 检测是否遇到红点
				{
					m_new=(struct kuai_type *)malloc(sizeof(struct kuai_type));
					m_new->next=m_head;
					m_new->prv=m_this;
					m_this->next=m_new;
					m_head->prv=m_new;
					m_head=m_new;

					m_head->x=x;
					m_head->y=y;
					
					SetSk(m_head);

					tss.sulan++;
					tmp.Format("%d",tss.sulan);
					m_11.SetWindowTextA(tmp);

					if(tss.sulan>49)
						{
						playresource(IDR_WAVE4);			// 播放声音

						KillTimer(1);
						tmp="下一关";
						tss.sudu-=30;
						m_5.SetWindowTextA(tmp);
						tss.ToNext=1;
						if(d_head!=NULL)
							{
							while(d_head->next!=NULL)		// 清除空间
								{
									d_new=d_head;			// 2
									d_head=d_new->next;		// 3
									free(d_new);	
								}
								free(d_head);
								d_head=NULL;
							}
						return;
						}
					sk_rand();   
					dk_rand();
					dk_rand();
					//dk_rand();					

					if(tss.key==2)
						tss.fx[0]=tss.fx[1];
					if(tss.key>0)
						tss.key--;

					playresource(IDR_WAVE5);			// 播放声音

					return;
				}
				if(d_head!=NULL)
				{
					d_new=d_head;
					if((d_new->x==x)&(d_new->y==y))
					k=1;
					while((d_new->next!=NULL)&!k)			// 检测是否遇到炸弹
					{
						if(d_new->next!=NULL)
						d_new=d_new->next;
						if((d_new->x==x)&(d_new->y==y))
							k=1;
						else
							k=0;
					}

					if(k)				// 遇到炸弹后处理

					{//-----------------------------------------
						tss.sulan--;
						tss.zd_su--;
						tmp.Format("%d",tss.sulan);
						m_11.SetWindowTextA(tmp);
						if(tss.sulan<3)
							{
								playresource(IDR_WAVE1);			// 播放声音

								KillTimer(1);
								tss.sudu=250;
								tmp="OVER";
								m_sta.SetWindowTextA(tmp);							
								tmp.Format("%d",tss.sudu);
								m_9.SetWindowTextA(tmp);
								if(d_head!=NULL)
									{
									while(d_head->next!=NULL)		// 清除炸弹空间
										{
											d_new=d_head;			// 2
											d_head=d_new->next;		// 3
											free(d_new);	
										}
										free(d_head);
										d_head=NULL;
									}
								return;
							}
						if((d_new->prv==NULL)&(d_new->next==NULL))
							d_head=NULL;
						else if(d_new->prv==NULL)
							{
							d_head=d_new->next;
							d_head->prv=NULL;
							}
						else if(d_new->next==NULL)
							d_new->prv->next=NULL;
						else
							{
							d_new->prv->next=d_new->next;	//重链炸弹表
							d_new->next->prv=d_new->prv;
							}
						free(d_new);						//删除炸弹表

						m_new=m_this->prv;
						m_new->next=m_head;		// 链接
						m_head->prv=m_new;		// 链接
						DellSk(m_this);			// 删除显示格
						free(m_this);			// 清除内存空间
						m_this=m_new;			// 将HEAD移动到 
						
						SetSkXy(x,y);

						if(tss.key==2)
							tss.fx[0]=tss.fx[1];
						if(tss.key>0)
						tss.key--;

						playresource(IDR_WAVE3);			// 播放声音
							
						//dk_rand();
						//dk_rand();

						return;
					}//------------------------------------------
				}
			}

			DellSk(m_this);					//删除最后的色块

			m_head=m_this;
			m_this=m_this->prv;
			
			switch(tss.fx[0]) 
			{
				case 1:{m_head->y=m_head->next->y-1;	m_head->x=m_head->next->x;}	break;
				case 2:{m_head->y=m_head->next->y+1;	m_head->x=m_head->next->x;}	break;
				case 3:{m_head->x=m_head->next->x-1;	m_head->y=m_head->next->y;}	break;
				case 4:{m_head->x=m_head->next->x+1;	m_head->y=m_head->next->y;}	break;
			}


			if(tss.key==2)
				tss.fx[0]=tss.fx[1];
			if(tss.key>0)
				tss.key--;

			m_new=m_head->next;
			while(m_new!=m_head)			// 追尾检测
			{
				if((m_head->x==m_new->x)&(m_head->y==m_new->y))
					j=1;
				m_new=m_new->next;
			}
			if((m_head->y>29)|(m_head->y<0)|(m_head->x>39)|(m_head->x<0)|j)
			{
				playresource(IDR_WAVE1);	// 播放声音

				KillTimer(1);				// 边线检测
				tss.sudu=250;
				tmp="OVER";
				m_sta.SetWindowTextA(tmp);
				if(d_head!=NULL)
					{
					while(d_head->next!=NULL)	// 清除空间
						{
						d_new=d_head;			// 2
						d_head=d_new->next;		// 3
						free(d_new);	
						}
					free(d_head);
					d_head=NULL;
					}
				return;
			}
			
			SetSk(m_head);
		}break;
    }
}

void CwenDlg::OnBnClickedSta()
{
	static bool T;
	CString tmp;

	GetDlgItemText(IDC_5,tmp);
	if(tmp=="下一关")
	{	
		playresource(IDR_WAVE6);			// 播放声音
		this->SetTimer(1,tss.sudu,NULL);
		tmp="暂停[F3]";
		m_5.SetWindowTextA(tmp);
	}


	if(!T)
	{
		playresource(IDR_WAVE6);

		this->SetTimer(1,tss.sudu,NULL);
		tmp="停止";
		m_cls();
		m_sta.SetWindowTextA(tmp);
		GetDlgItemText(IDC_16,tmp);
		if(tmp=="显示网格")
			OnBnClicked16();
	}
	else
	{KillTimer(1);
	playresource(IDR_WAVE5);			// 播放声音
	tmp="开始";
	m_sta.SetWindowTextA(tmp);}
	T=!T;
}

BOOL CwenDlg::PreTranslateMessage(LPMSG lpmsg)     
{   
BOOL bHandleNow=FALSE;   
switch(lpmsg->message)   
	{   
		case WM_KEYDOWN:
		if(lpmsg->wParam==VK_F3)
			OnBnClickedButton5();
		else
		if(tss.key<2)			// 判断是否按过
		{			
			switch(lpmsg->wParam)   
			{   
			case VK_UP:
				if(tss.fx[0]!=2)
				tss.fanxan=1;
				break;
			case VK_DOWN:
				if(tss.fx[0]!=1)
				tss.fanxan=2;
				break;
			case VK_LEFT:
				if(tss.fx[0]!=4)
				tss.fanxan=3;
				break;
			case VK_RIGHT:
				if(tss.fx[0]!=3)
				tss.fanxan=4;
				break;   
			case 'w':
				if(tss.fx[0]!=2)
				tss.fanxan=1;
				break;
			case 's':
				if(tss.fx[0]!=1)
				tss.fanxan=2;
				break;
			case 'a':
				if(tss.fx[0]!=4)
				tss.fanxan=3;
				break;
			case 'd':
				if(tss.fx[0]!=3)
				tss.fanxan=4;
				break;
			} 
			bHandleNow=TRUE;
			tss.fx[tss.key]=tss.fanxan;
			tss.key++;
		}
	}     
return bHandleNow;     
}    

void CwenDlg::OnBnClicked1()
{
	playresource(IDR_WAVE5);			// 播放声音
	if(tss.fx[0]==2)
		return;
	tss.fx[0]=1;
}

void CwenDlg::OnBnClicked2()
{
	playresource(IDR_WAVE5);			// 播放声音
	if(tss.fx[0]==1)
		return;
	tss.fx[0]=2;
}

void CwenDlg::OnBnClicked3()
{
	playresource(IDR_WAVE5);			// 播放声音
	if(tss.fx[0]==4)
		return;
	tss.fx[0]=3;
}

void CwenDlg::OnBnClickedButton4()
{
	playresource(IDR_WAVE5);			// 播放声音
	if(tss.fx[0]==3)
		return;
	tss.fx[0]=4;
}

void CwenDlg::OnBnClickedButton5()
{
	static bool T;
	
	if(tss.ToNext)
	{
	CString tmp;
	m_cls();
	tmp.Format("%d",tss.sudu);
	m_9.SetWindowTextA(tmp);
	}
	CString tmp;
	if(!T)
	{KillTimer(1);
	playresource(IDR_WAVE5);			// 播放声音
	tmp="继续[F3]";
	m_5.SetWindowTextA(tmp);}
	else
	{
		playresource(IDR_WAVE6);			// 播放声音
		this->SetTimer(1,tss.sudu,NULL);
		tmp="暂停[F3]";
		m_5.SetWindowTextA(tmp);
	}
	T=!T;
}

void CwenDlg::OnBnClickedButton6()
{
	playresource(IDR_WAVE5);			// 播放声音
	CString tmp;
	if(tss.sulan>200)
		return;
	tss.sulan++;

	m_new=(struct kuai_type *)malloc(sizeof(struct kuai_type));
	m_new->next=m_head;
	m_new->prv=m_this;
	m_this->next=m_new;
	m_head->prv=m_new;
	m_head=m_new;
	
	switch(tss.fx[0]) 
	{
		case 1:{m_head->y=m_head->next->y-1;	m_head->x=m_head->next->x;}	break;
		case 2:{m_head->y=m_head->next->y+1;	m_head->x=m_head->next->x;}	break;
		case 3:{m_head->x=m_head->next->x-1;	m_head->y=m_head->next->y;}	break;
		case 4:{m_head->x=m_head->next->x+1;	m_head->y=m_head->next->y;}	break;
	}
	SetSk(m_head);
	tmp.Format("%d",tss.sulan);
	m_11.SetWindowTextA(tmp);
	tss.dell=1;
}

void CwenDlg::OnBnClicked7()
{
	playresource(IDR_WAVE5);			// 播放声音
	CString tmp;
	if(tss.sulan<3)
		return;
	
	m_new=m_head->next;		// 将第二个赋NEW
	m_new->prv=m_this;		// 链接
	m_this->next=m_new;		// 链接
	DellSk(m_head);			// 删除显示格
	free(m_head);			// 清除内存空间
	m_head=m_new;			// 将HEAD移动到NEW

	tss.sulan--;
	tss.dell=1;
	tmp.Format("%d",tss.sulan);
	m_11.SetWindowTextA(tmp);
}



void CwenDlg::OnBnClicked13()
{
	playresource(IDR_WAVE5);			// 播放声音
	dk_rand();
}

void CwenDlg::OnBnClicked12()
{
	playresource(IDR_WAVE5);			// 播放声音
	if(d_head==NULL)
		return;

	int x,y;

	d_this=d_head;
	
	while(d_this->next!=NULL)
	d_this=d_this->next;
	if(d_this->prv==NULL)
		d_head=NULL;
	else
	d_this->prv->next=NULL;

	x=d_this->x;
	y=d_this->y;

	free(d_this);
	
	SetSkXy(x,y);
}

void CwenDlg::OnBnClicked14()
{
	playresource(IDR_WAVE5);			// 播放声音
	if(tss.sudu<50)
		return;
	tss.sudu-=20;
	
	KillTimer(1);
	this->SetTimer(1,tss.sudu,NULL);
	CString tmp;
	tmp.Format("%d",tss.sudu);
	m_9.SetWindowTextA(tmp);

}

void CwenDlg::OnBnClicked15()
{
	playresource(IDR_WAVE5);			// 播放声音
	if(tss.sudu>300)
		return;
	tss.sudu+=20;
	
	KillTimer(1);
	this->SetTimer(1,tss.sudu,NULL);
	CString tmp;
	tmp.Format("%d",tss.sudu);
	m_9.SetWindowTextA(tmp);
}

void CwenDlg::OnBnClicked16()
{
	playresource(IDR_WAVE5);			// 播放声音
	static bool T;
	CString tmp;
	if(!T)
	{

		tmp="显示网格";
		DellBg();
		m_16.SetWindowTextA(tmp);
	}
	else
	{
	tmp="消隐网格";
	DisBg();
	m_16.SetWindowTextA(tmp);
	}
	T=!T;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -