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

📄 chessview.cpp

📁 evc开发的五子棋游戏.是基于wince4.2开发的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -