// GameFrame.cpp : implementation file
//
#include "stdafx.h"
#include "gameres.h"
#include "GameFrame.h"
#include "diamond.h"
#include "board.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CGameFrame
IMPLEMENT_DYNCREATE(CGameFrame, CFrameWnd)
#define MODEL_NUMBER 19
#define MODEL_TYPE_NUMBER 7
CBitmap backpic;
CBitmap backgroundpic;
CBitmap diamondpic;
CBitmap boardpic;
CDC backDC;
CDC backgroundDC;
CDC diamondDC;
CDC boardDC;
CBoard board;
CDiamond DiaModel[MODEL_NUMBER];
CDiamond *oldDiamond=NULL;
int m_Total=0,m_Marks=0,m_Level=0;
char newdata[MODEL_NUMBER][16]={0,0,0,0, 1,1,1,0, 0,1,0,0, 0,0,0,0,//T1(0)
0,1,0,0, 0,1,1,0, 0,1,0,0, 0,0,0,0,//T2(1)
0,1,0,0, 1,1,1,0, 0,0,0,0, 0,0,0,0,//T3(2)
0,1,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0,//T4(3)
0,0,0,0, 1,1,1,1, 0,0,0,0, 0,0,0,0,//|1(4)
0,1,0,0, 0,1,0,0, 0,1,0,0, 0,1,0,0,//|2(5)
1,1,0,0, 0,1,1,0, 0,0,0,0, 0,0,0,0,//Z1(6)
0,1,0,0, 1,1,0,0, 1,0,0,0, 0,0,0,0,//Z2(7)
1,1,0,0, 1,1,0,0, 0,0,0,0, 0,0,0,0,//O1(8)
0,1,1,0, 0,1,1,0, 0,0,0,0, 0,0,0,0,//BZ1(9)
1,0,0,0, 1,1,0,0, 0,1,0,0, 0,0,0,0,//BZ2(10)
0,1,0,0, 0,1,0,0, 0,1,1,0, 0,0,0,0,//L1(11)
0,0,0,0, 0,0,1,0, 1,1,1,0, 0,0,0,0,//L2(12)
1,1,0,0, 0,1,0,0, 0,1,0,0, 0,0,0,0,//L3(13)
0,0,0,0, 1,1,1,0, 1,0,0,0, 0,0,0,0,//L4(14)
0,1,0,0, 0,1,0,0, 1,1,0,0, 0,0,0,0,//BL(15)
0,0,0,0, 1,1,1,0, 0,0,1,0, 0,0,0,0,//BL(16)
1,1,0,0, 1,0,0,0, 1,0,0,0, 0,0,0,0,//BL(17)
0,1,0,0, 0,1,1,1, 0,0,0,0, 0,0,0,0,//BL(18)
};
char newlimit[MODEL_NUMBER][16]={0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//T1
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//T2
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//T3
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//T4
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//|1
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//|2
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//Z1
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//Z2
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//O1
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//BZ1
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//BZ2
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//L1
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//L2
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//L3
0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,0,//L4
};
CGameFrame::CGameFrame()
{
CRect rect;
Create(NULL,"Game");
rect.bottom=435;rect.right=310;
rect.top=0;rect.left=0;
MoveWindow(rect,true);
}
CGameFrame::~CGameFrame()
{
}
BEGIN_MESSAGE_MAP(CGameFrame, CFrameWnd)
//{{AFX_MSG_MAP(CGameFrame)
ON_WM_KEYDOWN()
ON_WM_CREATE()
ON_WM_TIMER()
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CGameFrame message handlers
void CGameFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
char temp[16][10];
CString s;
int x,y;
board.GetDiamond()->GetPoint(x,y);
board.GetBoard(temp);
if(nChar==VK_DOWN) SetTimer(1,20,NULL);
if(nChar==VK_RIGHT) board.GetDiamond()->MoveR(temp);
if(nChar==VK_LEFT) board.GetDiamond()->MoveL(temp);
if(nChar==VK_UP) board.TransFram(temp);
Show();
CFrameWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}
int CGameFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CClientDC dc(this);
backpic.m_hObject=(HBITMAP)::LoadImage(NULL,"background8.bmp",
IMAGE_BITMAP,300,400,LR_LOADFROMFILE);
// backpic.LoadBitmap(IDB_BOARD);
backgroundpic.m_hObject=(HBITMAP)::LoadImage(NULL,"background8.bmp",
IMAGE_BITMAP,300,400,LR_LOADFROMFILE);
// backgroundpic.LoadBitmap(IDB_BOARD);
diamondpic.m_hObject=(HBITMAP)::LoadImage(NULL,"diamond8.bmp",
IMAGE_BITMAP,20,20,LR_LOADFROMFILE);
// diamondpic.LoadBitmap(IDB_B2);
boardpic.m_hObject=(HBITMAP)::LoadImage(NULL,"board8.bmp",
IMAGE_BITMAP,20,20,LR_LOADFROMFILE);
// boardpic.LoadBitmap(IDB_B1);
backDC.CreateCompatibleDC(&dc);
backgroundDC.CreateCompatibleDC(&dc);
diamondDC.CreateCompatibleDC(&dc);
boardDC.CreateCompatibleDC(&dc);
backDC.SelectObject(backpic);
backgroundDC.SelectObject(backgroundpic);
diamondDC.SelectObject(diamondpic);
boardDC.SelectObject(boardpic);
LoadDiamond();
SetTimer(1,400,NULL);
Sent();
return 0;
}
void CGameFrame::LoadDiamond(void)
{
for(int i=0;i<MODEL_NUMBER;i++)
{
DiaModel[i].SetData(newdata,i);
DiaModel[i].SetLimit(newlimit,i);
}
DiaModel[0].Link(&DiaModel[1]);//t
DiaModel[1].Link(&DiaModel[2]);//t
DiaModel[2].Link(&DiaModel[3]);//t
DiaModel[3].Link(&DiaModel[0]);//t
DiaModel[4].Link(&DiaModel[5]);//|
DiaModel[5].Link(&DiaModel[4]);//|
DiaModel[6].Link(&DiaModel[7]);//Z
DiaModel[7].Link(&DiaModel[6]);//Z
DiaModel[8].Link(&DiaModel[8]);//O
DiaModel[9].Link(&DiaModel[10]);//BZ
DiaModel[10].Link(&DiaModel[9]);//BZ
DiaModel[11].Link(&DiaModel[12]);//L
DiaModel[12].Link(&DiaModel[13]);//L
DiaModel[13].Link(&DiaModel[14]);//L
DiaModel[14].Link(&DiaModel[11]);//L
DiaModel[15].Link(&DiaModel[16]);//BL
DiaModel[16].Link(&DiaModel[17]);//BL
DiaModel[17].Link(&DiaModel[18]);//BL
DiaModel[18].Link(&DiaModel[15]);//BL
}
void CGameFrame::Sent(void)
{
int n;
bool IsNull=0;
if(oldDiamond!=NULL)
board.NewDiamond(oldDiamond);
else IsNull=1;
n=rand()%MODEL_TYPE_NUMBER;
switch(n)
{
case 0:
oldDiamond=&DiaModel[0];
break;
case 1:
oldDiamond=&DiaModel[4];
break;
case 2:
oldDiamond=&DiaModel[7];
break;
case 3:
oldDiamond=&DiaModel[8];
break;
case 4:
oldDiamond=&DiaModel[9];
break;
case 5:
oldDiamond=&DiaModel[11];
break;
case 6:
oldDiamond=&DiaModel[15];
break;
}
if(IsNull)
board.NewDiamond(oldDiamond);
}
void CGameFrame::Show(void)
{
CClientDC ShowDC(this);
char ShowData[16][10],ShowDia[4][4],ShowOldDia[4][4];
int DiaX,DiaY,i,j;
int x=5,y=75;
CString SLevel,STotal,SMarks;
board.GetDiamond()->GetData(ShowDia);
backDC.BitBlt(0,0,300,400,&backgroundDC,0,0,SRCCOPY);
if(oldDiamond!=NULL) oldDiamond->GetData(ShowOldDia);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
board.GetDiamond()->GetPoint(DiaX,DiaY);
if(ShowDia[i][j]!=0) backDC.BitBlt(x+j*20+DiaX*20,y+i*20+20*DiaY,20,20,&diamondDC,0,0,SRCCOPY);
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(ShowOldDia[i][j]!=0) backDC.BitBlt(j*20+212,i*20+80,20,20,&diamondDC,0,0,SRCCOPY);
}
board.GetBoard(ShowData);
for(i=0;i<16;i++)
for(j=0;j<10;j++)
if(ShowData[i][j]!=0) backDC.BitBlt(x+j*20,y+i*20,20,20,&boardDC,0,0,SRCCOPY);
SLevel.Format("%-7d",m_Level);
STotal.Format("%-7d",m_Total);
SMarks.Format("%-7d",m_Marks);
backDC.TextOut(225,212,SLevel);
backDC.TextOut(225,286,STotal);
backDC.TextOut(225,361,SMarks);
ShowDC.BitBlt(0,0,300,400,&backDC,0,0,SRCCOPY);
}
void CGameFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
char temp[16][10];
board.GetBoard(temp);
board.GetDiamond()->Floor(temp);
Show();
if(board.Touch(temp))
{
board.AddDiamond();
m_Marks=board.Judge();
m_Marks=m_Marks*m_Marks*100;
m_Total+=m_Marks;
m_Level=m_Total/3000;
if(m_Level==9)
{
SetTimer(1,100000,NULL);
MessageBox("你真NB!");
exit(1);
}
Sent();
if(board.Die())
{
SetTimer(1,100000,NULL);
MessageBox(" 游戏结束!\n欢迎玩Agent俄罗斯方块");
exit(1);
}
SetTimer(1,600-m_Level*50,NULL);
}
CFrameWnd::OnTimer(nIDEvent);
}
void CGameFrame::OnClose()
{
// TODO: Add your message handler code here and/or call default
MessageBox("欢迎玩Agent俄罗斯方块");
CFrameWnd::OnClose();
}