www.pudn.com > linkfive.rar > LinkFView.cpp


// LinkFView.cpp : implementation of the CLinkFView class 
// 
 
#include "stdafx.h" 
#include "LinkF.h" 
 
#include "LinkFDoc.h" 
#include "LinkFView.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CLinkFView 
 
IMPLEMENT_DYNCREATE(CLinkFView, CView) 
 
BEGIN_MESSAGE_MAP(CLinkFView, CView) 
	//{{AFX_MSG_MAP(CLinkFView) 
	ON_WM_ERASEBKGND() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_TIMER() 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CLinkFView construction/destruction 
 
CLinkFView::CLinkFView() 
{ 
	// TODO: add construction code here 
 
} 
 
CLinkFView::~CLinkFView() 
{ 
} 
 
BOOL CLinkFView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
 
	return CView::PreCreateWindow(cs); 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CLinkFView drawing 
 
void CLinkFView::OnDraw(CDC* pDC) 
{ 
	CLinkFDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
	int i,j; 
 
	CBrush* pOldBrush; 
	CBrush Red(RGB(255,0,0)); 
	CBrush Black(RGB(0,0,0)); 
	for(i=0;iBoard[i][j]==1)//玩家 
			{ 
				pOldBrush=pDC->SelectObject(&Red); 
				pDC->Ellipse(j*WIDTH-WIDTH/2+LEFT,i*WIDTH+TOP-WIDTH/2,j*WIDTH+WIDTH/2+LEFT,i*WIDTH+WIDTH/2+TOP); 
			} 
			else if(pDoc->Board[i][j]==2)//计算机 
			{ 
				pOldBrush=pDC->SelectObject(&Black); 
				pDC->Ellipse(j*WIDTH-WIDTH/2+LEFT,i*WIDTH+TOP-WIDTH/2,j*WIDTH+WIDTH/2+LEFT,i*WIDTH+WIDTH/2+TOP); 
			} 
		} 
 
	// TODO: add draw code for native data here 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CLinkFView printing 
 
BOOL CLinkFView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	return DoPreparePrinting(pInfo); 
} 
 
void CLinkFView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add extra initialization before printing 
} 
 
void CLinkFView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CLinkFView diagnostics 
 
#ifdef _DEBUG 
void CLinkFView::AssertValid() const 
{ 
	CView::AssertValid(); 
} 
 
void CLinkFView::Dump(CDumpContext& dc) const 
{ 
	CView::Dump(dc); 
} 
 
CLinkFDoc* CLinkFView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CLinkFDoc))); 
	return (CLinkFDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CLinkFView message handlers 
 
BOOL CLinkFView::OnEraseBkgnd(CDC* pDC)  
{ 
	// TODO: Add your message handler code here and/or call default 
	// Create a brush. 
	CBrush Brush (RGB (128 , 128 , 128) ); 
 
	// Select the brush into the device context . 
	CBrush* pOldBrush = pDC->SelectObject (&Brush);	 
 
	// Get the area that needs to be erased . 
	CRect reClip; 
	pDC->GetClipBox (&reClip); 
 
	//Paint the area. 
	pDC->PatBlt(reClip.left,reClip.top,reClip.Width ( ),reClip.Height( ),PATCOPY); 
 
	//Unselect brush out of device context . 
	pDC->SelectObject (pOldBrush ); 
	// Return nonzero to half fruther processing . 
	int i,j; 
	CBrush back(RGB(0,134,25)); 
	pOldBrush=pDC->SelectObject((CBrush*)&back); 
	CRect rect; 
	rect.left=LEFT-WIDTH/2; 
	rect.right=rect.left+(NUM-1)*WIDTH+WIDTH; 
	rect.top=TOP-WIDTH/2; 
	rect.bottom=rect.top+(NUM-1)*WIDTH+WIDTH; 
	pDC->FillRect(&rect,&back); 
 
	CPen pen(PS_SOLID,2,RGB(35,35,35)); 
	CPen* pOldPen=pDC->SelectObject(&pen); 
	for(i=0;iMoveTo(i*WIDTH+LEFT,TOP); 
		pDC->LineTo(i*WIDTH+LEFT,TOP+(NUM-1)*WIDTH); 
	} 
	for(j=0;jMoveTo(LEFT,j*WIDTH+TOP); 
		pDC->LineTo(LEFT+(NUM-1)*WIDTH,j*WIDTH+TOP); 
	} 
 
	CPen pen2(PS_SOLID,8,RGB(0,0,0)); 
	pDC->SelectObject(&pen2); 
	pDC->MoveTo(LEFT-WIDTH/2-4,TOP-WIDTH/2-4); 
	pDC->LineTo(LEFT+(NUM-1)*WIDTH+WIDTH/2+4,TOP-WIDTH/2-4); 
	pDC->MoveTo(LEFT-WIDTH/2-4,TOP+(NUM-1)*WIDTH+WIDTH/2+4); 
	pDC->LineTo(LEFT+(NUM-1)*WIDTH+WIDTH/2+4,TOP+(NUM-1)*WIDTH+WIDTH/2+4); 
	pDC->MoveTo(LEFT-WIDTH/2-4,TOP-WIDTH/2-4); 
	pDC->LineTo(LEFT-WIDTH/2-4,TOP+(NUM-1)*WIDTH+WIDTH/2+4); 
	pDC->MoveTo(LEFT+(NUM-1)*WIDTH+WIDTH/2+4,TOP-WIDTH/2-4); 
	pDC->LineTo(LEFT+(NUM-1)*WIDTH+WIDTH/2+4,TOP+(NUM-1)*WIDTH+WIDTH/2+4); 
 
 
 
	//CBrush guize(RGB (255 , 0 , 0)); 
	//pDC->SelectObject(&guize); 
	pDC->SetTextColor(RGB(255,255,0)); 
	pDC->SetBkColor(RGB(128,128,128)); 
	pDC->TextOut(20,TOP,CString(_T("规则:"))); 
	pDC->TextOut(20,TOP+25,CString(_T("黑、红双方先连"))); 
	pDC->TextOut(20,TOP+50,CString(_T("成5子者为胜,无"))); 
	pDC->TextOut(20,TOP+75,CString(_T("其它任何规则。"))); 
 
	pDC->SelectObject(pOldPen); 
	pDC->SelectObject(pOldBrush); 
 
	return TRUE; 
 
//	return CView::OnEraseBkgnd(pDC); 
} 
 
void CLinkFView::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
	CLinkFDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	if(IfGameWin()) 
		return; 
 
	PlayerY=(int)floor((point.x-(LEFT-WIDTH/2))/WIDTH); 
	PlayerX=(int)floor((point.y-(TOP-WIDTH/2))/WIDTH); 
	if(!(PlayerY<19&&PlayerY>=0&&PlayerX<19&&PlayerX>=0&&pDoc->Board[PlayerX][PlayerY]==0)) 
		return; 
	RefreshPlayer(); 
	if(IfGameWin()==1) 
		return; 
 
	ComputerThinking(); 
 
	RefreshComputer(); 
	if(IfGameWin()==2) 
		return; 
 
	CView::OnLButtonDown(nFlags, point); 
} 
 
void CLinkFView::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
	// TODO: Add your message handler code here and/or call default 
	CLinkFDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	if(number==0) 
	{ 
		KillTimer(nIDEvent); 
		return; 
	} 
	if(nIDEvent==1) 
	{ 
		CClientDC dc(this); 
		number--; 
	 
		number2=number2*(-1); 
		CBrush Brush(RGB(0-number2,0-number2,0-number2)); 
		dc.SelectObject(&Brush); 
		dc.Ellipse(ComputerY*WIDTH-WIDTH/2+LEFT,ComputerX*WIDTH+TOP-WIDTH/2,ComputerY*WIDTH+WIDTH/2+LEFT,ComputerX*WIDTH+WIDTH/2+TOP); 
	} 
	else 
	{ 
		CClientDC dc(this); 
		number--; 
		if(number==0) 
		{ 
			KillTimer(nIDEvent); 
			return; 
		} 
		number2=number2*(-1); 
		 
		for(int aa=0;aaComputerTable[aa][bb][pDoc->WinPoint]&&pDoc->WinPoint!=-1) 
				{ 
					CBrush Brush(RGB(0+number2,0+number2,0+number2)); 
					dc.SelectObject(&Brush); 
					dc.Ellipse(bb*WIDTH-WIDTH/2+LEFT,aa*WIDTH+TOP-WIDTH/2,bb*WIDTH+WIDTH/2+LEFT,aa*WIDTH+WIDTH/2+TOP); 
				} 
			} 
	} 
	CView::OnTimer(nIDEvent); 
} 
void CLinkFView::ComputerThinking() 
{ 
	CLinkFDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	PlayerGrade=0; 
	ComputerGrade=0; 
	 
	int i,j,k,mat,nat,mde,nde; 
 
	for(i=0;i<19;i++) 
		for(j=0;j<19;j++) 
		{ 
			PlayerGrades[i][j]=0; 
			if(pDoc->Board[i][j]==0) 
				for(k=0;k<1020;k++) 
					if(pDoc->PlayerTable[i][j][k]) 
					{ 
						switch(pDoc->PlayerScore[k]) 
						{ 
						case 1: 
							PlayerGrades[i][j]+=5; 
							break; 
						case 2: 
							PlayerGrades[i][j]+=50; 
							break; 
						case 3: 
							PlayerGrades[i][j]+=500; 
							break; 
						case 4: 
							PlayerGrades[i][j]+=5000; 
							break; 
						} 
					} 
		} 
	for(i=0;i<19;i++) 
		for(j=0;j<19;j++) 
		{ 
			ComputerGrades[i][j]=0; 
			if(pDoc->Board[i][j]==0) 
				for(k=0;k<1020;k++) 
					if(pDoc->ComputerTable[i][j][k]) 
					{ 
						switch(pDoc->ComputerScore[k]) 
						{ 
						case 1: 
							ComputerGrades[i][j]+=5; 
							break; 
						case 2: 
							ComputerGrades[i][j]+=50; 
							break; 
						case 3: 
							ComputerGrades[i][j]+=500; 
							break; 
						case 4: 
							ComputerGrades[i][j]+=500000; 
							break; 
						} 
					} 
		} 
	for(i=0;i<19;i++) 
			for(j=0;j<19;j++) 
				if(pDoc->Board[i][j]==0) 
				{ 
					if(ComputerGrades[i][j]>=ComputerGrade) 
					{ 
						ComputerGrade=ComputerGrades[i][j]; 
						mat=i; 
						nat=j; 
					} 
					if(PlayerGrades[i][j]>=PlayerGrade) 
					{ 
						PlayerGrade=PlayerGrades[i][j]; 
						mde=i; 
						nde=j; 
					} 
				} 
	if(ComputerGrade>=PlayerGrade) 
		{ 
			ComputerX=mat; 
			ComputerY=nat; 
		} 
		else 
		{ 
			ComputerX=mde; 
			ComputerY=nde; 
		} 
	 
	ComputerGrade=0; 
	PlayerGrade=0; 
} 
 
void CLinkFView::Draw(int a) 
{ 
 	CClientDC dc(this); 
 	CBrush PlayerRed(RGB(255,0,0)); 
 	CBrush ComputerBlack(RGB(0,0,0)); 
 	CBrush* pOldBrush; 
 
 	if(a==1)//玩家 
 	{ 
		pOldBrush=dc.SelectObject(&PlayerRed); 
 		dc.Ellipse(PlayerY*WIDTH-WIDTH/2+LEFT,PlayerX*WIDTH+TOP-WIDTH/2,PlayerY*WIDTH+WIDTH/2+LEFT,PlayerX*WIDTH+WIDTH/2+TOP); 
		 
 	} 
 	else if(a==2)//计算机 
 	{ 
 		pOldBrush=dc.SelectObject(&ComputerBlack); 
 		dc.Ellipse(ComputerY*WIDTH-WIDTH/2+LEFT,ComputerX*WIDTH+TOP-WIDTH/2,ComputerY*WIDTH+WIDTH/2+LEFT,ComputerX*WIDTH+WIDTH/2+TOP); 
 	} 
 
 	dc.SelectObject(pOldBrush); 
 
} 
int CLinkFView::IfGameWin() 
{ 
	CLinkFDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	if(pDoc->Over==1)//玩家赢 
	{	 
		AfxMessageBox("你小子真行啊,你赢了!"); 
		return 1; 
	} 
	if(pDoc->Over==2)//计算机赢 
	{ 
		AfxMessageBox("笨蛋一个,你输了!"); 
		number=14; 
		number2=255; 
		SetTimer(2,100,NULL); 
		return 2; 
	} 
	return 0; 
} 
 
void CLinkFView::RefreshPlayer() 
{ 
	CLinkFDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	int i; 
 
	pDoc->Board[PlayerX][PlayerY]=1; 
	Draw(1);//draw player	 
	for(i=0;i<1020;i++) 
	{ 
		if(pDoc->PlayerTable[PlayerX][PlayerY][i]&&pDoc->PlayerScore[i]!=7) 
			pDoc->PlayerScore[i]++; 
		if(pDoc->ComputerTable[PlayerX][PlayerY][i]) 
		{ 
			pDoc->ComputerTable[PlayerX][PlayerY][i]=false; 
			pDoc->ComputerScore[i]=7; 
		} 
	} 
 
	for(i=0;i<1020;i++) 
		if(pDoc->PlayerScore[i]==5) 
		{ 
			pDoc->WinPoint=i; 
			pDoc->Over=1; 
		} 
			 
} 
 
void CLinkFView::RefreshComputer() 
{ 
	CLinkFDoc* pDoc = GetDocument(); 
	ASSERT_VALID(pDoc); 
 
	int i; 
 
	pDoc->Board[ComputerX][ComputerY]=2; 
 
	Draw(2);//draw computer 
	for(i=0;i<1020;i++) 
	{ 
		if(pDoc->ComputerTable[ComputerX][ComputerY][i]&&pDoc->ComputerScore[i]!=7) 
			pDoc->ComputerScore[i]++; 
		if(pDoc->PlayerTable[ComputerX][ComputerY][i]) 
		{ 
			pDoc->PlayerTable[ComputerX][ComputerY][i]=false; 
			pDoc->PlayerScore[i]=7; 
		} 
	} 
 
	number=2; 
	number2=255; 
	SetTimer(1,150,NULL); 
 
	for(i=0;i<1020;i++) 
		if(pDoc->ComputerScore[i]==5) 
		{ 
			pDoc->WinPoint=i; 
			pDoc->Over=2; 
		} 
}