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

📄 tcsgamedlg.cpp

📁 贪吃蛇游戏的原代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	CPoint ptRand[20*15];
	int i,j,k,len,bSame;
	len=0;
	for(i=0;i<20;i++)
	{
		for(j=0;j<15;j++)
		{
			if(m_nArray[i][j]!=TYPE_NULL)//有障碍物
				continue;
			bSame=FALSE;
			for(k=0;k<m_nSnakeLen;k++)
			{//"蛇"
				if((m_ptSnake[k].x==j)&&(m_ptSnake[k].y==i))
				{
					bSame=TRUE;
					break;
				}
			}
			if(!bSame)
			{
				ptRand[len].x=j;
				ptRand[len].y=i;
				len++;
			}
		}

	}
	i=rand()%len;
	m_nArray[ptRand[i].y][ptRand[i].x]=nFoodType;
	DrawFood(ptRand[i].x,ptRand[i].y,nFoodType);
}
//是否已“死”
BOOL CTcsGameDlg::CheckDie()
{
	int i;
	int indexX,indexY;
	switch(m_nCurDir)
	{
	case 1://down
		indexX=m_ptSnake[0].x;
		indexY=m_ptSnake[0].y+1;
		if(!m_bCanThrough)//禁止穿越边界
		{
			if(indexY>=20)//出了边界
				return TRUE;
		}
		break;
	case 2://up
		indexX=m_ptSnake[0].x;
		indexY=m_ptSnake[0].y-1;
		if(!m_bCanThrough)//禁止穿越边界
		{
			if(indexY<0)//出了边界
				return TRUE;
		}
		break;
	case 3://left
		indexX=m_ptSnake[0].x-1;
		indexY=m_ptSnake[0].y;
		if(!m_bCanThrough)//禁止穿越边界
		{
			if(indexX<0)//出了边界
				return TRUE;
		}
		break;
	case 4://right
		indexX=m_ptSnake[0].x+1;
		indexY=m_ptSnake[0].y;
		if(!m_bCanThrough)//禁止穿越边界
		{
			if(indexX>=15)//出了边界
				return TRUE;
		}
		break;
	}
	////////////////////
	indexY=indexY%20;
	indexX=indexX%15;
	if(indexX==-1)
		indexX=14;
	if(indexY==-1)
		indexY=19;
	//////////////check block///////////////////
	if(m_nArray[indexY][indexX]==TYPE_STONE)
		return TRUE;
	else
	{
		for(i=2;i<m_nSnakeLen-1;i++)
		{
			if((indexY==m_ptSnake[i].y)&&(indexX==m_ptSnake[i].x))
				return TRUE;
		}
	}
	return FALSE;
}
//画“食物”
void CTcsGameDlg::DrawFood(int indexX,int indexY,int nFoodType)
{
	CDC* pDC=GetDC();
	CDC  memDC;
	CBitmap bitmap;
	switch(nFoodType)
	{
	case TYPE_FOOD:
		bitmap.LoadBitmap(IDB_BITMAP4);
		break;
	case TYPE_AWARD:
		bitmap.LoadBitmap(IDB_BMPAWARD);
		break;
	case TYPE_LIFE:
		bitmap.LoadBitmap(IDB_BMPLIFE);
		break;
	}
	memDC.CreateCompatibleDC(pDC);
	memDC.SelectObject(bitmap);
	pDC->BitBlt(indexX*m_nBlockLen+m_nInitX,indexY*m_nBlockLen+m_nInitY,
				m_nBlockLen,m_nBlockLen,&memDC,0,0,SRCCOPY);
	memDC.DeleteDC();
	bitmap.DeleteObject();
	pDC->DeleteDC();
}
//退出
void CTcsGameDlg::OnExit() 
{
	CDialog::EndDialog(0);	
}
//关于
void CTcsGameDlg::OnAbout() 
{
	CAboutDlg dlg;
	dlg.DoModal();
}
//暂停
void CTcsGameDlg::OnPause() 
{
	if(!m_bSnakeDied)
	{
		if(m_bPause)
		{
			m_wndStatusBar.SetText(_T("正在游戏"),0,0);
			SetTimer(1,250,NULL);
		}
		else
		{
			m_wndStatusBar.SetText(_T("暂停游戏"),0,0);
			KillTimer(1);
		}
		m_bPause=!m_bPause;
	}
}
//画“石头”
void CTcsGameDlg::DrawStone(int indexX, int indexY)
{
	CDC* pDC=GetDC();
	CDC  memDC;
	CBitmap bitmap;
	bitmap.LoadBitmap(IDB_BITMAP3);
	memDC.CreateCompatibleDC(pDC);
	memDC.SelectObject(bitmap);
	pDC->BitBlt(indexX*m_nBlockLen+m_nInitX,indexY*m_nBlockLen+m_nInitY,
				m_nBlockLen,m_nBlockLen,&memDC,0,0,SRCCOPY);
	memDC.DeleteDC();
	bitmap.DeleteObject();
	pDC->DeleteDC();
}

