📄 gamedlg.cpp
字号:
ClearUp();
PreView();
object.x=16;object.y=10;
object.Type=object2.Type;
object.group=object2.group;ZZ=ZZ2;
a0=b0;a1=b1;a2=b2;a3=b3;a4=b4;a5=b5;a6=b6;a7=b7;
ObjectGroup(object);
object.Type=object3.Type;object.x=object3.x;
object.y=object3.y;
object.group=object3.group;
ZZ=ZZ3;
a0=c0;a1=c1;a2=c2;a3=c3;a4=c4;a5=c5;a6=c6;a7=c7;
}
else
ObjectGroup(object);
Show(object);
}
}
void CGameDlg::KeepData() //保存放好所在位置 //里面都是在停止计时器11后进行的操作
{
G[object.x+a0][object.y+a1]=object.Type;
G[object.x+a2][object.y+a3]=object.Type;
G[object.x+a4][object.y+a5]=object.Type;
G[object.x+a6][object.y+a7]=object.Type;
int i,j,k,p,q,o=0;
for(i=0;i<M;i++)
if(G[i][1]>0||G[i][0]>0||G[i][2]>0) //如果准备下的方块的高度大于剩余高度时会出错
{
Running=0;
AfxMessageBox("游戏结束!");
OnCancel();//OnOK();都可以实现,避免了之前的结束后选继续又出现一个窗口
start=0; //start恢复初始值;
Gameover dlg;
// dlg.DoModal();
if(dlg.DoModal()!=IDOK)
{
CGameDlg dlg;
dlg.DoModal();
// return;
}
return; //如果按确定就直接返回结束游戏
//else OnCancel();
}
for( j = N-1; j >= 0; j--)
{
for(i=0,k=0;i<M;i++)
if(G[i][j]>0)
k++;
if(k==M) //如果G[i][j]>0的个数k等于行数M ,既行慢了 消去(0为背景色,其余数值对应颜色在前面定义)
{
o++; //一次消多行的奖励得分的计数量
/////////////////////////////////////////////////////////消行特效
G[M-1][j]=0;
one(G[M-1][N-1],M-1,j);
// go=0;
for (p=M-1;p>0;p--)
{
//MessageBox("as");
for (int hangfire=0;hangfire<=30000000;hangfire++){}//用来延时 StartTimer(1000);
for (q=0;q<M;q++)
{
G[q][j]=G[q+1][j];
one(G[q][j],q,j);
}
}
// go=1;
////////////////////////////////////////////////////////
for(p=j;p>=1;p--)
{
for(q=0;q<M;q++)
{
G[q][p]=G[q][p-1]; //调用one(int Type,int i,int j) 画单元格,//全部下落一行,代替原来一行
one(G[q][p],q,p);
}
}
for(q=0;q<M;q++) //这只是在前一个for循环把所有方格(除最底下一格外)下移后,再把最顶行全部致零(由于全下一后顶部没有初始化)
{
G[q][0]=0; //0即为背景色,
one(G[q][p],q,p); //调用one(int Type,int i,int j) 画单元格
}
j++;
Score+=100*o; //一次消多行加分;
if (Score>HScore)
{
HScore=Score;
CFile f;//存储最高记录;
f.Open ("D:\\Highest Score.dat",CFile::modeCreate|CFile::modeWrite);
CArchive in(&f,CArchive::store);
in<<HScore;
in.Close();
f.Close();
}
level=Score/1000+1;
if(Run_Time>100&&level>llevel) //确保速度不会减为Run_Time不回减为零
{
if(Score!=0) Run_Time-=100;//随等级提升,速度加快
llevel=level;
////////////////////////////////////////////////////////////
CDC *pDC=GetDC();
ASSERT(pDC!=NULL);
// CBrush brush;
pDC->SetBkMode(TRANSPARENT);//无背景色
switch(movie)
{
case 0:
pDC->SetTextColor(RGB(250,0,0));
pDC->TextOut(m_a+5,m_b+240," level up! ");
movie++;
break;
case 1:
pDC->SetTextColor(RGB(250,0,0));
pDC->TextOut(m_a+5,m_b+240," 升级了! ");
movie++;
break;
case 2:
pDC->SetTextColor(RGB(250,0,0));
pDC->TextOut(m_a+5,m_b+240," 加点速! ");
movie++;
break;
case 3:
pDC->SetTextColor(RGB(250,0,0));
pDC->TextOut(m_a+5,m_b+240," 努力啊! ");
movie=0;
break;
}
ReleaseDC(pDC);
////////////////////////////////////////////////////////////
}
}
}
}
void CGameDlg::OnDestroy() //关闭
{
CGameDlg::OnDestroy(); //为何出现这条语句? 屏蔽后暂无发现问题
for(int i=1;i<=11;i++)
KillTimer(i);
// TODO: Add your message handler code here
}
void CGameDlg::PreView() //预先显示组
{
repaircount=1;
if(Running==0)
{
OnDestroy();
return;
}
CTime tm=CTime::GetCurrentTime();
object2.Type=(rand()+tm.GetMinute()+tm.GetSecond())%V+1; //产生下一个方块颜色Type号
object2.x=M/2;object2.y=0; //产生下一个方块的初始坐标
object2.group=(tm.GetMinute()*tm.GetSecond()+rand())%7+1; //产生下一个方块的形状(组)
ZZ2=(rand()+tm.GetDay()*tm.GetHour())%97; // 产生下一个方块的在基本形状(组)中的形式(序号)
b0=b1=b2=b3=b4=b5=b6=b7=0;
switch(object2.group)
{
case 1: b2=0;b3=1;b4=1;b5=0;b6=1;b7=1; break; //正方形(坐标从-1到2?)
case 2: b2=0;b3=1;b4=0;b5=-1;b6=1;b7=-1;break; //倒L形 23是不能相互转换的
case 3: b2=0;b3=1;b4=0;b5=-1;b6=1;b7=1; break; //L形
case 4: b2=0;b3=1;b4=0;b5=2;b6=0;b7=-1; break; //竖棍
case 5: b2=0;b3=-1;b4=1;b5=0;b6=1;b7=1; break; //竖Z 左高 56是不能通过变形相互转换的
case 6: b2=0;b3=1;b4=1;b5=0;b6=1;b7=-1; break; //竖Z 右高
case 7: b2=0;b3=1;b4=0;b5=2;b6=1;b7=1; break; //山形
}
for(int i=0;i<ZZ2;i++)
ChangeShape(object2);
if(object2.y+b3<0||object2.y+b5<0||object2.y+b7<0||object2.y<0)
object2.y=object2.y+1;
if(object2.y+b3>0&&object2.y+b5>0&&object2.y+b7>0&&object2.y>0)
object2.y=0;
}
void CGameDlg::OnButton1()
{
start=1;
////////////////////////读取记录
CFile f;
if(f.Open("D:\\Highest Score.dat",CFile::modeRead)==FALSE)
{HScore=0;
// return;
}
else
{
CArchive out(&f,CArchive::load);
out>>HScore;
out.Close();
f.Close();
}
//////////////
CDC *pDC = GetDC();
ASSERT(pDC != NULL);
OnDraw(pDC);
ReleaseDC(pDC);
}
void CGameDlg::OnDown()
{
if(!Running)
return;
MoveOn(3);
ObjectGroup(object);
KillTimer(11);
CString strButtonCaption;
m_Pause.GetWindowText(strButtonCaption);
if(!strButtonCaption.Compare("暂停")) SetTimer(11, 20, NULL); //禁止它在暂停时作用
}
void CGameDlg::OnLeft()
{
if(!Running)
return;
MoveOn(4);
}
void CGameDlg::OnRight()
{
if(!Running)
return;
MoveOn(2);
}
void CGameDlg::OnUp()
{
if(!Running)
return;
MoveOn(1);
}
void CGameDlg::MoveOn(int n)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC(); ASSERT(pDC!=NULL);
DeleteGroup(object);int b_x=object.x,b_y=object.y;
CString strButtonCaption;
m_Pause.GetWindowText(strButtonCaption);
switch(n)
{
case 1: //变形
if(!strButtonCaption.Compare("暂停")) ChangeShape(object);
ObjectGroup(object);
break;
case 2:
if(!strButtonCaption.Compare("暂停")){
object.x = object.x < M-1 ? object.x+1 : M-1;
if(check1())
object.x=b_x; }
ObjectGroup(object);
break;
case 3:
if(!strButtonCaption.Compare("暂停"))
{object.y=object.y<N-1?object.y+1:N-1;
if(check2())
object.y=b_y;}
ObjectGroup(object);
break;
case 4:
if(!strButtonCaption.Compare("暂停")){
object.x=object.x>1?object.x-1:0;
if(check1())
object.x=b_x; }
ObjectGroup(object);
break;
case 5:
if(!strButtonCaption.Compare("暂停")){
object.y=object.y>1?object.y-1:0;
if(check2())object.y=b_y; }
ObjectGroup(object);
break;
}
Show(object);
////////////////////////
// SetTimer(11,Run_Time,NULL);
////////////////////////
ReleaseDC(pDC);
}
void CGameDlg::ClearUp() //清空预备显示 地方
{
CDC *pDC=GetDC();
ASSERT(pDC!=NULL);
COLORREF color=RGB(200,230,214); //RGB(233,230,214)与背景色相同
CPen pen;
CBrush brush;
pen.CreatePen(PS_SOLID,1,color);
brush.CreateSolidBrush (color);
pDC->SelectObject(pen);
pDC->SelectObject(brush);
pDC->Rectangle(J_x,J_y-45,J_x+100,J_y+56); //预备显示的区域,既下一个方块的显示区域,已经调整对齐//101刚好全部覆盖
DeleteObject(brush);
DeleteObject(pen);
ReleaseDC(pDC);
}
void CGameDlg::OnBackcolor() //背景色
{
KillTimer(11);
CColorDialog dlg(BackColor); //++++++++++++++
if(dlg.DoModal()==IDOK)
BackColor=dlg.GetColor();
CString strButtonCaption;
m_Pause.GetWindowText(strButtonCaption);
if(!strButtonCaption.Compare("暂停")) SetTimer(11, Run_Time, NULL); //在非暂停时才恢复
Back=1;
}
void CGameDlg::ReDraw()
{
Shape();
for(int j,i=0;i<M;i++)
for(j=0;j<N;j++)
one(G[i][j],i,j); //调用one(int Type,int i,int j) 画单元格
}
int CGameDlg::Check(CPoint p, CRect rect)
{
if(p.x>=rect.left&&p.x<=rect.right&&p.y>=rect.top&&p.y<=rect.bottom)
return 1;
else
return 0;
}
int CGameDlg::WentTo()
{
int AB1,AB2,AB3,AB4,k,t;
AB4=Sj.left;
AB1=Sj.top;
AB2=LW-Sj.right;
AB3=LH-Sj.bottom;
AB1>AB4 ? (k=AB4,t=4) : (k=AB1,t=1);
k>AB2?(k=AB2,t=2):(k=k,t=t);
k>AB3?(k=AB3,t=3):(k=k,t=t);
if(k<10)
return t;
else
return 0;
}
void CGameDlg::OnButton5()
{
// TODO: Add your control notification handler code here
p1.x=p1.y=0;
ClientToScreen(&p1);
pp=p1;
SetTimer(1,10,NULL);
UpdateData(FALSE);
}
void CGameDlg::OnButton2()
{
// TODO: Add your control notification handler code here
p1.x=p1.y=0;
ClientToScreen(&p1); pp=p1;
SetTimer(2,10,NULL);
}
void CGameDlg::OnButton3()
{
// TODO: Add your control notification handler code here
p1.x=p1.y=0;
ClientToScreen(&p1);
pp=p1;
SetTimer(3,10,NULL);
}
void CGameDlg::OnButton4()
{
// TODO: Add your control notification handler code here
p1.x=p1.y=0;
ClientToScreen(&p1);
pp=p1;
SetTimer(4,10,NULL);
}
void CGameDlg::OnMyself()
{
// TODO: Add your control notification handler code here
CDC *pDC=GetDC();
ASSERT(pDC!=NULL);
/* int m_x=425,m_y=490;
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(15,113,210));
pDC->TextOut(m_x,m_y,"2008年8月12日");
CFont font;
font.CreateFont(20,0,0,0,500,0,0,0,OEM_CHARSET,OUT_DEFAULT_PRECIS, //20为字体大小 500为字体粗度
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,"楷体");//宋体楷体
pDC->SelectObject(font);
pDC->SetTextColor(RGB(165,124,10));
pDC->TextOut(m_x,m_y+30,"作者: 修改");
pDC->SetTextColor(RGB(165,13,170));
pDC->TextOut(m_x,m_y+40,"");
DeleteObject(font);
*/
ReleaseDC(pDC);
Gameover dlg;
KillTimer(11);
if(dlg.DoModal()==IDOK)
{
CDialog::OnCancel();
}
if(start)
{
Back=1; //重画 //////无用,个人观点,在没有结束游戏时点次按钮然后点继续会使屏幕闪一下
SetTimer(11,Run_Time,NULL);
}
}
void CGameDlg::OnPause()
{
if(start)
{
CString strButtonCaption;
m_Pause.GetWindowText(strButtonCaption);
if(!strButtonCaption.Compare("暂停"))//if(pause%2)
{
KillTimer(11);
m_Pause.SetWindowText("继续");
// pause++;
}
else
{
SetTimer(11,Run_Time,NULL);
m_Pause.SetWindowText("暂停");
// pause++;
}
}
}
/*添加键盘的另一种方法
前提 所有控件为disable (禁用)
在ClassWizard为CGameDlg添加击键消息WM_KEYDOWN的消息映射函数OnKeyDown(),添加代码如下
void CGameDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
switch (nChar)
{
case '1':
CGameDlg::OnButton1();
break;
case VK_LEFT:
case 'J':
case 'j':
CGameDlg::OnLeft();
break;
case VK_RIGHT:
case 'L':
case 'l':
CGameDlg::OnRight();
break;
case VK_UP:
case 'I':
case 'i':
CGameDlg::OnUp();
break;
case VK_DOWN:
case 'K':
case 'k':
CGameDlg::OnDown();
break;
}
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -