📄 人机对战五子棋trydoc.cpp
字号:
// 人机对战五子棋tryDoc.cpp : implementation of the CTryDoc class
//
#include "stdafx.h"
#include "人机对战五子棋try.h"
#include "人机对战五子棋tryDoc.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTryDoc
IMPLEMENT_DYNCREATE(CTryDoc, CDocument)
BEGIN_MESSAGE_MAP(CTryDoc, CDocument)
//{{AFX_MSG_MAP(CTryDoc)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTryDoc construction/destruction
CTryDoc::CTryDoc()
{
// TODO: add one-time construction code here
ResetData();
}
CTryDoc::~CTryDoc()
{
}
BOOL CTryDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CTryDoc serialization
void CTryDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CTryDoc diagnostics
#ifdef _DEBUG
void CTryDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CTryDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CTryDoc commands
int CTryDoc::GetCondition(int i, int j)
{
return condition[i][j];
}
void CTryDoc::SetCondition(int i, int j, int value)
{
condition[i][j]=value;
}
CPoint CTryDoc::ComputerThink2()
{
CPoint point;
int max1=0,max2=0,max_x,max_y;
int sco1_nesw[15][15];
int sco1_ns[15][15];
int sco1_nwse[15][15];
int sco1_we[15][15];
int sco2_nesw[15][15];
int sco2_ns[15][15];
int sco2_nwse[15][15];
int sco2_we[15][15];
int i,j,m,n,k1,k2;
for(i=0;i<15;i++)
for(j=0;j<15;j++)
{
sco1_nesw[i][j]=0;
sco1_ns[i][j]=0;
sco1_nwse[i][j]=0;
sco1_we[i][j]=0;
sco2_nesw[i][j]=0;
sco2_ns[i][j]=0;
sco2_nwse[i][j]=0;
sco2_we[i][j]=0;
sco_nesw[i][j]=0;
sco_ns[i][j]=0;
sco_nwse[i][j]=0;
sco_we[i][j]=0;
sco[i][j]=0;
direction1[i][j]=0;
direction2[i][j]=0;
direction[i][j]=0;
}
for(i=0;i<15;i++)
for(j=0;j<15;j++)
{
///////////////////////////////////////////nwse////////////////////////////////////
isadded=FALSE;
if(condition[i][j]==EMPTY) //se-defend
{
for(m=i+1,n=j+1,k1=0;m<=i+5&&m<15&&n<15&&condition[m][n]==PEOPLE;m++,n++,k1++)
{
sco1_nwse[i][j]+=5;
direction1[i][j]++;
}
while(m<15&&n<15&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco1_nwse[i][j]+=2;
isadded=TRUE;
}
k1++;
m++;
n++;
}
}
isadded=FALSE;
if(condition[i][j]==EMPTY) //nw-defend
{
for(m=i-1,n=j-1,k2=0;m>=i-5&&m>=0&&n>=0&&condition[m][n]==PEOPLE;m--,n--,k2++)
{
sco1_nwse[i][j]+=5;
direction1[i][j]++;
}
while(m>=0&&n>=0&&condition[m][n]==EMPTY)
{
if(isadded=FALSE)
{
sco1_nwse[i][j]+=2;
isadded=TRUE;
}
k2++;
m--;
n--;
}
}
if(k1+k2<4) sco1_nwse[i][j]=0;
isadded=FALSE;
if(condition[i][j]==EMPTY) //se-attack
{
for(m=i+1,n=j+1,k1=0;m<=i+5&&m<15&&n<15&&condition[m][n]==COMPUTER;m++,n++,k1++)
{
sco2_nwse[i][j]+=5;
direction2[i][j]++;
}
while(m<15&&n<15&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco2_nwse[i][j]+=2;
isadded=TRUE;
}
k1++;
m++;
n++;
}
}
isadded=FALSE;
if(condition[i][j]==EMPTY) //nw-attack
{
for(m=i-1,n=j-1,k2=0;m>=i-5&&m>=0&&n>=0&&condition[m][n]==COMPUTER;m--,n--,k2++)
{
sco2_nwse[i][j]+=5;
direction2[i][j]++;
}
while(m>=0&&n>=0&&condition[m][n]==EMPTY)
{
if(isadded=FALSE)
{
sco2_nwse[i][j]+=2;
isadded=TRUE;
}
k2++;
m--;
n--;
}
}
if(k1+k2<4) sco2_nwse[i][j]=0;
sco_nwse[i][j]=maxx(sco1_nwse[i][j],sco2_nwse[i][j]);
////////////////////////////////////ns/////////////////////////////////////////////
isadded=FALSE;
if(condition[i][j]==EMPTY) //s-defend
{
for(m=i+1,n=j,k1=0;m<=i+5&&m<15&&condition[m][n]==PEOPLE;m++,k1++)
{
sco1_ns[i][j]+=5;
direction1[i][j]++;
}
while(m<15&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco1_ns[i][j]+=2;
isadded=TRUE;
}
k1++;
m++;
}
}
isadded=FALSE;
if(condition[i][j]==EMPTY) //n-defend
{
for(m=i-1,n=j,k2=0;m>=i-5&&m>=0&&condition[m][n]==PEOPLE;m--,k2++)
{
sco1_ns[i][j]+=5;
direction1[i][j]++;
}
while(m>=0&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco1_ns[i][j]+=2;
isadded=TRUE;
}
k2++;
m--;
}
}
if(k1+k2<4) sco1_ns[i][j]=0;
isadded=FALSE;
if(condition[i][j]==EMPTY) //s-attack
{
for(m=i+1,n=j,k1=0;m<=i+5&&m<15&&condition[m][n]==COMPUTER;m++,k1++)
{
sco2_ns[i][j]+=5;
direction2[i][j]++;
}
while(m<15&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco2_ns[i][j]+=2;
isadded=TRUE;
}
k1++;
m++;
}
}
isadded=FALSE;
if(condition[i][j]==EMPTY) //n-attack
{
for(m=i-1,n=j,k2=0;m>=i-5&&m>=0&&condition[m][n]==COMPUTER;m--,k2++)
{
sco2_ns[i][j]+=5;
direction2[i][j]++;
}
while(m>=0&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco2_ns[i][j]+=2;
isadded=TRUE;
}
k2++;
m--;
}
}
if(k1+k2<4) sco2_ns[i][j]=0;
sco_ns[i][j]=maxx(sco1_ns[i][j],sco2_ns[i][j]);
//////////////////////////////////////we//////////////////////////////////////////
isadded=FALSE;
if(condition[i][j]==EMPTY) //e-defend
{
for(m=i,n=j+1,k1=0;n<=j+5&&n<15&&condition[m][n]==PEOPLE;n++,k1++)
{
sco1_we[i][j]+=5;
direction1[i][j]++;
}
while(n<15&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco1_we[i][j]+=2;
isadded=TRUE;
}
k1++;
n++;
}
}
if(condition[i][j]==EMPTY) //w-defend
{
for(m=i,n=j-1,k2=0;n>=j-5&&n>=0&&condition[m][n]==PEOPLE;n--,k2++)
{
sco1_we[i][j]+=5;
direction1[i][j]++;
}
while(n>=0&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco1_we[i][j]+=2;
isadded=TRUE;
}
k2++;
n--;
}
}
if(k1+k2<4) sco1_we[i][j]=0;
isadded=FALSE;
if(condition[i][j]==EMPTY) //e-attack
{
for(m=i,n=j+1,k1=0;n<=j+5&&n<15&&condition[m][n]==COMPUTER;n++,k1++)
{
sco2_we[i][j]+=5;
direction2[i][j]++;
}
while(n<15&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco2_we[i][j]+=2;
isadded=TRUE;
}
k1++;
n++;
}
}
isadded=FALSE;
if(condition[i][j]==EMPTY) //w-attack
{
for(m=i,n=j-1,k2=0;n>=j-5&&n>=0&&condition[m][n]==COMPUTER;n--,k2++)
{
sco2_we[i][j]+=5;
direction2[i][j]++;
}
while(n>=0&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco2_we[i][j]+=2;
isadded=TRUE;
}
k2++;
n--;
}
}
if(k1+k2<4) sco2_we[i][j]=0;
sco_we[i][j]=maxx(sco1_we[i][j],sco2_we[i][j]);
//////////////////////////////////nesw////////////////////////////////////////////
isadded=FALSE;
if(condition[i][j]==EMPTY) //sw-defend
{
for(m=i+1,n=j-1,k1=0;n>=j-5&&m<15&&n>=0&&condition[m][n]==PEOPLE;m++,n--,k1++)
{
sco1_nesw[i][j]+=5;
direction1[i][j]++;
}
while(m<15&&n>=0&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco1_nesw[i][j]+=2;
isadded=TRUE;
}
k1++;
m++;
n--;
}
}
isadded=FALSE;
if(condition[i][j]==EMPTY) //ne-defend
{
for(m=i-1,n=j+1,k2=0;n<=j+4&&m>=0&&n<15&&condition[m][n]==PEOPLE;m--,n++,k2++)
{
sco1_nesw[i][j]+=5;
direction1[i][j]++;
}
while(m>=0&&n<15&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco1_nesw[i][j]+=2;
isadded=TRUE;
}
k2++;
m--;
n++;
}
}
if(k1+k2<4) sco1_nesw[i][j]=0;
isadded=FALSE;
if(condition[i][j]==EMPTY) //sw-attack
{
for(m=i+1,n=j-1,k1=0;n>=j-5&&m<15&&n>=0&&condition[m][n]==COMPUTER;m++,n--,k1++)
{
sco2_nesw[i][j]+=5;
direction2[i][j]++;
}
while(m<15&&n>=0&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco2_nesw[i][j]+=2;
isadded=TRUE;
}
k1++;
m++;
n--;
}
}
isadded=FALSE;
if(condition[i][j]==EMPTY) //ne-attack
{
for(m=i-1,n=j+1,k2=0;n<=j+4&&m>=0&&n<15&&condition[m][n]==COMPUTER;m--,n++,k2++)
{
sco2_nesw[i][j]+=5;
direction2[i][j]++;
}
while(m>=0&&n<15&&condition[m][n]==EMPTY)
{
if(isadded==FALSE)
{
sco2_nesw[i][j]+=2;
isadded=TRUE;
}
k2++;
m--;
n++;
}
}
if(k1+k2<4) sco2_nesw[i][j]=0;
sco_nesw[i][j]=maxx(sco1_nesw[i][j],sco2_nesw[i][j]);
sco[i][j]=maxx(sco_nesw[i][j],sco_ns[i][j],sco_nwse[i][j],sco_we[i][j]);
if(this->maxx(sco_nesw[i][j],sco_ns[i][j],sco_nwse[i][j],sco_we[i][j])>max1)
{
max1=this->maxx(sco_nesw[i][j],sco_ns[i][j],sco_nwse[i][j],sco_we[i][j]);
}
direction[i][j]=maxx(direction1[i][j],direction2[i][j]);
}
for(i=0;i<15;i++)
for(j=0;j<15;j++)
{
if(sco[i][j]==max1&&direction[i][j]>max2)
{
max_x=i;
max_y=j;
}
}
point.x=max_x;
point.y=max_y;
number++; //记录电脑走的步数
return point;
}
/*
CPoint CTryDoc::ComputerThink1()
{
CPoint point;
int max1=0,max1_x,max1_y;
int sco1_nesw[15][15];
int sco1_ns[15][15];
int sco1_nwse[15][15];
int sco1_we[15][15];
int sco2_nesw[15][15];
int sco2_ns[15][15];
int sco2_nwse[15][15];
int sco2_we[15][15];
int i,j,m,n,count,k1,k2;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -