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

📄 bbdlg.cpp

📁 有计算机图形学、图像处理、dbms、sniffer、中游俄罗斯外挂、othello、遗传算法、舌苔分析等程序。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -