📄 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;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 + -