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

📄 chessview.cpp

📁 evc开发的五子棋游戏.是基于wince4.2开发的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					{
						//下面位置可以下棋,旁边有两个黑棋
						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 + -