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

📄 wendlg.cpp

📁 原创的一个贪食蛇程序的源码,使用CDC绘图,数据处理使用链表方法,是学习链表操作的好例程.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// wenDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "wen.h"
#include "wenDlg.h"
 
BOOL playresource(int lpname)
{
    BOOL brtn;
    LPSTR lpres;
    HANDLE hres;
    HRSRC hresinfo;
    HINSTANCE nl=AfxGetInstanceHandle();

    /* find the wave resource. */
    hresinfo= FindResource(nl,MAKEINTRESOURCE(lpname),"wave");
    if(hresinfo == NULL)
       return false;
    /* load the wave resource. */

    hres = LoadResource(nl,hresinfo);
    if (hres == NULL)
      return false;

    /* lock the wave resource and play it. */
    lpres=(LPSTR)LockResource(hres);
    if(lpres==NULL)
      return false;

    brtn = sndPlaySound(lpres, SND_MEMORY | SND_ASYNC);
    if(brtn == NULL)
      return false;

    /* free the wave resource and return success or failure. */
    FreeResource(hres);
    return true;
}


#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 获取应用程序路径

CString CwenDlg::GetExePath()
{
	CString path,str;
	path=AfxGetApp()->m_pszHelpFilePath;
	str=AfxGetApp()->m_pszExeName;
	path=path.Left(path.GetLength()-str.GetLength()-4);
	return path;
}

void CwenDlg::sk_rand()		//随便机产生色块
{
	bool key=1;
	int x,y;
	CBrush m_Brush,*m_pBrush;

	while(key)
	{
		k_x=rand()%40;
		k_y=rand()%30;
		m_new=m_head;
		do				// 追尾检测		
		{
			if((k_x==m_new->x)&(k_y==m_new->y))
				key=1;
			else
				key=0;
			m_new=m_new->next;
		}
		while((m_new!=m_head)&(!key));
	}
	x=k_x*20+9;
	y=k_y*20+9;

	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(0,255,0));
	my_dc->TextOutA(1,1,"¤");
	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::dk_rand()		//随便机产生炸弹
{
	bool key=1;
	int x,y;
	CBrush m_Brush,*m_pBrush;

	while(key)
	{
		x=rand()%40;
		y=rand()%30;
		m_new=m_head;
		do				// 追尾检测		
		{
			if((x==m_new->x)&(y==m_new->y))
				key=1;
			else
				key=0;
			m_new=m_new->next;
		}
		while((m_new!=m_head)&(!key));

		if(key==1)
		continue;

		if(d_head!=NULL)
		{
			d_new=d_head;
			do				// 追尾检测		
			{
				if((x==d_new->x)&(y==d_new->y))
					key=1;
				else
					key=0;
				if(d_new->next!=NULL)
				d_new=d_new->next;
			}
			while((d_new->next!=NULL)&(!key));
		}

		if(key==1)
		continue;

		if((k_x==x)&(k_y==y))
			key=1;
		else
			key=0;
	}
	
	if(d_head==NULL)
	{
	d_new=(struct dkuai *)malloc(sizeof(struct dkuai));
	d_head=d_new;
	d_new->prv=NULL;
	d_new->next=NULL;
	}
	else
	{
	d_this=d_head;
	while(d_this->next!=NULL)
	d_this=d_this->next;
	d_new=(struct dkuai *)malloc(sizeof(struct dkuai));
	d_this->next=d_new;
	d_new->prv=d_this;
	d_new->next=NULL;
	}

	d_new->x=x;
	d_new->y=y;
	
	x=x*20+9;
	y=y*20+9;

	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,"⊙");
	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::m_cls()		//刷新显示表格(清屏)
{
	SetBg();
	tss.dell=0;
	tss.fx[0]=4;
	tss.sulan=2;
	tss.ToNext=0;
	tss.k_b=1;
	tss.key=0;
	d_head=NULL;

	m_new=m_head;
	m_new->x=15;
	m_new->y=15;
	m_new=m_new->next;
	m_new->x=14;
	m_new->y=15;
	m_new=m_new->next;
	m_new->x=13;
	m_new->y=15;
	m_this=m_new;
	m_this->next=m_head;
	m_head->prv=m_this;
	m_new=m_new->next;

	while(m_new!=m_head)
	{
	m_this=m_new->next;
	free(m_new);
	m_new=m_new;	
	}

	m_this=m_head->prv;

	sk_rand();
	dk_rand();
	
	CString tmp;
	tss.sulan=3;
	tmp.Format("%d",tss.sudu);
	m_9.SetWindowTextA(tmp);
	tmp.Format("%d",tss.sulan);
	m_11.SetWindowTextA(tmp);
}

void CwenDlg::SetBg()		//显示背景表格
{
	CBrush m_Brush,*m_pBrush;
	m_Brush.CreateSolidBrush(tss.bg_color);
	m_pBrush=op_dc->SelectObject(&m_Brush);
	op_dc->Rectangle(0,0,tss.window_k,tss.window_g);
	op_dc->SelectObject(m_pBrush);
	m_Brush.DeleteObject();

//	DisBg();
}

void CwenDlg::DisBg()		//显示背景表格
{
	int j,k;

	for(j=0;j<801;j+=20)
	{
		for(k=0;k<601;k+=4)
		{
		op_dc->SetPixel(j+8,k+8,tss.color);
		}	
	}

	for(j=0;j<601;j+=20)
	{
		for(k=0;k<801;k+=4)
		{
		op_dc->SetPixel(k+8,j+8,tss.color);
		}	
	}
	gdc->BitBlt(0,0,tss.window_k-90,tss.window_g,op_dc,0,0,SRCCOPY);
}

void CwenDlg::DellBg()		//显示背景表格
{
	int j,k;

	for(j=0;j<801;j+=20)
	{
		for(k=0;k<601;k+=4)
		{
		op_dc->SetPixel(j+8,k+8,tss.bg_color);
		}	
	}

	for(j=0;j<601;j+=20)
	{
		for(k=0;k<801;k+=4)
		{
		op_dc->SetPixel(k+8,j+8,tss.bg_color);
		}	
	}
//---------------------------------------------
	for(j=0;j<801;j+=800)
	{
		for(k=0;k<601;k+=4)
		{
		op_dc->SetPixel(j+8,k+8,tss.color);
		}	
	}

	for(j=0;j<601;j+=600)
	{
		for(k=0;k<801;k+=4)
		{
		op_dc->SetPixel(k+8,j+8,tss.color);
		}	
	}

	gdc->BitBlt(0,0,tss.window_k-90,tss.window_g,op_dc,0,0,SRCCOPY);
}


void CwenDlg::SetSkXy(int x,int y)

{
	CBrush m_Brush,*m_pBrush;

	x=x*20+9;
	y=y*20+9;

	m_Brush.CreateSolidBrush(tss.bg_color);
	m_pBrush=my_dc->SelectObject(&m_Brush);
	my_dc->Rectangle(0,0,19,19);
	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::SetSk(kuai_type *tmp)

{
	int x,y;
	CBrush m_Brush,*m_pBrush;

	x=tmp->x*20+9;
	y=tmp->y*20+9;

	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(0,255,0));
	my_dc->TextOutA(1,1,"¤");
	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::DellSk(kuai_type *tmp)

{
	int x,y;
	CBrush m_Brush,*m_pBrush;

	x=tmp->x*20+9;
	y=tmp->y*20+9;

	m_Brush.CreateSolidBrush(tss.bg_color);
	m_pBrush=my_dc->SelectObject(&m_Brush);
	my_dc->Rectangle(0,0,19,19);
	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
}
class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()


// CwenDlg 对话框

CwenDlg::CwenDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CwenDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CwenDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_STA, m_sta);
	DDX_Control(pDX, IDC_1, m_1);
	DDX_Control(pDX, IDC_2, m_2);
	DDX_Control(pDX, IDC_3, m_3);
	DDX_Control(pDX, IDC_4, m_4);
	DDX_Control(pDX, IDC_5, m_5);
	DDX_Control(pDX, IDC_6, m_6);
	DDX_Control(pDX, IDC_7, m_7);
	DDX_Control(pDX, IDC_02, m_8);
	DDX_Control(pDX, IDC_01, m_9);
	DDX_Control(pDX, IDC_03, m_10);
	DDX_Control(pDX, IDC_04, m_11);
	DDX_Control(pDX, IDC_13, m_13);
	DDX_Control(pDX, IDC_12, m_12);
	DDX_Control(pDX, IDC_14, m_14);
	DDX_Control(pDX, IDC_15, m_15);
	DDX_Control(pDX, IDC_BUTTON1, m_16);
}

BEGIN_MESSAGE_MAP(CwenDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_MOUSEMOVE()
	ON_WM_DESTROY()
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_STA, &CwenDlg::OnBnClickedSta)
	ON_BN_CLICKED(IDC_1, &CwenDlg::OnBnClicked1)
	ON_BN_CLICKED(IDC_2, &CwenDlg::OnBnClicked2)
	ON_BN_CLICKED(IDC_3, &CwenDlg::OnBnClicked3)
	ON_BN_CLICKED(IDC_4, &CwenDlg::OnBnClickedButton4)
	ON_BN_CLICKED(IDC_5, &CwenDlg::OnBnClickedButton5)
	ON_BN_CLICKED(IDC_6, &CwenDlg::OnBnClickedButton6)
	ON_BN_CLICKED(IDC_7, &CwenDlg::OnBnClicked7)
	ON_BN_CLICKED(IDC_13, &CwenDlg::OnBnClicked13)
	ON_BN_CLICKED(IDC_12, &CwenDlg::OnBnClicked12)
	ON_BN_CLICKED(IDC_14, &CwenDlg::OnBnClicked14)
	ON_BN_CLICKED(IDC_15, &CwenDlg::OnBnClicked15)
	ON_BN_CLICKED(IDC_16, &CwenDlg::OnBnClicked16)
END_MESSAGE_MAP()


// CwenDlg 消息处理程序

BOOL CwenDlg::OnInitDialog()
{	
	CDialog::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}
	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

//设置初始值----------------------------------------------

	tss.window_k=900;
	tss.window_g=648;
	tss.sulan=3;
	tss.sudu=250;
	tss.kuandu=40;
	tss.fx[0]=4;
	tss.key=0;
	tss.gaodu=30;
	tss.color=RGB(228,226,213);
	tss.kuai_color=RGB(0,255,255);
	tss.bg_color=RGB(0,0,0);
	tss.k_b=0;

	srand((unsigned)time(NULL));

	d_head=NULL;

	m_new=(struct kuai_type *)malloc(sizeof(struct kuai_type));
	m_head=m_new;
	m_new->x=15;
	m_new->y=15;
	m_this=m_new;
	m_new=(struct kuai_type *)malloc(sizeof(struct kuai_type));
	m_this->next=m_new;
	m_new->prv=m_this;
	m_new->x=14;
	m_new->y=15;
	m_this=m_new;
	m_new=(struct kuai_type *)malloc(sizeof(struct kuai_type));
	m_this->next=m_new;
	m_new->prv=m_this;
	m_new->x=13;
	m_new->y=15;
	m_this=m_new;
	m_this->next=m_head;
	m_head->prv=m_this;

//--------------------------------------------------------
	this->MoveWindow(20,20,tss.window_k,tss.window_g);	//设置窗体宽高待
	//ShowWindow(SW_SHOWMAXIMIZED);
	// 获取全局绘图句柄
	gdc=GetDC();//获得临时DC

	CRect rect;
	this->GetWindowRect(&rect);
	my_dc=new CDC;
	my_dc->CreateCompatibleDC(gdc);		// 建立与dc兼容的DC
	my_bitmap=new CBitmap;				// 申明CBitmap位图对象
	my_bitmap->CreateCompatibleBitmap(gdc,rect.right-rect.left,rect.bottom-rect.top);		//
	my_dc->SelectObject(my_bitmap);

	op_dc=new CDC;
	op_dc->CreateCompatibleDC(gdc);		// 建立与dc兼容的DC
	op_bitmap=new CBitmap;				// 申明CBitmap位图对象
	op_bitmap->CreateCompatibleBitmap(gdc,rect.right-rect.left,rect.bottom-rect.top);		//
	op_dc->SelectObject(op_bitmap);

	bg_dc=new CDC;						// 申明内存DC
	bg_dc->CreateCompatibleDC(gdc);		// 建立与dc兼容的DC
	bg_bitmap=new CBitmap;				// 申明CBitmap位图对象
	bg_bitmap->CreateCompatibleBitmap(gdc,rect.right-rect.left,rect.bottom-rect.top);		//
	bg_dc->SelectObject(bg_bitmap);
	bg_bitmap->m_hObject=(HBITMAP)::LoadImage(NULL,"image/bg.bmp",IMAGE_BITMAP,rect.right-rect.left,rect.bottom-rect.top,LR_LOADFROMFILE);// 加载位图

	m_sta.MoveWindow(tss.window_k-79,20,60,20);		//移动按钮到指定位置
	m_5.MoveWindow(tss.window_k-79,50,60,20);		//移动按钮到指定位置
	m_1.MoveWindow(tss.window_k-79,80,60,20);		//移动按钮到指定位置
	m_2.MoveWindow(tss.window_k-79,110,60,20);		//移动按钮到指定位置
	m_3.MoveWindow(tss.window_k-79,140,60,20);		//移动按钮到指定位置
	m_4.MoveWindow(tss.window_k-79,170,60,20);		//移动按钮到指定位置
	m_6.MoveWindow(tss.window_k-79,200,60,20);		//移动按钮到指定位置
	m_7.MoveWindow(tss.window_k-79,230,60,20);		//移动按钮到指定位置

	m_12.MoveWindow(tss.window_k-79,260,60,20);		//移动按钮到指定位置
	m_13.MoveWindow(tss.window_k-79,290,60,20);		//移动按钮到指定位置
	m_14.MoveWindow(tss.window_k-79,320,60,20);		//移动按钮到指定位置
	m_15.MoveWindow(tss.window_k-79,350,60,20);		//移动按钮到指定位置
	m_16.MoveWindow(tss.window_k-79,380,60,20);		//移动按钮到指定位置

	m_8.MoveWindow(tss.window_k-79,410,60,20);		//移动按钮到指定位置
	m_9.MoveWindow(tss.window_k-79,428,60,15);		//移动按钮到指定位置
	m_10.MoveWindow(tss.window_k-79,458,60,20);		//移动按钮到指定位置
	m_11.MoveWindow(tss.window_k-79,476,60,15);		//移动按钮到指定位置

	SetBg();
	
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CwenDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CwenDlg::OnPaint()
{
/*
*/	CRect rect;

⌨️ 快捷键说明

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