void CTcsGameDlg::SetStone(int ix, int iy)
{
	m_nArray[iy][ix]=TYPE_STONE;
}

void CTcsGameDlg::SetLevel_01()
{
	int i;
	for(i=4;i<=10;i++)
		SetStone(i,10);
}

void CTcsGameDlg::SetLevel_02()
{
	SetStone(5,8);
	SetStone(9,8);
	SetStone(4,8);
	SetStone(4,9);
	SetStone(4,10);
	SetStone(4,11);
	SetStone(10,8);
	SetStone(10,9);
	SetStone(10,10);
	SetStone(10,11);
	SetStone(5,11);
	SetStone(9,11);
}

void CTcsGameDlg::SetLevel_03()
{
	int i;
	for(i=0;i<=12;i++)
		SetStone(9,i);
	for(i=7;i<=19;i++)
		SetStone(5,i);
}

void CTcsGameDlg::SetLevel_04()
{
	int i;
	for(i=3;i<=11;i++)
		SetStone(i,10);
	for(i=6;i<=14;i++)
		SetStone(7,i);
}

void CTcsGameDlg::SetLevel_05()
{
	int i;
	for(i=0;i<=4;i++)
		SetStone(i,4);
	for(i=0;i<=4;i++)
		SetStone(i,15);
	for(i=5;i<=7;i++)
		SetStone(4,i);
	for(i=12;i<=14;i++)
		SetStone(4,i);
	////////////////////
	for(i=10;i<=14;i++)
		SetStone(i,4);
	for(i=10;i<=14;i++)
		SetStone(i,15);
	for(i=5;i<=7;i++)
		SetStone(10,i);
	for(i=12;i<=14;i++)
		SetStone(10,i);
}
//关于对话框设色方案
HBRUSH CAboutDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	//暗金色:RGB(0xd1,0xc5,0x98)
	if(nCtlColor==CTLCOLOR_STATIC)
	{
		pDC->SetTextColor(RGB(0xd1,0xc5,0x98));
		pDC->SetBkColor(RGB(0,0,0));
		HBRUSH b=CreateSolidBrush(RGB(0,0,0));
		return b;
	}
	else if(nCtlColor==CTLCOLOR_DLG)
	{
		pDC->SetTextColor(RGB(0xd1,0xc5,0x98));
		//pDC->SetBkColor(RGB(0,0,0));
		//HBRUSH b=CreateSolidBrush(RGB(0,0,0));
		//return b;
	}
	return hbr;
}

void CAboutDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CDialog::OnCancel();	
	CDialog::OnLButtonDown(nFlags, point);
}
//画右对齐的数字
void CTcsGameDlg::DrawARNumber(int nNum, int initX, int initY)
{
	CDC* pDC=GetDC();
	CDC  memDC;
	int pEachNum[6];
	int nW,nH;
	int i;
	nW=13;
	nH=23;
	if(nNum<0)
		nNum=0;

	for(i=0;i<6;i++)
		pEachNum[i]=-1;
	i=5;
	do
	{
		pEachNum[i]=nNum%10;
		nNum=int(nNum/10);
		i--;
	}while(nNum>0);

	memDC.CreateCompatibleDC(pDC);
	for(i=5;i>=0;i--)
	{
		if(pEachNum[i]<0)//13,23
			memDC.SelectObject(pNumBmp[10]);
		else
			memDC.SelectObject(pNumBmp[pEachNum[i]]);

		pDC->BitBlt(initX-(6-i)*nW,initY,nW,nH,&memDC,0,0,SRCCOPY);
	}
	memDC.DeleteDC();
	pDC->DeleteDC();
}
//开始下一关
void CTcsGameDlg::DoNextLevel()
{
	if(m_nLevel==0)
		m_nLevel=1;
	ClearArray();
	SetAnyLevel(m_nLevel);
	//InvalidateRect(&m_rcGame,FALSE);
	m_nSnakeLen=1;
	m_ptSnake[0].x=7;
	m_ptSnake[0].y=0;
	m_nCurDir=1;//1:down 2:Up 3:left 4:right
	m_nCurDirTemp=1;
	CreateNewFood();
	DrawARNumber(m_nLevel,   m_ptDisplay.x+6*13,m_ptDisplay.y+25);
	DrawGame();
	if(m_bEnableSound)
		::PlaySound(MAKEINTRESOURCE(IDR_WAVSTART),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC); 
	SetTimer(1,m_nTimeInterval,NULL);
}

HBRUSH CTcsGameDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	return hbr;
}
//关于对话框设置颜色
void CAboutDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	CPen pen;
	CBrush hbr;
	hbr.CreateSolidBrush(RGB(0,0,0));
	pen.CreatePen(PS_SOLID,2,RGB(0xd1,0xc5,0x98));
	CRect rc;
	GetClientRect(&rc);
	rc.left+=1;
	rc.top+=1;
	//rc.right-=1;
	//rc.bottom-=1;
	dc.SelectObject(&pen);
	dc.SelectObject(&hbr);
	dc.Rectangle(&rc);
}
//画"生命数"
void CTcsGameDlg::DrawLifeCount(int nCount, int initX, int initY)
{
	CBrush hbr;
	CDC* pDC=GetDC();
	HICON hIco=LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICOSNAKE));
	CDC  memDC;
	CRect rc;
	rc.SetRect(initX-5,initY-5,initX+5*16+5,initY+36+21);
	pDC->Draw3dRect(&rc,RGB(255,255,255),RGB(0,0,0));
	pDC->DrawIcon(initX,initY,hIco);

	pDC->SetTextColor(RGB(0,255,0));

	CString str;
	if(nCount>=10000)
		str.Format("%S","X9999");
	else if((nCount<10000)&&(nCount>999))
		str.Format("X%d",nCount);
	else if((nCount<1000)&&(nCount>99))
		str.Format("X0%d",nCount);
	else if((nCount<100)&&(nCount>9))
		str.Format("X00%d",nCount);
	else
		str.Format("X000%d",nCount);
	pDC->TextOut(initX+35,initY+8,str);

	rc.SetRect(initX,initY+36,initX+5*16,initY+36+16);
	hbr.CreateSolidBrush(RGB(0,0,0));
	pDC->FillRect(&rc,&hbr);
	if(nCount>0)
	{
		if(nCount>5)
			nCount=5;
		CBitmap bmp;
		bmp.LoadBitmap(IDB_BITMAP1);
		memDC.CreateCompatibleDC(pDC);
		memDC.SelectObject(bmp);
		for(int i=0;i<nCount;i++)
			pDC->BitBlt(initX+i*16,initY+36,16,16,&memDC,0,0,SRCCOPY);
		memDC.DeleteDC();
	}
	pDC->DeleteDC();
}
//重新开始当前关
void CTcsGameDlg::ReDoLevel()
{
	if(m_bEnableSound)
		::PlaySound(MAKEINTRESOURCE(IDR_WAVSTART),AfxGetApp()->m_hInstance,SND_RESOURCE|SND_ASYNC); 
	ClearArray();
	//InvalidateRect(&m_rcGame,TRUE);
	SetAnyLevel(m_nLevel);
	m_nSnakeLen=1;
	m_ptSnake[0].x=7;
	m_ptSnake[0].y=0;
	m_nCurDir=1;//1:down 2:Up 3:left 4:right
	m_nCurDirTemp=1;
	m_bSnakeDied=FALSE;
	CreateNewFood();
	DrawGame();
	SetTimer(1,m_nTimeInterval,NULL);
}
//设置游戏关卡
void CTcsGameDlg::SetAnyLevel(int nLevel)
{
	switch(nLevel)
	{
	case 1:
		SetLevel_00();
		break;
	case 2:
		SetLevel_01();
		break;
	case 3:
		SetLevel_02();
		break;
	case 4:
		SetLevel_03();
		break;
	case 5:
		SetLevel_04();
		break;
	case 6:
		SetLevel_05();
		break;
	case 7:
		SetLevel_06();
		break;
	case 8:
		SetLevel_07();
		break;
	case 9:
		SetLevel_08();
		break;
	case 10:
		SetLevel_09();
	default:
		SetLevel_00();
	}
}

void CTcsGameDlg::SetLevel_06()
{
	int i,j;
	for(i=4;i<=14;i+=5)
	{
		for(j=2;j<=5;j++)
		{
			SetStone(j,i);
			SetStone(j+7,i);
		}
	}
}

void CTcsGameDlg::SetLevel_07()
{
	int i;
	for(i=2;i<=17;i++)
	{
		SetStone(2,i);
		SetStone(12,i);
	}
	for(i=5;i<=9;i++)
	{
		SetStone(i,6);
		SetStone(i,13);
	}
}

void CTcsGameDlg::SetLevel_08()
{
	int i;
	for(i=3;i<=11;i++)
	{
		SetStone(i,9);
		SetStone(i,10);
	}
	for(i=11;i<=15;i++)
	{
		SetStone(3,i);
		SetStone(7,i);
		SetStone(11,i);
	}
	for(i=5;i<=8;i++)
	{
		SetStone(3,i);
		SetStone(11,i);
	}
	for(i=2;i<=4;i++)
	{
		SetStone(i,4);
		SetStone(i+8,4);
	}
}

void CTcsGameDlg::SetLevel_09()
{
	int i,j;
	for(i=2,j=9;i<=9,j>=2;i++,j--)
	{
		SetStone(i,j);
		SetStone(i+3,j+8);
	}
	for(i=6;i<=8;i++)
	{
		SetStone(i,9);
		SetStone(i,10);
	}
}
//声音
void CTcsGameDlg::OnSound() 
{
	m_bEnableSound=!m_bEnableSound;
	CMenu* hMenu=GetMenu();
	hMenu=hMenu->GetSubMenu(1);
	m_bEnableSound ? hMenu->CheckMenuItem(IDM_SOUND,MF_CHECKED):hMenu->CheckMenuItem(IDM_SOUND,MF_UNCHECKED);
}
//穿越边界
void CTcsGameDlg::OnThrough() 
{
	m_bCanThrough=!m_bCanThrough;
	CMenu* hMenu=GetMenu();
	hMenu=hMenu->GetSubMenu(1);
	m_bCanThrough ? hMenu->CheckMenuItem(IDM_THROUGH,MF_CHECKED):hMenu->CheckMenuItem(IDM_THROUGH,MF_UNCHECKED);	
}

void CTcsGameDlg::SetLevel_00()
{

}
//停止游戏
void CTcsGameDlg::OnStop() 
{
	KillTimer(1);
	m_bPause=FALSE;
	ClearArray();
	m_nSnakeLen=0;
	m_nTotalScore=0;
	m_nSnakeLife=5;
	m_nLevel=0;
	m_bSnakeDied=TRUE;
	m_nWaitType=WAIT_NONE;
	m_wndStatusBar.SetText(_T("停止游戏"),0,0);
	DrawGame();
	InvalidateRect(&m_rcGame,FALSE);
}
//等待进度
void CTcsGameDlg::DrawWait(int nWaitType, int nWaitCount)
{
	if(nWaitType==WAIT_NONE)
		return;
	CPen NewPen;
	NewPen.CreatePen(PS_SOLID,1,RGB(0,255,0));
	CDC* pDC=GetDC();
	CDC* memDC=new CDC;
	CBrush brLen;
	brLen.CreateSolidBrush(RGB(255,255,0));
	CBitmap bmp;
	CRect rcLen;
	rcLen.SetRect(10,60,nWaitCount*10,70);
	if(nWaitType==WAIT_DIED)
		bmp.LoadBitmap(IDB_DIEWAIT);
	else if(nWaitType==WAIT_LEVUP)
		bmp.LoadBitmap(IDB_LEVUP);
	memDC->CreateCompatibleDC(pDC);
	memDC->SelectObject(&bmp);
	memDC->SelectObject(&NewPen);
	memDC->SelectStockObject(BLACK_BRUSH);
	memDC->Rectangle(8,58,172,72);
	NewPen.DeleteObject();
	memDC->SelectObject(brLen);
	NewPen.CreatePen(PS_SOLID,1,RGB(255,255,0));
	memDC->SelectObject(&NewPen);
	memDC->Rectangle(&rcLen);
	pDC->BitBlt(m_rcWait.left,m_rcWait.top,180,80,memDC,0,0,SRCCOPY);
	memDC->DeleteDC();
	pDC->DeleteDC();

}
//Move window follow rbutton
void CTcsGameDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	static CPoint p;
	ClientToScreen(&point);
	if(nFlags & MK_RBUTTON)
	{
		CRect rc;
		GetWindowRect(rc);
		MoveWindow(rc.left+point.x-p.x,rc.top+point.y-p.y,rc.Width(),rc.Height());
	}
	p=point;
	CDialog::OnMouseMove(nFlags, point);	
}

void CTcsGameDlg::DrawInfoText()
{
	CDC* pDC=GetDC();
	pDC->SetBkMode(0);
	pDC->TextOut(m_ptDisplay.x,m_ptDisplay.y+5,_T("Level:"));
	pDC->TextOut(m_ptDisplay.x,m_ptDisplay.y+5+23+25,_T("Length:"));
	pDC->TextOut(m_ptDisplay.x,m_ptDisplay.y+5+46+50,_T("Score:"));
	pDC->DeleteDC();

}

BOOL CTcsGameDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{
	// TODO: Add your specialized code here and/or call the base class
	TOOLTIPTEXT* tt;
	tt=(TOOLTIPTEXT*)lParam;
	CString Tip;
	switch(tt->hdr.code)
	{
	case TTN_NEEDTEXT://该信息表明要求显示工具栏上的提示
		switch(tt->hdr.idFrom)
		{
		case IDM_START:
			Tip.LoadString(IDS_START); //设置对应于工具栏上按钮的提示信息
			break;
		case IDM_PAUSE:
			Tip.LoadString(IDS_PAUSE);
			break;
		case IDM_STOP:
			Tip.LoadString(IDS_STOP);
			break;
		case IDM_HELP:
			Tip.LoadString(IDS_HELP);
			break;
		case IDM_EXIT:
			Tip.LoadString(IDS_EXIT);
			break;
		}
		strcpy(tt->szText,(LPCSTR)Tip);//显示提示信息
		break;
	}	
	return CDialog::OnNotify(wParam, lParam, pResult);
}

⌨️ 快捷键说明

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