📄 chessview.cpp
字号:
{
//下面位置可以下棋,旁边有两个黑棋
bpointcan2.x=i+a;
bpointcan2.y=j;
}
//都是白棋
if(b==2)
{
wpointcan2.x=i+a;
wpointcan2.y=j;
}
}
//如果有三个空位置,说明另外两个同色
if(m==3)
{
for(a=0;a<5;a++)
//如果两个是黑棋
if(wzq[i+a][j]==-1)
{
for(b=0;b<5;b++)
//如果找到空位置
if(wzq[i+b][j]==0)
{
//下面位置可以下棋,旁边有两个黑棋
bpointcan2.x=i+b;
bpointcan2.y=j; break;
}
}
else
//如果两个是白棋
if(wzq[i+a][j]==1)
{
for(b=0;b<5;b++)
if(wzq[i+b][j]==0)
{
wpointcan2.x=i+b;
wpointcan2.y=j; break;
}
}
}
}
//////////////////////////// num[1] "|"
m=0;
if(n==1)
{
for(k=0;k<5;k++)
if(wzq[i][j+k]==0)
m++;
if(m==1)
for(a=0;a<5;a++)
if(wzq[i][j+a]==0)
{
b=wzq[i][j+a+1]+wzq[i][j+a+2];
if(b==-2)
{
bpointcan2.x=i;
bpointcan2.y=j+a;
}
if(b==2)
{
wpointcan2.x=i;
wpointcan2.y=j+a;
}
}
if(m==3)
{
for(a=0;a<5;a++)
if(wzq[i][j+a]==-1)
{
for(b=0;b<5;b++)
if(wzq[i][j+b]==0)
{
bpointcan2.x=i;
bpointcan2.y=j+b; break;
}
}
else
if(wzq[i][j+a]==1)
{
for(b=0;b<5;b++)
if(wzq[i][j+b]==0)
{
wpointcan2.x=i;
wpointcan2.y=j+b; break;
}
}
}
}
/////////////////////////////// num[2] "\"
m=0;
if(n==2)
{
for(k=0;k<5;k++)
if(wzq[i+k][j+k]==0)
m++;
if(m==1)
for(a=0;a<5;a++)
if(wzq[i+a][j+a]==0)
{
b=wzq[i+a+1][j+a+1]+wzq[i+a+2][j+a+2];
if(b==-2)
{
bpointcan2.x=i+a;
bpointcan2.y=j+a;
}
if(b==2)
{
wpointcan2.x=i+a;
wpointcan2.y=j+a;
}
}
if(m==3)
{
for(a=0;a<5;a++)
if(wzq[i+a][j+a]==-1)
{
for(b=0;b<5;b++)
if(wzq[i+b][j+b]==0)
{
bpointcan2.x=i+b;
bpointcan2.y=j+b; break;
}
}
else
if(wzq[i+a][j+a]==1)
{
for(b=0;b<5;b++)
if(wzq[i+b][j+b]==0)
{
wpointcan2.x=i+b;
wpointcan2.y=j+b; break;
}
}
}
}
////////////////////////////// num[3] "/"
m=0;
if(n==3)
{
for(k=0;k<5;k++)
if(wzq[i-k][j+k]==0)
m++;
if(m==1)
for(a=0;a<5;a++)
if(wzq[i-a][j+a]==0)
{
b=wzq[i-a-1][j+a+1]+wzq[i-a-2][j+a+2];
if(b==-2)
{
bpointcan2.x=i-a;
bpointcan2.y=j+a;
}
if(b==2)
{
wpointcan2.x=i-a;
wpointcan2.y=j+a;
}
}
if(m==3)
{
for(a=0;a<5;a++)
if(wzq[i-a][j+a]==-1)
{
for(b=0;b<5;b++)
if(wzq[i-b][j+b]==0)
{
bpointcan2.x=i-b;
bpointcan2.y=j+b; break;
}
}
else
if(wzq[i-a][j+a]==1)
{
for(b=0;b<5;b++)
if(wzq[i-b][j+b]==0)
{
wpointcan2.x=i-b;
wpointcan2.y=j+b; break;
}
}
}
}
}
//如果五个位置的和是一
void CChessView::searchcandown1(int i, int j, int n)
{
//计算刚才白棋落棋点
int ii=(vspoint.x-30)/20;
int jj=(vspoint.y-30)/20;
int a;
for(a=0;a<5;a++)
//如果不到边界
if(ii+a<19)
{
//向右,如果有空位置
if(wzq[ii+a][jj]==0)
{
//在这个位置下黑棋
bpointcan1.x=ii+a;
bpointcan1.y=jj;
return;
}
}
//到了边界
else
//向左,如果有空位置
if(wzq[ii-1][jj]==0)
{
bpointcan1.x=ii-a;
bpointcan1.y=jj;
return;
}
}
//vscomputer:2表示人对人,1表示人对机
void CChessView::OnPlayer()
{
// TODO: Add your command handler code here
vscomputer=2;
OnStart();
}
void CChessView::OnCpmputer()
{
// TODO: Add your command handler code here
vscomputer=1;
OnStart();
}
int CChessView::Judge(int nX, int nY, int cValue)
{
int nGrade;
int i, j, k, l;
int nXStart, nXEnd; // X轴
int nYStart, nYEnd; // Y轴
int nXYStart, nXYEnd; // XY轴(斜上)
int nYXStart, nYXEnd; // YX轴(斜下)
int nXStartAdd, nYStartAdd, nXYStartAdd, nYXStartAdd;
int nXEndAdd, nYEndAdd, nXYEndAdd, nYXEndAdd;
BOOL bXStartEmpty, bXEndEmpty, bXStartEmpty1, bXEndEmpty1;
BOOL bYStartEmpty, bYEndEmpty, bYStartEmpty1, bYEndEmpty1;
BOOL bXYStartEmpty, bXYEndEmpty, bXYStartEmpty1, bXYEndEmpty1;
BOOL bYXStartEmpty, bYXEndEmpty, bYXStartEmpty1, bYXEndEmpty1;
// 最新放置棋子的位置开始
nXStart = nXEnd = nX;
nYStart = nYEnd = nY;
nXYStart = nXYEnd = nX;
nYXStart = nYXEnd = nX;
// 增量为0
nXStartAdd = nYStartAdd = nXYStartAdd = nYXStartAdd = 0;
nXEndAdd = nYEndAdd = nXYEndAdd = nYXEndAdd = 0;
bXStartEmpty = bYStartEmpty = bXYStartEmpty = bYXStartEmpty = FALSE;
bXEndEmpty = bYEndEmpty = bXYEndEmpty = bYXEndEmpty = FALSE;
bXStartEmpty1 = bYStartEmpty1 = bXYStartEmpty1 = bYXStartEmpty1 = FALSE;
bXEndEmpty1 = bYEndEmpty1 = bXYEndEmpty1 = bYXEndEmpty1 = FALSE;
// 从下棋的位置向左搜寻
for (i=nX-1; i>=0; i--) // <-
{
if (wzq[i][nY]==cValue)
nXStart = i;
// 没有棋子
else if (wzq[i][nY]==0)
{
bXStartEmpty = TRUE;
for (j=i-1; j>=0; j--) // <-
{
if (wzq[j][nY]==cValue)
nXStartAdd = i-j;
else if (wzq[j][nY]==0)
{
bXStartEmpty1 = TRUE;
break;
}
else
break;
}
break;
}
else
break;
}
// 从下棋的位置向右搜寻
for (i=nX+1; i<BOARD_LINE_NUMBER; i++) // ->
{
if (wzq[i][nY]==cValue)
nXEnd = i;
else if (wzq[i][nY]==0)
{
bXEndEmpty = TRUE;
for (j=i+1; j<BOARD_LINE_NUMBER; j++) // ->
{
if (wzq[j][nY]==cValue)
nXEndAdd = j-i;
else if (wzq[j][nY]==0)
{
bXEndEmpty1 = TRUE;
break;
}
else
break;
}
break;
}
else
break;
}
// 从下棋的位置向上搜寻
for (i=nY-1; i>=0; i--) // ^|^
{
if (wzq[nX][i]==cValue)
nYStart = i;
else if (wzq[nX][i]==0)
{
bYStartEmpty = TRUE;
for (j=i-1; j>=0; j--) // <-
{
if (wzq[nX][j]==cValue)
nYStartAdd = i-j;
else if (wzq[nX][j]==0)
{
bYStartEmpty1 = TRUE;
break;
}
else
break;
}
break;
}
else
break;
}
// 从下棋的位置向下搜寻
for (i=nY+1; i<BOARD_LINE_NUMBER; i++) // v|v
{
if (wzq[nX][i]==cValue)
nYEnd = i;
else if (wzq[nX][i]==0)
{
bYEndEmpty = TRUE;
for (j=i+1; j<BOARD_LINE_NUMBER; j++) // ->
{
if (wzq[nX][j]==cValue)
nYEndAdd = j-i;
else if (wzq[nX][j]==0)
{
bYEndEmpty1 = TRUE;
break;
}
else
break;
}
break;
}
else
break;
}
// 从下棋的位置向左上搜寻
for (i=nX-1, j=nY+1; i>=0&&j<BOARD_LINE_NUMBER; i--, j++) // /'
{
//j++;
if (wzq[i][j]==cValue)
nXYStart = i;
else if (wzq[i][j]==0)
{
bXYStartEmpty = TRUE;
for (k=i-1, l=j+1; k>=0&&l<BOARD_LINE_NUMBER; k--, l++) // /'
{
if (wzq[k][l]==cValue)
nXYStartAdd = i-k;
else if (wzq[k][l]==0)
{
bXYStartEmpty1 = TRUE;
break;
}
else
break;
}
break;
}
else
break;
}
// 从下棋的位置向右下搜寻
for (i=nX+1, j=nY-1; i<BOARD_LINE_NUMBER&&j>=0; i++, j--) // ./
{
//j--;
if (wzq[i][j]==cValue)
nXYEnd = i;
else if (wzq[i][j]==0)
{
bXYEndEmpty = TRUE;
for (k=i+1, l=j-1; l>=0&&k<BOARD_LINE_NUMBER; l--, k++) // /'
{
if (wzq[k][l]==cValue)
nXYEndAdd = k-i;
else if (wzq[k][l]==0)
{
bXYEndEmpty1 = TRUE;
break;
}
else
break;
}
break;
}
else
break;
}
// 从下棋的位置向右下搜寻
for (i=nX-1, j=nY-1; i>=0&&j>=0; i--, j--) // '`
{
//j--;
if (wzq[i][j]==cValue)
nYXStart = i;
else if (wzq[i][j]==0)
{
bYXStartEmpty = TRUE;
for (k=i-1, l=j-1; k>=0&&l>=0; k--, l--) // /'
{
if (wzq[k][l]==cValue)
nYXStartAdd = i-k;
else if (wzq[k][l]==0)
{
bYXStartEmpty1 = TRUE;
break;
}
else
break;
}
break;
}
else
break;
}
// 从下棋的位置向右上搜寻
for (i=nX+1, j=nY+1; i<BOARD_LINE_NUMBER&&j<BOARD_LINE_NUMBER; i++, j++) // `.
{
//j++;
if (wzq[i][j]==cValue)
nYXEnd = i;
else if (wzq[i][j]==0)
{
bYXEndEmpty = TRUE;
for (k=i+1, l=j+1; l<BOARD_LINE_NUMBER&&k<BOARD_LINE_NUMBER; l++, k++) // /'
{
if (wzq[k][l]==cValue)
nYXEndAdd = k-i;
else if (wzq[k][l]==0)
{
bYXEndEmpty1 = TRUE;
break;
}
else
break;
}
break;
}
else
break;
}
// 连珠的个数
int nXStep = nXEnd-nXStart+1;
int nYStep = nYEnd-nYStart+1;
int nXYStep = nXYEnd-nXYStart+1;
int nYXStep = nYXEnd-nYXStart+1;
// 游戏结果
m_nType = -1;
// 存在胜的一方
if (nXStep>=5 || nYStep>=5 || nXYStep>=5 || nYXStep>=5)
m_nType = 0;
return m_nType;
}
void CChessView::OnSave()
{
CString tem="wzq";
/* TCHAR *pC1=(TCHAR*)(LPCTSTR)tem.GetBuffer(tem.GetLength());
char* pC2;
pC2=THCAR2char(pC1);*/
CString csTmp = "(*.WZQ)|*.wzq|All Files|*.*||";
CFileDialog dlg(FALSE,tem,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,csTmp,this);
//如果公共类对话框为确定
if(dlg.DoModal()==IDOK)
//获取文件名
dlg.GetFileName();
//否则,退出
else
{
MessageBox(L"shit!");
return;}
//字符串变量
CString str;
int i,j;
CStdioFile file;
//如果有问题,退出
if(file.Open(dlg.GetFileName(),CFile::modeCreate|CFile::modeWrite|CFile::typeText)==0)
{
MessageBox(_T("save error!"));
return;
}
//循环把棋盘数组的值写进文件
for(i=0;i<19;i++)
for(j=0;j<19;j++)
{
if(wzq[i][j]==-1)
file.Write("-1\n",2);
if(wzq[i][j]==0)
file.Write("0\n",2);
if(wzq[i][j]==1)
file.Write("1\n",2);
}
//保存当前下棋颜色
if(colorwhite==true)
file.Write("1\n",2);
else
file.Write("0\n",2);
//关闭文件
file.Close();
}
char* CChessView::THCAR2char(TCHAR *tchStr)
{
int iLen = 2*wcslen(tchStr);//CString,TCHAR汉字算一个字符,因此不用普通计算长度
char* chRtn = new char[iLen+1];
wcstombs(chRtn,tchStr,iLen+1);//转换成功返回为非负值
return chRtn;
}
void CChessView::OnOpen()
{
CString tem="wzq";
/* TCHAR *pC1=(TCHAR*)(LPCTSTR)tem.GetBuffer(tem.GetLength());
char* pC2;
pC2=THCAR2char(pC1);*/
CString csTmp = "(*.WZQ)|*.wzq|All Files|*.*||";
CFileDialog dlg(TRUE,tem,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,csTmp,this);
if(dlg.DoModal()==IDOK)
dlg.GetFileName();
else
return;
CString str;
int i,j,m;
CStdioFile file;
if(file.Open(dlg.GetFileName(),CFile::modeRead)==0)
{
MessageBox(L"save error!");
return;
}
CArchive ar(&file,CArchive::load);
for(i=0;i<19;i++)
for(j=0;j<19;j++)
{
ar.ReadString(str);
m=_wtoi(str);
if(m==-1)
wzq[i][j]=-1;
if(m==0)
wzq[i][j]=0;
if(m==1)
wzq[i][j]=1;
}
ar.ReadString(str);
m=_wtoi(str);
if(m==1)
colorwhite=true;
else
colorwhite=false;
file.Close();
ar.Close();
Invalidate(false);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -