📄 tcsgamedlg.cpp
字号:
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 + -