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

📄 jingziqiview.cpp

📁 井字棋
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// JingZiQiView.cpp : implementation of the CJingZiQiView class
//
#include "stdafx.h"
#include "JingZiQi.h"

#include "JingZiQiDoc.h"
#include "JingZiQiView.h"
#include "MainFrm.h"

//#define TCOLOR RGB(128,255,128)
//#define BCOLOR RGB(40,48,180)
#define TCOLOR RGB(0,248,0)
#define TCOLOR2 RGB(255,255,255)
#define BCOLOR RGB(80,64,79)
//#define BCOLOR RGB(63,32,31)
//#define BCOLOR RGB(78,49,49)
//#define BGROUND RGB(153,104,64)
//#define BGROUND RGB(47,32,63)
//#define BGROUND RGB(100,73,95)
//#define BGROUND RGB(63,32,31)
//#define BGROUND RGB(112,88,79)
//#define BGROUND RGB(112,72,64)
//#define BGROUND RGB(79,64,64)
//#define BGROUND RGB(89,56,55)
//#define BGROUND RGB(63,30,0)
//#define BGROUND RGB(207,144,32)
#define BGROUND RGB(209,146,34)

//RGB(189,91,1)

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


/////////////////////////////////////////////////////////////////////////////
// CJingZiQiView

IMPLEMENT_DYNCREATE(CJingZiQiView, CView)

BEGIN_MESSAGE_MAP(CJingZiQiView, CView)
	//{{AFX_MSG_MAP(CJingZiQiView)
	ON_WM_SETCURSOR()
	ON_WM_LBUTTONUP()
	ON_COMMAND(ID_Start, OnStart)
	ON_WM_TIMER()
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CJingZiQiView construction/destruction

CJingZiQiView::CJingZiQiView()
{
	// TODO: add construction code here
	//CurBlack=::LoadCursor(AfxGetInstanceHandle(),
	//MAKEINTRESOURCE(IDC_CURSOR1));
	
	CurBlack=AfxGetApp()->LoadCursor(IDC_CURSOR2);
	m_bmRed.LoadBitmap(IDB_BITMAP15);//(IDB_BITMAP12);
	m_bmBlack.LoadBitmap(IDB_BITMAP14);//(IDB_BITMAP9);
	for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
		{
			QP[i][j]=0;
			pre_qp[i][j]=0;
		}
	man_turn=1;
	cmptfirst=false;
	Level=1;
	mode=1;
	IsServer=false;
	over=0;
	requ_reply=true;
}

CJingZiQiView::~CJingZiQiView()
{
}

BOOL CJingZiQiView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CJingZiQiView drawing

void CJingZiQiView::OnDraw(CDC* pDC)
{
	CJingZiQiDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	
	//画背景
	CBrush mybrush;
	mybrush.CreateSolidBrush(BGROUND);
	CRect myrect(0,0,1200,800);
	pDC->FillRect(myrect,&mybrush);
	mybrush.DeleteObject();
	//画棋盘
	CPen *oldpen,mypen;
	
	mypen.CreatePen(PS_SOLID,1,RGB(255,255,255));
	oldpen=pDC->SelectObject(&mypen);
	for(int i=0;i<4;i++)
	{
		pDC->MoveTo(60,60+i*60);
		pDC->LineTo(240,60+i*60);
		pDC->MoveTo(60+i*60,60);
		pDC->LineTo(60+60*i,240);
	}
	pDC->SelectObject(oldpen);

	//画棋子
	CDC DC;
	if(DC.CreateCompatibleDC(pDC)==FALSE)
		AfxMessageBox("Fail to create DC!");
	for(i=0;i<3;i++)
		for(int j=0;j<3;j++)
			if(QP[i][j]==1)
			{
				DC.SelectObject(m_bmBlack);
				pDC->BitBlt(64+i*60,64+j*60,60,60,&DC,0,0,SRCCOPY);
			}
			else if(QP[i][j]==-1)
			{
				DC.SelectObject(m_bmRed);
				pDC->BitBlt(64+i*60,64+j*60,60,60,&DC,0,0,SRCCOPY);
			}

	ShowState();
	
}

/////////////////////////////////////////////////////////////////////////////
// CJingZiQiView printing

BOOL CJingZiQiView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CJingZiQiView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CJingZiQiView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CJingZiQiView diagnostics

#ifdef _DEBUG
void CJingZiQiView::AssertValid() const
{
	CView::AssertValid();
}

void CJingZiQiView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CJingZiQiDoc* CJingZiQiView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CJingZiQiDoc)));
	return (CJingZiQiDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CJingZiQiView message handlers

BOOL CJingZiQiView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// TODO: Add your message handler code here and/or call default
	if(nHitTest==HTCLIENT)
	{
		if(mode==1)
		{
			if(man_turn)
			{
		
				SetCursor(CurBlack);
//				SetCursor(LoadCursor(NULL,IDC_CROSS));//显示十字形光标
				return 1;
			}
		}
		else if(mode==2)
		{
			if(man_turn&&(!IsServer))
			{
				SetCursor(CurBlack);
				return 1;
			}
			else if(IsServer&&(!man_turn))
			{
				SetCursor(CurBlack);
				return 1;
			}
		}
	}

	return CView::OnSetCursor(pWnd, nHitTest, message);
}

//DEL void CJingZiQiView::OnMouseMove(UINT nFlags, CPoint point) 
//DEL {
//DEL 	// TODO: Add your message handler code here and/or call default
//DEL /*	CRect rect(100,100,500,500);//定一一个改变光标的范围
//DEL 
//DEL 	if(rect.PtInRect(point))//鼠标当前位置在矩形范围内
//DEL 
//DEL 	{
//DEL 
//DEL 		SetCursor(LoadCursor(NULL,IDC_CROSS));//显示十字形光标
//DEL 
//DEL 	}*/
//DEL 
//DEL 	
//DEL 	CView::OnMouseMove(nFlags, point);
//DEL }

void CJingZiQiView::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	int x,y,px,py;
	
	x=point.x;
	y=point.y;
	
	CDC *pDC=GetDC();
	CDC DC;
	if(DC.CreateCompatibleDC(pDC)==FALSE)
		MessageBox("fail to create DC!");
	
	//人机对弈
	if(mode==1&&!over)
	{
		KillTimer(1);
		if((x>60)&&(x<240)&&(y>60)&&(y<240))
		{
			px=(x-60)/60;
			py=(y-60)/60;
			if(man_turn&&(QP[px][py]==0))
			{
				for(int k=0;k<3;k++)
					for(int l=0;l<3;l++)
						pre_qp[k][l]=QP[k][l];

				DC.SelectObject(m_bmBlack);
				pDC->BitBlt(64+60*px,64+60*py,60,60,&DC,0,0,SRCCOPY);
				QP[px][py]=1;
				man_turn=0;
				if(!result())
				{
					computerdown();
					result();
				}
	
			}
			
		}
	}
	//联机游戏
	else if(mode==2)
	{
		CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
		if((x>60)&&(x<240)&&(y>60)&&(y<240))
		{
			
			px=(x-60)/60;
			py=(y-60)/60;
			if(!over)
			{
				if((!IsServer)&&man_turn&&(QP[px][py]==0))	//客户端(man_turn=1)
				{
			//	if(IsServer)
			//		return;

					for(int k=0;k<3;k++)
						for(int l=0;l<3;l++)
							pre_qp[k][l]=QP[k][l];

					DC.SelectObject(m_bmBlack);
					pDC->BitBlt(64+60*px,64+60*py,60,60,&DC,0,0,SRCCOPY);
					QP[px][py]=1;
					man_turn=0;
					SendPosInfo(px,py,pFrame->m_pClient);
					result();
				}
				else if(IsServer&&(man_turn==0)&&(QP[px][py]==0))		//服务器端(man_turn=0)
				{
				//if(!IsServer)
				//	return;
					DC.SelectObject(m_bmRed);
					pDC->BitBlt(64+60*px,64+60*py,60,60,&DC,0,0,SRCCOPY);
					QP[px][py]=-1;
					man_turn=1;
					SendPosInfo(px,py,pFrame->m_pConnect);
					result();
				}
			}
		}
	}
	CView::OnLButtonUp(nFlags, point);
}


void CJingZiQiView::computerdown()
{
	
	CDC *pDC=GetDC();
	CDC DC;
	if(DC.CreateCompatibleDC(pDC)==FALSE)
		MessageBox("fail to create DC!");
	int i,j,k1,k2,temp1,temp2,flag;
	struct datatype
	{
		int data;
		int locatedata;
	}datas[8];
	
	flag=1;
	for (i=0;i<3;i++)
		for (j=0;j<3;j++)
		{
			if (QP[i][j]==0)
			flag=0;
		}
	if(flag==1) 
	{
		return;
	}
	for (i=0;i<8;i++)
	{
		datas[i].locatedata=i;
	}
	for(i=0;i<3;i++)
	{
		datas[i].data=0;
		for (j=0;j<3;j++)
			datas[i].data=datas[i].data+QP[i][j];
	}
	for(j=0;j<3;j++)
	{
		datas[j+3].data=0;
		for (i=0;i<3;i++)
			datas[j+3].data=datas[j+3].data+QP[i][j];
	}
	datas[6].data=QP[0][0]+QP[1][1]+QP[2][2];
	datas[7].data=QP[2][0]+QP[1][1]+QP[0][2];
	for (i=8-1;i>0;i--)
	{	flag=1;
		for (j=0;j<i;j++)
		{
			if (datas[j].data>datas[j+1].data)
			{
				temp1=datas[j].data;
				datas[j].data=datas[j+1].data;
				datas[j+1].data=temp1;
				temp2=datas[j].locatedata;
				datas[j].locatedata=datas[j+1].locatedata;
				datas[j+1].locatedata=temp2;
				flag=0;
			}
		}
		if (flag==1)
			break;
	}

	if ((QP[0][0]==0)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==1)&&(QP[1][2]==0)&&(QP[2][0]==0)&&(QP[2][1]==0)&&(QP[2][2]==0))
	{
		QP[0][0]=-1;
		DC.SelectObject(m_bmRed);
		pDC->BitBlt(64,64,60,60,&DC,0,0,SRCCOPY);
		man_turn=1;
		return;
	}
	if ((QP[0][0]==1)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==0)&&(QP[1][2]==0)&&(QP[2][0]==0)&&(QP[2][1]==0)&&(QP[2][2]==0))
	{
		QP[1][1]=-1;
		DC.SelectObject(m_bmRed);
		pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY);
		man_turn=1;
		return;
	}
	if ((QP[0][0]==0)&&(QP[0][1]==0)&&(QP[0][2]==0)&&(QP[1][0]==0)&&(QP[1][1]==0)&&(QP[1][2]==0)&&(QP[2][0]==1)&&(QP[2][1]==0)&&(QP[2][2]==0))
	{
		QP[1][1]=-1;
		DC.SelectObject(m_bmRed);
		pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY);
		man_turn=1;
		return;
	}
	
	if (Level==2)
	{
		if(hard())
			return;
	}

	k1=7;
	k2=0;
	while(1)
	{		
		if((datas[k2].data+datas[k1].data)<=0)
		{
			if (datas[k2].locatedata<=2)
			{
				for(j=0;j<3;j++)
				{
					if (QP[datas[k2].locatedata][j]==0)
					{
						DC.SelectObject(m_bmRed);
						pDC->BitBlt(64+60*datas[k2].locatedata,64+60*j,60,60,&DC,0,0,SRCCOPY);
						QP[datas[k2].locatedata][j]=-1;
						man_turn=1;return;
					}

				}
			}
			if ((datas[k2].locatedata>2)&&(datas[k2].locatedata<6))
			{
				for (i=0;i<3;i++)
				{			
					if (QP[i][datas[k2].locatedata%3]==0)
					{
						DC.SelectObject(m_bmRed);
						pDC->BitBlt(64+60*i,64+60*(datas[k2].locatedata%3),60,60,&DC,0,0,SRCCOPY);
						QP[i][datas[k2].locatedata%3]=-1;
						man_turn=1;return;
					}
				}
			}
			if (datas[k2].locatedata==6)
			{
				for (i=0;i<3;i++)
					if (QP[i][i]==0)
					{
						DC.SelectObject(m_bmRed);
						pDC->BitBlt(64+60*i,64+60*i,60,60,&DC,0,0,SRCCOPY);
						QP[i][i]=-1;
						man_turn=1;
						return;
					}
			}
			if (datas[k2].locatedata==7)
			{
				if (QP[0][2]==0)
				{
					DC.SelectObject(m_bmRed);
					pDC->BitBlt(64+60*0,64+60*2,60,60,&DC,0,0,SRCCOPY);
					QP[0][2]=-1;
					man_turn=1;
					return;
				}
				else if (QP[1][1]==0)
				{
					DC.SelectObject(m_bmRed);
					pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY);
					QP[1][1]=-1;
					man_turn=1;
					return;
				}
						else if (QP[2][0]==0)
						{
							DC.SelectObject(m_bmRed);
							pDC->BitBlt(64+60*2,64+60*0,60,60,&DC,0,0,SRCCOPY);
							QP[2][0]=-1;
							man_turn=1;
							return;
						}
			}
			k2++;
		}
		else
		{
			if (datas[k1].locatedata<=2)
			{
				for(j=0;j<3;j++)
				{	
					if (QP[datas[k1].locatedata][j]==0)
					{
						DC.SelectObject(m_bmRed);
						pDC->BitBlt(64+60*datas[k1].locatedata,64+60*j,60,60,&DC,0,0,SRCCOPY);
						QP[datas[k1].locatedata][j]=-1;
						man_turn=1;
						return;
					}
				}
			}
			if ((datas[k1].locatedata>2)&&(datas[k1].locatedata<6))
			{
				for (i=0;i<3;i++)
				{
					if (QP[i][datas[k1].locatedata%3]==0)
					{
						DC.SelectObject(m_bmRed);
						pDC->BitBlt(64+60*i,64+60*(datas[k1].locatedata%3),60,60,&DC,0,0,SRCCOPY);
						QP[i][datas[k1].locatedata%3]=-1;
						man_turn=1;
						return;
					}
				}
			}
			if (datas[k1].locatedata==6)
				{
					for (i=0;i<3;i++)
					if (QP[i][i]==0)
					{
						DC.SelectObject(m_bmRed);
						pDC->BitBlt(64+60*i,64+60*i,60,60,&DC,0,0,SRCCOPY);
						QP[i][i]=-1;
						man_turn=1;
						return;
					}
				
			}
			if (datas[k1].locatedata==7)
			{
				if (QP[0][2]==0)
				{
					DC.SelectObject(m_bmRed);
					pDC->BitBlt(64+60*0,64+60*2,60,60,&DC,0,0,SRCCOPY);
					QP[0][2]=-1;
					man_turn=1;
					return;
				}
				else 
					if (QP[1][1]==0)
					{
						DC.SelectObject(m_bmRed);
						pDC->BitBlt(64+60*1,64+60*1,60,60,&DC,0,0,SRCCOPY);
						QP[1][1]=-1;
						man_turn=1;
						return;
					}
					 else 
						 if (QP[2][0]==0)
						 {
							 DC.SelectObject(m_bmRed);
							 pDC->BitBlt(64+60*2,64+60*0,60,60,&DC,0,0,SRCCOPY);	 
							 QP[2][0]=-1;
							 man_turn=1;
							 return;
						 }
			}
			k1--;
		}
	}
	
}

BOOL CJingZiQiView::result()
{
	int i,j,count[8],flagcount=0,temp=0,max=0,min=0;
	for(i=0;i<3;i++)
	{
		count[i]=0;
		for (j=0;j<3;j++)
			count[i]=count[i]+QP[i][j];
	}
	for(j=0;j<3;j++)
	{
		count[j+3]=0;
		for (i=0;i<3;i++)
			count[j+3]=count[j+3]+QP[i][j];
	}
	count[6]=QP[0][0]+QP[1][1]+QP[2][2];
	count[7]=QP[2][0]+QP[1][1]+QP[0][2];
	for (i=0;i<3;i++)
	{
		for (j=0;j<3;j++)
			if (QP[i][j]==0)
			{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -