📄 bbdlg.cpp
字号:
// BBDlg.cpp : implementation file
//
#include "stdafx.h"
#include "BB.h"
#include "BBDlg.h"
#include "winbase.h"
#include <sys/timeb.h>
#include <time.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBBDlg dialog
CEvent CBBDlg::gEnd;
CRussionBlock CBBDlg::s_CurBlock;
BYTE CBBDlg::Face[COL_BLOCK_COUNT+4][ROW_BLOCK_COUNT+2];
UINT CBBDlg::top[ROW_BLOCK_COUNT+2];
UINT CBBDlg::m_uiTop=0;
int CBBDlg::s_pos[4]={0,0,0,0};
int CBBDlg::count=0;
UINT CBBDlg::s_uDownDelay=0;
UINT CBBDlg::s_uFastDelay=0;
UINT CBBDlg::s_uEraseDelay=0;
UINT CBBDlg::s_uTurnDelay=0;
HWND CBBDlg::hw;
int CBBDlg::error=0;///////////////////////////////////////////////////
CWnd* CBBDlg::gwnd;
HWND CBBDlg::game=NULL;
HWND CBBDlg::fhwnd;
HWND CBBDlg::nhwnd;
HDC CBBDlg::fhdc;
HDC CBBDlg::nhdc;
COLORREF CBBDlg::color[7]={108799,9649966,16712451,3911680,2621663,15711039,14358453};
COLORREF CBBDlg::gray=11445412;
CLR_TYPE*CBBDlg::ct=NULL;
int CBBDlg::seed=8;
CBBDlg::CBBDlg(CWnd* pParent /*=NULL*/)
: CDialog(CBBDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CBBDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
//new data
::memset(Face,0,(COL_BLOCK_COUNT+4)*(ROW_BLOCK_COUNT+2)*sizeof(BYTE));
::memset(top,0,(ROW_BLOCK_COUNT+2)*sizeof(int));
top[0]=top[ROW_BLOCK_COUNT+1]=COL_BLOCK_COUNT;
int i;
for(i=0;i<ROW_BLOCK_COUNT+2;i++)
Face[0][i]=1;
for(i=0;i<COL_BLOCK_COUNT+4;i++)
{
Face[i][0]=1;
Face[i][ROW_BLOCK_COUNT+1]=1;
}
hw=GetSafeHwnd();
m_bpause=TRUE;
BOOL found=FALSE,fail;
int *mod=NULL;
while(!found)
{
fail=FALSE;
mod=new int[seed];
::memset(mod,0,seed*sizeof(int));
for(int j=0;j<7 && !fail;j++)
{
if(mod[color[j]%seed]==1)
fail=TRUE;
mod[color[j]%seed]=1;
}
delete []mod;
if(!fail)
found=TRUE;
else
seed++;
}
ct=new CLR_TYPE[seed];
::memset(ct,0,seed*sizeof(CLR_TYPE));
for(int j=0;j<7;j++)
{
ct[color[j]%seed].clr=color[j];
ct[color[j]%seed].type=j;
}
}
void CBBDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CBBDlg)
DDX_Control(pDX, IDC_HANDLE, m_Ehandle);
DDX_Control(pDX, IDC_TYPE, m_Etype);
DDX_Control(pDX, IDC_STATUS, m_Estatus);
DDX_Control(pDX, IDC_ERROR, m_error);
DDX_Control(pDX, IDC_ERASE_AFTER, m_setErase);
DDX_Control(pDX, IDC_DOWN_AFTER, m_setdown);
DDX_Control(pDX, IDC_TURN_AFTER, m_setturn);
DDX_Control(pDX, IDC_FAST_AFTER, m_setFast);
DDX_Control(pDX, IDC_SAVE, m_save);
DDX_Control(pDX, IDC_TURN_DELAY, m_turn_delay);
DDX_Control(pDX, IDC_FAST_DELAY, m_fast_delay);
DDX_Control(pDX, IDC_ERASE_DELAY, m_erase_delay);
DDX_Control(pDX, IDC_DOWN_DELAY, m_down_delay);
DDX_Control(pDX, IDC_DEFAULT, m_default);
DDX_Control(pDX, IDC_START, m_start);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CBBDlg, CDialog)
//{{AFX_MSG_MAP(CBBDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_START, OnStart)
ON_BN_CLICKED(IDC_SAVE, OnSave)
ON_BN_CLICKED(IDC_DEFAULT, OnDefault)
ON_MESSAGE(WM_WATCH,OnWatch)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_FAST_AFTER, OnReleasedcaptureFastAfter)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_DOWN_AFTER, OnReleasedcaptureDownAfter)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_TURN_AFTER, OnReleasedcaptureTurnAfter)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_ERASE_AFTER, OnReleasedcaptureEraseAfter)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBBDlg message handlers
BOOL CBBDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
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);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
SetTimer(1, 10, NULL);
m_setFast.SetRange(0,300);
m_setdown.SetRange(0,100);
m_setErase.SetRange(50,500);
m_setturn.SetRange(0,200);
CString ifo,text;
CStdioFile file("\\vc\\Bb\\中游方块配置.ini",
CFile::modeCreate|CFile::modeNoTruncate|CFile::modeRead);
file.SeekToBegin();
file.ReadString(ifo);
file.ReadString(ifo);
text=ifo.Right(ifo.GetLength()-15);
m_fast_delay.SetWindowText(text);
s_uFastDelay=atoi(LPCTSTR(text));
file.ReadString(ifo);
text=ifo.Right(ifo.GetLength()-15);
m_down_delay.SetWindowText(text);
s_uDownDelay=atoi(LPCTSTR(text));
file.ReadString(ifo);
text=ifo.Right(ifo.GetLength()-16);
m_erase_delay.SetWindowText(text);
s_uEraseDelay=atoi(LPCTSTR(text));
file.ReadString(ifo);
text=ifo.Right(ifo.GetLength()-15);
m_turn_delay.SetWindowText(text);
s_uTurnDelay=atoi(LPCTSTR(text));
file.Close();
m_setFast.SetPos(s_uFastDelay);
m_setdown.SetPos(s_uDownDelay);
m_setErase.SetPos(s_uEraseDelay);
m_setturn.SetPos(s_uTurnDelay);
m_start.EnableWindow(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
void CBBDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CBBDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CBBDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CBBDlg::GetFirstBlock(HDC hDC)
{
int i;
//HDC hDC=::GetDC(NULL);
//::Sleep(10);
COLORREF cur1=::GetPixel(hDC,135,64);//COLORREF cur1=::GetPixel(hDC,324,221);
COLORREF cur2;
if(cur1==color[1])
{
//::ReleaseDC(NULL,hDC);
s_CurBlock=CRussionBlock(1,1);
return;
}
cur1=::GetPixel(hDC,135,46);//cur1=::GetPixel(hDC,324,203);
cur2=::GetPixel(hDC,153,46);//cur2=::GetPixel(hDC,342,203);
for(i=2;i<7;i++)
{
if(color[i]==cur1||color[i]==cur2)
{
if(cur1==color[i] && cur2==color[i])
{
if(i==6)
s_CurBlock=CRussionBlock(6,3);
else
s_CurBlock=CRussionBlock(5,3);
//::ReleaseDC(NULL,hDC);
return;
}
else if(cur1==color[i])
{
if(i==4)
s_CurBlock=CRussionBlock(4,0);
if(i==5)
s_CurBlock=CRussionBlock(5,1);
else
s_CurBlock=CRussionBlock(3,0);
//::ReleaseDC(NULL,hDC);
return;
}
else if(cur2==color[i])
{
if(i==4)
s_CurBlock=CRussionBlock(4,2);
if(i==6)
s_CurBlock=CRussionBlock(6,1);
else
s_CurBlock=CRussionBlock(2,0);
//::ReleaseDC(NULL,hDC);
return;
}
}
}
cur1=::GetPixel(hDC,135,10);//cur1=::GetPixel(hDC,324,167);
cur2=::GetPixel(hDC,135,28);//cur2=::GetPixel(hDC,324,185);
if(cur1==color[0])
{
cur1=::GetPixel(hDC,171,10);//cur1=::GetPixel(hDC,362,168);
if(cur1!=108799)
{
s_CurBlock=CRussionBlock(0,0);
//::ReleaseDC(NULL,hDC);
return;
}
}
if(cur1==color[1])
{
s_CurBlock=CRussionBlock(1,0);
//::ReleaseDC(NULL,hDC);
return;
}
for(i=2;i<7;i++)
{
if(color[i]==cur1||color[i]==cur2)
{
if(cur1==color[i] && cur2==color[i])
{
if(i==6)
s_CurBlock=CRussionBlock(6,0);
else
s_CurBlock=CRussionBlock(5,0);
//::ReleaseDC(NULL,hDC);
return;
}
else if(cur1==color[i])
{
if(i==4)
s_CurBlock=CRussionBlock(4,1);
else if(i==5)
s_CurBlock=CRussionBlock(5,2);
else
s_CurBlock=CRussionBlock(3,1);
//::ReleaseDC(NULL,hDC);
return;
}
else if(cur2==color[i])
{
if(i==4)
s_CurBlock=CRussionBlock(4,3);
else if(i==6)
s_CurBlock=CRussionBlock(6,2);
else
s_CurBlock=CRussionBlock(2,1);
//::ReleaseDC(NULL,hDC);
return;
}
}
}
//::ReleaseDC(NULL,hDC);
s_CurBlock=CRussionBlock(-1,0);
}
void CBBDlg::GetFirstBlk(HDC hDC)
{
int ntype;
int mod;
COLORREF col1,col2;
col1=::GetPixel(hDC,135,64);
if(col1==color[1])
{
s_CurBlock=CRussionBlock(1,1);
return;
}
else
{
col1=::GetPixel(hDC,135,10);
mod=col1%seed;
if(ct[mod].clr==col1)
{
ntype=ct[mod].type;
switch(ntype)
{
case 0:
col2=::GetPixel(hDC,171,10);
if(col1!=col2)
s_CurBlock=CRussionBlock(0,0);
else
s_CurBlock=CRussionBlock(-1,0);
return;
case 1:
s_CurBlock=CRussionBlock(1,0);
return;
case 2:
s_CurBlock=CRussionBlock(2,0);
return;
case 3:
s_CurBlock=CRussionBlock(3,1);
return;
case 4:
col2=::GetPixel(hDC,153,10);
if(col1==col2)
s_CurBlock=CRussionBlock(4,1);
else
s_CurBlock=CRussionBlock(4,0);
return;
case 5:
col2=::GetPixel(hDC,153,10);
if(col1==col2)
{
col2=::GetPixel(hDC,171,10);
if(col1==col2)
s_CurBlock=CRussionBlock(5,2);
else
s_CurBlock=CRussionBlock(5,1);
}
else
s_CurBlock=CRussionBlock(5,0);
return;
case 6:
col2=::GetPixel(hDC,153,10);
if(col1==col2)
{
col2=::GetPixel(hDC,171,10);
if(col1==col2)
s_CurBlock=CRussionBlock(6,0);
else
s_CurBlock=CRussionBlock(6,1);
}
else
s_CurBlock=CRussionBlock(6,3);
return;
}
}
else
{
col1=::GetPixel(hDC,153,10);
mod=col1%seed;
if(ct[mod].clr==col1)
{
ntype=ct[mod].type;
switch(ntype)
{
case 2:
s_CurBlock=CRussionBlock(2,1);
return;
case 3:
s_CurBlock=CRussionBlock(3,0);
return;
case 4:
col2=::GetPixel(hDC,171,28);
if(col2==col1)
s_CurBlock=CRussionBlock(4,3);
else
s_CurBlock=CRussionBlock(4,2);
return;
case 5:
s_CurBlock=CRussionBlock(5,3);
return;
}
}
col1=::GetPixel(hDC,171,10);
if(col1==color[6])
{
s_CurBlock=CRussionBlock(6,2);
return;
}
else
{
s_CurBlock=CRussionBlock(-1,0);
return;
}
}
}
}
void CBBDlg::OnStart()
{
// TODO: Add your control notification handler code here
if(m_bpause)
{
//初始化
s_CurBlock=CRussionBlock(-1,0);
::memset(Face,0,(COL_BLOCK_COUNT+4)*(ROW_BLOCK_COUNT+2)*sizeof(BYTE));
::memset(top,0,(ROW_BLOCK_COUNT+2)*sizeof(int));
top[0]=top[ROW_BLOCK_COUNT+1]=COL_BLOCK_COUNT;
int i;
for(i=0;i<ROW_BLOCK_COUNT+2;i++)
Face[0][i]=1;
for(i=0;i<COL_BLOCK_COUNT+4;i++)
{
Face[i][0]=1;
Face[i][ROW_BLOCK_COUNT+1]=1;
}
m_uiTop=0;
//SetTimer(2,10,NULL);
//开始线程
gEnd.ResetEvent();
AfxBeginThread(Cal,(void* )this);
m_bpause=0;
//m_pos.SetWindowText("start");
}
else
{
gEnd.SetEvent();
m_bpause=TRUE;
//m_pos.SetWindowText("stop");
}
}
UINT CBBDlg::Cal(LPVOID pPar)
{
HDC hfmdc = ::GetDC(fhwnd);//HDC hDC = ::GetDC(NULL);
HDC hsmdc=::GetDC(nhwnd);
HDC gdc=::GetDC(game);
CBBDlg *ths=(CBBDlg* )pPar;
LARGE_INTEGER t1,t2,tc;
QueryPerformanceFrequency(&tc);
LONGLONG add=0;
int cou=0;
//键盘输入
//四大参数
int nStatus=0,nMove=0,nClearNum=0;
BYTE ClearLines[4]={255,255,255,255};
CRussionBlock prior;
COLORREF clr;
while(::WaitForSingleObject(gEnd,0)!=WAIT_OBJECT_0 && s_CurBlock.GetType()<0)
{
GetFirstBlk(hfmdc);//GetFirstBlock(hfmdc);//GetFirstBlock(hDC);
}
while(::WaitForSingleObject(gEnd,0)!=WAIT_OBJECT_0 && s_CurBlock.GetType()>-1)
{
//机械下落
::PostMessage(game,WM_KEYDOWN,VK_DOWN,1);
::PostMessage(game,WM_KEYUP,VK_DOWN,1);
nStatus=s_CurBlock.Attack2(Face,top,m_uiTop,nMove,nClearNum,ClearLines);
//::Sleep(1000);
//::Sleep(0);
prior=s_CurBlock;
//机械翻转
do
{
if(prior.GetStatus()!=nStatus)
{
::PostMessage(game,WM_KEYDOWN,VK_UP,1);
::PostMessage(game,WM_KEYUP,VK_UP,1);
prior.Rotation();
//if(s_uTurnDelay>0)
// ::Sleep(s_uTurnDelay/4);
}
}
while(prior.GetStatus()!=nStatus);
if(s_uTurnDelay>0)
::Sleep(s_uTurnDelay);
QueryPerformanceCounter(&t1);
GetBlk(hsmdc);//(hDC);
QueryPerformanceCounter(&t2);
++cou;
add+=t2.QuadPart-t1.QuadPart;
TRACE1("\nExecute: %u",UINT(add)/cou);
while(s_CurBlock.GetType()<0 && ths->m_bpause==0)
{
//::Sleep(10);//避免脱机
GetBlk(hsmdc);//(hDC);
}
//机械移动
if(nMove<=0)
{
for(int i=0;i<(-nMove);i++)
{
::PostMessage(game,WM_KEYDOWN,VK_LEFT,1);
::PostMessage(game,WM_KEYUP,VK_LEFT,1);
}
}
else
{
for(int i=0;i<nMove;i++)
{
::PostMessage(game,WM_KEYDOWN,VK_RIGHT,1);
::PostMessage(game,WM_KEYUP,VK_RIGHT,1);
}
}
++count;
prior.Move(nMove);
while(prior.Down(Face));
for(int i=0;i<4;i++)
{
if(UINT(prior.m_pos[i].row)>m_uiTop)
m_uiTop=prior.m_pos[i].row;
Face[prior.m_pos[i].row][prior.m_pos[i].col]=1;
if(top[prior.m_pos[i].col]<UINT(prior.m_pos[i].row))
top[prior.m_pos[i].col]=UINT(prior.m_pos[i].row);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -