📄 chessview.cpp
字号:
// chessView.cpp : implementation of the CChessView class
//
#include "stdafx.h"
#include "chess.h"
#include "chessDoc.h"
#include "chessView.h"
#include "MainFrm.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CChessView
IMPLEMENT_DYNCREATE(CChessView, CView)
BEGIN_MESSAGE_MAP(CChessView, CView)
//{{AFX_MSG_MAP(CChessView)
ON_WM_LBUTTONUP()
ON_WM_SETCURSOR()
ON_COMMAND(ID_START, OnStart)
ON_COMMAND(ID_PLAYER, OnPlayer)
ON_COMMAND(ID_CPMPUTER, OnCpmputer)
ON_COMMAND(ID_SAVE, OnSave)
ON_COMMAND(ID_LOAD, OnOpen)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CChessView construction/destruction
CChessView::CChessView()
{
// TODO: add construction code here
hcursorblack=AfxGetApp()->LoadCursor(IDC_CURSOR1);
hcursorwhite=AfxGetApp()->LoadCursor(IDC_CURSOR2);
m_bmwhite.LoadBitmap(IDB_WHITE);
m_bmblack.LoadBitmap(IDB_BLACK);
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
wzq[i][j]=0;
colorwhite=true;
//默认为人对机
vscomputer=1;
}
CChessView::~CChessView()
{
}
BOOL CChessView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CChessView drawing
void CChessView::OnDraw(CDC* pDC)
{
CChessDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//画背景
CBrush mybrush1;
mybrush1.CreateSolidBrush(RGB(192,192,192));
CRect myrect1(0,0,1200,800);
pDC->FillRect(myrect1,&mybrush1);
CBrush mybrush;
mybrush.CreateSolidBrush(RGB(0,0,0));
for(int a=0;a<3;a++)
for(int b=0;b<3;b++)
{
CRect myrect(97+a*120,97+b*120,103+a*120,103+b*120);
pDC->FillRect(myrect,&mybrush);
}
//画黑框线
CPen mypen;
CPen*myoldPen;
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
myoldPen=pDC->SelectObject(&mypen);
for(int i=0;i<19;i++)
{
pDC->MoveTo(40,40+i*20);
pDC->LineTo(400,40+i*20);
pDC->MoveTo(40+i*20,40);
pDC->LineTo(40+i*20,400);
}
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
// AfxMessageBox("Can't create DC");
MessageBox(_T("Can't create DC"));
for(int n=0;n<19;n++)
for(int m=0;m<19;m++)
if(wzq[n][m]==1)
{
Dc.SelectObject(m_bmwhite);
pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);
}
else if(wzq[n][m]==-1)
{
Dc.SelectObject(m_bmblack);
pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);
}
}
/////////////////////////////////////////////////////////////////////////////
// CChessView printing
BOOL CChessView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CChessView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CChessView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CChessView diagnostics
#ifdef _DEBUG
void CChessView::AssertValid() const
{
CView::AssertValid();
}
void CChessView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CChessDoc* CChessView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CChessDoc)));
return (CChessDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CChessView message handlers
void CChessView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
// AfxMessageBox("Can't create DC");
MessageBox(_T("Can't create DC"));
//显示棋子
/////////////////////人对机
if(vscomputer==1)
{
if(point.x>30&&point.x<410&&point.y>30&&point.y<410)
{
int px=(point.x-30)/20;
int py=(point.y-30)/20;
if(colorwhite&&wzq[px][py]==0)
{
Dc.SelectObject(m_bmwhite);
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);
wzq[px][py]=1;
over(point);
colorwhite=false;
//保存白棋位置
vspoint=point;
//计算机下棋
computerdown();
}
}
}
//人对人
if(vscomputer==2)
{
if(point.x>30&&point.x<410&&point.y>30&&point.y<410)
{
int px=(point.x-30)/20;
int py=(point.y-30)/20;
if(colorwhite&&wzq[px][py]==0)
{
Dc.SelectObject(m_bmwhite);
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);
wzq[px][py]=1;
over(point);
colorwhite=false;
}
else if(wzq[px][py]==0)
{
Dc.SelectObject(m_bmblack);
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);
wzq[px][py]=-1;
over(point);
colorwhite=true;
}
}
}
CView::OnLButtonUp(nFlags, point);
}
BOOL CChessView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
// TODO: Add your message handler code here and/or call default
if(nHitTest==HTCLIENT)
{
if(colorwhite)
{
CMainFrame*pFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CStatusBar*pStatus=&pFrm->m_wndStatusBar;
SetCursor(hcursorwhite);
}
else
{
CMainFrame*pFrm=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CStatusBar*pStatus=&pFrm->m_wndStatusBar;
SetCursor(hcursorblack);
}
return 1;
}
return CView::OnSetCursor(pWnd, nHitTest, message);
}
void CChessView::over(CPoint point)
{
//获取鼠标指向数组位置
int x=(point.x-30)/20;
int y=(point.y-30)/20;
Judge(x, y, wzq[x][y]);
if (m_nType == 0)
{
if(colorwhite)MessageBox(_T("白棋胜!"));
else AfxMessageBox(_T("黑棋胜!"));
OnStart();
return;
}
}
void CChessView::OnStart()
{
// TODO: Add your command handler code here
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
wzq[i][j]=0;
colorwhite=true;
Invalidate();
}
//黑棋下
void CChessView::putdown(CPoint point)
{
CDC *pDC=GetDC();
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
MessageBox(_T("Can't create DC"));
Dc.SelectObject(m_bmblack);
pDC->BitBlt(point.x*20+32,point.y*20+32,160,160,&Dc,0,0,SRCCOPY);
wzq[point.x][point.y]=-1;
//变数组坐标为棋盘坐标
CPoint overpoint;
overpoint.x=point.x*20+30;
overpoint.y=point.y*20+30;
over(overpoint);
colorwhite=true;
}
//轮到计算机下棋
void CChessView::computerdown()
{
//把各种情形赋值为如下
bpointcan4=(-1,-1);
wpointcan4=(-1,-1);
bpointcan3=(-1,-1);
wpointcan3=(-1,-1);
bpointcan2=(-1,-1);
wpointcan2=(-1,-1);
bpointcan1=(-1,-1);
//搜索最好的落棋点
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
bestputdown(i,j);
//判断放在哪里
//棋多的位置优先
//黑白一样多时黑先
if(bpointcan4.x!=-1)
{
putdown(bpointcan4);
return;
}
else if(wpointcan4.x!=-1)
{
putdown(wpointcan4);
return;
}
else if(bpointcan3.x!=-1)
{
putdown(bpointcan3);
return;
}
else if(wpointcan3.x!=-1)
{
putdown(wpointcan3);
return;
}
else if(bpointcan2.x!=-1)
{
putdown(bpointcan2);
return;
}
else if(wpointcan2.x!=-1)
{
putdown(wpointcan2);
return;
}
else
{
putdown(bpointcan1);
return;
}
}
//检查四个方向,各算出五个棋子的和并赋值
void CChessView::bestputdown(int i,int j)
{
int num[4];
CPoint numbig;
int a,k;
/////////////////////////////// num[0] -->
a=0;
if(i<15)
for(k=0;k<5;k++)
a=a+wzq[i+k][j];
num[0]=abs(a);
////////////////////////////// num[1] "|"
a=0;
if(j<15)
for(k=0;k<5;k++)
a=a+wzq[i][j+k];
num[1]=abs(a);
/////////////////////////////// num[2] "\"
a=0;
if(i<15&&j<15)
for(k=0;k<5;k++)
a=a+wzq[i+k][j+k];
num[2]=abs(a);
////////////////////////////// num[3] "/"
a=0;
if((i>4)&&(j<15))
for(k=0;k<5;k++)
a=a+wzq[i-k][j+k];
num[3]=abs(a);
//比较哪个方向同色棋最多
numbig=maxnum(num[0],num[1],num[2],num[3]);
//在得到最大值和方向上寻找落棋点
switch(numbig.y)
{
case 4:
searchcandown4(i,j,numbig.x);break;
case 3:
searchcandown3(i,j,numbig.x);break;
case 2:
searchcandown2(i,j,numbig.x);break;
default:
searchcandown1(i,j,numbig.x);
}
}
CPoint CChessView::maxnum(int a, int b, int c, int d)
{
//point.x为方向值
//point.y为最大值
CPoint point;
if(a>=b)
{
point.x=0;
point.y=a;
}
else
{
point.x=1;
point.y=b;
}
if(c>point.y)
{
point.x=2;
point.y=c;
}
if(d>point.y)
{
point.x=3;
point.y=d;
}
return point;
}
//有四个同色棋
void CChessView::searchcandown4(int i, int j, int n)
{
// CPoint point;
int k;
///////////////////////////// num[0] "--"
if(n==0)
for(k=0;k<5;k++)
//如果第一个是空
if(wzq[i][j]==0)
{
//如果下面有白棋
if(wzq[i+1][j]==1)
{
//下面位置可以下棋,已经有四个白棋
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
//下面位置可以下棋,已经有四个黑棋
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
}
//如果找到下棋位置,一定能找到!
else if(wzq[i+k][j]==0)
{
//如果第一个是白棋
if(wzq[j][j]==1)
{
wpointcan4.x=i+k;
wpointcan4.y=j;
break;
}
//否则第一个是黑棋
else
{
bpointcan4.x=i+k;
bpointcan4.y=j;
break;
}
}
//////////////////////////// num[1] "|"
if(n==1)
for(k=0;k<5;k++)
{
if(wzq[i][j]==0)
if(wzq[i][j+1]==1)
{
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
else if(wzq[i][j+k]==0)
{
if(wzq[i][j]==1)
{
wpointcan4.x=i;
wpointcan4.y=j+k;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j+k;
break;
}
}
}
/////////////////////////////// num[2] "\"
if(n==2)
for(k=0;k<5;k++)
{
if(wzq[i][j]==0)
if(wzq[i+1][j+1]==1)
{
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
else if(wzq[i+k][j+k]==0)
{
if(wzq[i][j]==1)
{
wpointcan4.x=i+k;
wpointcan4.y=j+k;
break;
}
else
{
bpointcan4.x=i+k;
bpointcan4.y=j+k;
break;
}
}
}
////////////////////////////// num[3] "/"
if(n==3)
for(k=0;k<5;k++)
{
if(wzq[i][j]==0)
if(wzq[i-1][j+1]==1)
{
wpointcan4.x=i;
wpointcan4.y=j;
break;
}
else
{
bpointcan4.x=i;
bpointcan4.y=j;
break;
}
else if(wzq[i-k][j+k]==0)
{
if(wzq[i][j]==1)
{
wpointcan4.x=i-k;
wpointcan4.y=j+k;
break;
}
else
{
bpointcan4.x=i-k;
bpointcan4.y=j+k;
break;
}
}
}
}
//最多有三个同色
void CChessView::searchcandown3(int i, int j, int n)
{
int k=0;
///////////////////////////// num[0] "--"
if(n==0)
for(k=0;k<5;k++)
//找到位置
if(wzq[i+k][j]==0)
{
//下一个是白棋
if(wzq[i+k+1][j]==1)
{
//下面位置可以下棋,已经有三个白棋
wpointcan3.x=i+k;
wpointcan3.y=j;
}
//下一个是黑棋
else if(wzq[i+k+1][j]==-1)
{
bpointcan3.x=i+k;
bpointcan3.y=j;
}
}
//////////////////////////// num[1] "|"
if(n==1)
for(k=0;k<5;k++)
if(wzq[i][j+k]==0)
{
if(wzq[i][j+k-1]==1)
{
wpointcan3.x=i;
wpointcan3.y=j+k;
}
else if(wzq[i][j+k+1]==-1)
{
bpointcan3.x=i;
bpointcan3.y=j+k;
}
}
/////////////////////////////// num[2] "\"
if(n==2)
for(k=0;k<5;k++)
if(wzq[i+k][j+k]==0)
{
if(wzq[i+k+1][j+k+1]==1)
{
wpointcan3.x=i+k;
wpointcan3.y=j+k;
}
else if(wzq[i+k+1][j+k+1]==-1)
{
bpointcan3.x=i+k;
bpointcan3.y=j+k;
}
}
////////////////////////////// num[3] "/"
if(n==3)
for(k=0;k<5;k++)
if(wzq[i-k][j+k]==0)
{
if(wzq[i-k-1][j+k+1]==1)
{
wpointcan3.x=i-k;
wpointcan3.y=j+k;
}
else if(wzq[i-k-1][j+k+1]==-1)
{
bpointcan3.x=i-k;
bpointcan3.y=j+k;
}
}
}
//最多有两个同色
void CChessView::searchcandown2(int i, int j, int n)
{
int k=0,m=0,a=0,b=0;
///////////////////////////// num[0] "--"
if(n==0)
{
//判断有多少个空位置
for(k=0;k<5;k++)
if(wzq[i+k][j]==0)
m+=1;
//如果只有一个空位置
if(m==1)
for(a=0;a<5;a++)
//找到空位置
if(wzq[i+a][j]==0)
{
//下面两个棋子值的和
b=wzq[i+a+1][j]+wzq[i+a+2][j];
//都是黑棋
if(b==-2)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -