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

📄 linkfview.cpp

📁 五子棋核心算法,一级完整的应用程序演示
💻 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;i<NUM;i++)
		for(j=0;j<NUM;j++)
		{
			if(pDoc->Board[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;i<NUM;i++)
	{
		pDC->MoveTo(i*WIDTH+LEFT,TOP);
		pDC->LineTo(i*WIDTH+LEFT,TOP+(NUM-1)*WIDTH);
	}
	for(j=0;j<NUM;j++)
	{
		pDC->MoveTo(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;aa<NUM;aa++)
			for(int bb=0;bb<NUM;bb++)
			{			
				if(pDoc->ComputerTable[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;
		}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -