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

📄 人机对战五子棋tryview.cpp

📁 这个是一个简单但界面相当美观的人机对战五子棋系统
💻 CPP
字号:
// 人机对战五子棋tryView.cpp : implementation of the CTryView class
//

#include "stdafx.h"
#include "人机对战五子棋try.h"

#include "人机对战五子棋tryDoc.h"
#include "人机对战五子棋tryView.h"
#include "Dlg.h"
#include "Dlg2.h"
#include "Dlg1.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define WHITE 1
#define BLACK 2
#define WITH_PEOPLE 1
#define WITH_COMPUTER 2
#define EASY 0
#define NORMAL 1
//#define HARD 2
/////////////////////////////////////////////////////////////////////////////
// CTryView

IMPLEMENT_DYNCREATE(CTryView, CView)

BEGIN_MESSAGE_MAP(CTryView, CView)
	//{{AFX_MSG_MAP(CTryView)
	ON_WM_LBUTTONDOWN()
	ON_WM_RBUTTONDOWN()
	ON_COMMAND(ID_Restart, OnRestart)
	ON_COMMAND(ID_DIFFICULTY, OnDifficulty)
	//}}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()

/////////////////////////////////////////////////////////////////////////////
// CTryView construction/destruction

CTryView::CTryView()
{
	// TODO: add construction code here
    CDlg2 dlg2;
	CDlg1 dlg1;
	dlg2.DoModal();
	mode=dlg2.mode;
	if(mode==WITH_COMPUTER)
	{
		//if(dlg1.DoModal()==IDOK)
		//{
		//	difficulty=dlg1.difficulty;
    	    AfxMessageBox("操作提示:单击鼠标左键放子,电脑自动下子。");
		//}
	}
	else
	//{
		
		AfxMessageBox("操作提示:白方单击鼠标左键放子,黑方单击鼠标右键放子。");
	//} 
}

CTryView::~CTryView()
{
}

BOOL CTryView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CTryView drawing

void CTryView::OnDraw(CDC* pDC)
{
	CTryDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	//CDlg2 dlg2;
	//dlg2.DoModal();
	//int nResult=GetCheckedRadioButton(IDC_DOUBLE,IDC_COMPUTER)
	//mode=dlg2.mode;
	if(mode==WITH_COMPUTER)
	{
		DrawBoard(pDC);
	//    AfxMessageBox("操作提示:单击鼠标左键放子,电脑自动下子。");
	}
	else
	{
		DrawBoard1(pDC);
	//	AfxMessageBox("操作提示:白方单击鼠标左键放子,黑方单击鼠标右键放子。");
	} 
}
/////////////////////////////////////////////////////////////////////////////
// CTryView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTryView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CTryView message handlers

void CTryView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);
    CTryDoc* pDoc = GetDocument();
   	ASSERT_VALID(pDoc);

	if(mode==WITH_COMPUTER){                                    //人机对战模式
        
		if(pDoc->decided==TRUE)
		return;
    	if(point.x<200||point.x>800||point.y<30||point.y>630)
		return;
    	CPoint pos;
    	pos.x=(point.x-200)/40;
    	pos.y=(point.y-30)/40;
    	if(pDoc->GetCondition(pos.x,pos.y)!=EMPTY)
		return;
    	pDoc->SetCondition(pos.x,pos.y,PEOPLE);
    	DrawWhite(&dc,pos.x,pos.y);
    	if(pDoc->IsGameOver())
		{	
    		pDoc->decided=TRUE;
    		if(pDoc->Get_number()>=60)	
		     AfxMessageBox("我不服!有种在挑一局!!!!");
    	    else if(pDoc->Get_number()<60&&pDoc->Get_number()>20)
    		     AfxMessageBox("算你行,你赢了!");
    		else 
    			 AfxMessageBox("佩服!你赢了,在下甘拜下风!!");
    	    //ResetGame();
		
		}
	
    	pDoc=GetDocument();
		if(difficulty==EASY)
            pos=pDoc->ComputerThink1();
		else 
			pos=pDoc->ComputerThink2();
    	pDoc->SetCondition(pos.x,pos.y,COMPUTER);
    	DrawBlack(&dc,pos.x,pos.y);
    	if(pDoc->IsGameOver()&&pDoc->decided==FALSE)
		{  
    		pDoc->decided=TRUE;
    		if((pDoc->Get_number())>=60)	
	    	     AfxMessageBox("你输了!加把劲有希望!");
    	    else if((pDoc->Get_number()<60)&&(pDoc->Get_number()>20))
    		     AfxMessageBox("你输了!水平不过如此啊?");
	    	else 
		    	 AfxMessageBox("小样!你太菜了!就你也想赢我?");
	    	//ResetGame();
		}
    	if(pDoc->IsGameOver())
		{
    		CDlg dlg;
    		dlg.DoModal();
    		if(dlg.reset==TRUE)
			{
				CDlg2 dlg2;
                dlg2.DoModal();
			    mode=dlg2.mode;
	            if(mode==WITH_COMPUTER)
	                DrawBoard(&dc);
	            else
	                DrawBoard1(&dc);
			    ResetGame();
			}
		}
	}
	else                          //双人游戏模式
	{
		if(pDoc->decided==TRUE)
		return;
    	if(point.x<200||point.x>800||point.y<30||point.y>630)
		return;
		if(next==BLACK)
			return;
		CPoint pos;
        pos.x=(point.x-200)/40;
    	pos.y=(point.y-30)/40;
    	if(pDoc->GetCondition(pos.x,pos.y)!=EMPTY)
		return;
    	next=BLACK;
		pDoc->SetCondition(pos.x,pos.y,PEOPLE);
    	DrawWhite(&dc,pos.x,pos.y);
    	if(pDoc->IsGameOver())
		{	
    		pDoc->decided=TRUE;
    	    AfxMessageBox("白方获胜!");
    	}
		if(pDoc->IsGameOver())
		{
    		CDlg dlg;
    		dlg.DoModal();
    		if(dlg.reset==TRUE)
			{
				CDlg2 dlg2;
                dlg2.DoModal();
			    mode=dlg2.mode;
	            if(mode==WITH_COMPUTER)
	                DrawBoard(&dc);
	            else
	                DrawBoard1(&dc);
				ResetGame();
			}  
		}  
	}

	CView::OnLButtonDown(nFlags, point);
}



void CTryView::DrawWhite(CDC *pDC,int i,int j)
{
    CBrush brush(RGB(255,255,255));
  	pDC->SelectObject(&brush);
	//pDC->SelectStockObject(NULL_BRUSH);
    //pDC->SelectObject(&pen);
	pDC->Ellipse(200+i*40+4,30+j*40+4,200+i*40+36,30+j*40+36);  
    //pDC->SelectObject(pOldPen);
	
}

void CTryView::DrawBlack(CDC *pDC,int i,int j)
{
    CBrush brush(RGB(0,0,0));
	pDC->SelectObject(&brush);
	//pDC->SelectStockObject(NULL_BRUSH);
    //pDC->SelectObject(&pen);
	pDC->Ellipse(200+i*40+4,30+j*40+4,200+i*40+36,30+j*40+36);  
    //pDC->SelectObject(pOldPen);

}

void CTryView::DrawBoard(CDC *pDC)
{
    CTryDoc* pDoc = GetDocument();
    

	/////////////////////////////////画背景色//////////////////////////////////////////	
	CBrush brush2(RGB(0,120,0));
	pDC->SelectObject(&brush2);
	pDC->Rectangle(0,0,1024,768);
	
	////////////////////////////////写文字///////////////////////////////////////////
	
	LOGFONT lf;
	CFont cf;
	memset(&lf,0,sizeof(LOGFONT));
	lf.lfHeight=-80;
	lf.lfCharSet=GB2312_CHARSET;
	::lstrcpy(lf.lfFaceName,"华文行楷");
	cf.CreateFontIndirect(&lf);
	CFont* oldfont=pDC->SelectObject(&cf);
	pDC->SetTextColor(RGB(255,255,0));
	pDC->SetBkColor(RGB(0,120,0));
	pDC->TextOut(50,70,"人");
	pDC->TextOut(50,140,"机");
	pDC->TextOut(50,210,"对");
	pDC->TextOut(50,280,"战");
	pDC->TextOut(50,350,"五");
	pDC->TextOut(50,420,"子");
	pDC->TextOut(50,490,"棋");
   

	CBrush brush3(RGB(192,0,0));
	pDC->SelectObject(&brush3);
    pDC->Ellipse(825,480,1000,540);
	pDC->Ellipse(845,560,965,625);
	CFont cf1;
    LOGFONT lf1;
	memset(&lf1,0,sizeof(LOGFONT));
	lf1.lfHeight=-25;
	lf1.lfCharSet=GB2312_CHARSET;
	::lstrcpy(lf1.lfFaceName,"华文行楷");
	cf1.CreateFontIndirect(&lf1);
	pDC->SelectObject(&cf1);
	pDC->SetTextColor(RGB(0,255,255));
	pDC->SetBkColor(RGB(192,0,0));
	pDC->TextOut(845,500,"五子棋 ver 1.0");
	pDC->TextOut(855,580,"盛锋制作");
    pDC->SetBkColor(RGB(0,120,0));
	if(difficulty==EMPTY)
		pDC->TextOut(60,580,"(初级)");
	else
		pDC->TextOut(60,580,"(中级)");
	
	pDC->SelectObject(oldfont);
	cf.DeleteObject();
	
	/////////////////////////////////画棋盘///////////////////////////////////////////
	CBrush brush1(RGB(0,0,192));
	pDC->SelectObject(&brush1);
	//CPen* pOldPen=pDC->SelectObject(&pen1);
	//pDC->MoveTo(10,10);
	//pDC->LineTo()
    pDC->Rectangle(185,15,815,645);

	CPen pen(PS_SOLID,2,RGB(0,192,0));
	CPen* pOldPen=pDC->SelectObject(&pen);
    for(int k=0;k<=15;k++)
	{
		pDC->MoveTo(200+k*40,30);
    	pDC->LineTo(200+k*40,630);
		pDC->MoveTo(200,30+k*40);
		pDC->LineTo(800,30+k*40);
	}
	pDC->SelectObject(pOldPen);

	///////////////////////////////导入位图/////////////////////////////////////////
	CBitmap m_bmp;
	m_bmp.LoadBitmap(IDB_BITMAP3);
	BITMAP bm;
	m_bmp.GetObject(sizeof(BITMAP),&bm);

	CDC dcMem;
	dcMem.CreateCompatibleDC(pDC);
	CBitmap *pOldbmp=dcMem.SelectObject(&m_bmp);
	pDC->BitBlt(818,15,200,740,&dcMem,0,0,SRCCOPY);
	dcMem.SelectObject(pOldbmp);
	dcMem.DeleteDC();
	
	///////////////////////////////画黑白子/////////////////////////////////////////
	for(int i=0;i<15;i++)
		for(int j=0;j<15;j++)
		{
			if(pDoc->GetCondition(i,j)==PEOPLE)
				DrawWhite(pDC,i,j);
			else if(pDoc->GetCondition(i,j)==COMPUTER)
				DrawBlack(pDC,i,j);
		}
}

void CTryView::ResetGame()
{
    CClientDC dc(this);
	CTryDoc* pDoc = GetDocument();
	pDoc->ResetData();
	if(mode==WITH_COMPUTER)
	{
	    DrawBoard(&dc);
	    AfxMessageBox("操作提示:单击鼠标左键放子,电脑自动下子。");
	}
	else
	{
        DrawBoard1(&dc);
	    AfxMessageBox("操作提示:白方单击鼠标左键放子,黑方单击鼠标右键放子。");
	}
}

void CTryView::DrawBoard1(CDC *pDC)
{
    CTryDoc* pDoc = GetDocument();
    

	/////////////////////////////////画背景色//////////////////////////////////////////	
	CBrush brush2(RGB(0,120,0));
	pDC->SelectObject(&brush2);
	pDC->Rectangle(0,0,1024,768);
	
	////////////////////////////////写文字///////////////////////////////////////////
	
	LOGFONT lf;
	CFont cf;
	memset(&lf,0,sizeof(LOGFONT));
	lf.lfHeight=-80;
	lf.lfCharSet=GB2312_CHARSET;
	::lstrcpy(lf.lfFaceName,"华文行楷");
	cf.CreateFontIndirect(&lf);
	CFont* oldfont=pDC->SelectObject(&cf);
	pDC->SetTextColor(RGB(255,255,0));
	pDC->SetBkColor(RGB(0,120,0));
	
	pDC->TextOut(50,60,"双");
	pDC->TextOut(50,180,"人");
	pDC->TextOut(50,300,"五");
	pDC->TextOut(50,420,"子");
	pDC->TextOut(50,540,"棋");
   

	CBrush brush3(RGB(192,0,0));
	pDC->SelectObject(&brush3);
    pDC->Ellipse(825,480,1000,540);
	pDC->Ellipse(845,560,965,625);
	CFont cf1;
    LOGFONT lf1;
	memset(&lf1,0,sizeof(LOGFONT));
	lf1.lfHeight=-25;
	lf1.lfCharSet=GB2312_CHARSET;
	::lstrcpy(lf1.lfFaceName,"华文行楷");
	cf1.CreateFontIndirect(&lf1);
	pDC->SelectObject(&cf1);
	pDC->SetTextColor(RGB(0,255,255));
	pDC->SetBkColor(RGB(192,0,0));
	pDC->TextOut(845,500,"五子棋 ver 1.0");
	pDC->TextOut(855,580,"盛锋制作");

	pDC->SelectObject(oldfont);
	cf.DeleteObject();
	
	/////////////////////////////////画棋盘///////////////////////////////////////////
	CBrush brush1(RGB(0,0,192));
	pDC->SelectObject(&brush1);
	//CPen* pOldPen=pDC->SelectObject(&pen1);
	//pDC->MoveTo(10,10);
	//pDC->LineTo()
    pDC->Rectangle(185,15,815,645);

	CPen pen(PS_SOLID,2,RGB(0,192,0));
	CPen* pOldPen=pDC->SelectObject(&pen);
    for(int k=0;k<=15;k++)
	{
		pDC->MoveTo(200+k*40,30);
    	pDC->LineTo(200+k*40,630);
		pDC->MoveTo(200,30+k*40);
		pDC->LineTo(800,30+k*40);
	}
	pDC->SelectObject(pOldPen);

	///////////////////////////////导入位图/////////////////////////////////////////
	CBitmap m_bmp;
	m_bmp.LoadBitmap(IDB_BITMAP3);
	BITMAP bm;
	m_bmp.GetObject(sizeof(BITMAP),&bm);

	CDC dcMem;
	dcMem.CreateCompatibleDC(pDC);
	CBitmap *pOldbmp=dcMem.SelectObject(&m_bmp);
	pDC->BitBlt(818,15,200,740,&dcMem,0,0,SRCCOPY);
	dcMem.SelectObject(pOldbmp);
	dcMem.DeleteDC();
	
	///////////////////////////////画黑白子/////////////////////////////////////////
	for(int i=0;i<15;i++)
		for(int j=0;j<15;j++)
		{
			if(pDoc->GetCondition(i,j)==PEOPLE)
				DrawWhite(pDC,i,j);
			else if(pDoc->GetCondition(i,j)==COMPUTER)
				DrawBlack(pDC,i,j);
		}
}

void CTryView::OnRButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);
    CTryDoc* pDoc = GetDocument();
   	ASSERT_VALID(pDoc);

	if(mode==WITH_PEOPLE){
		if(pDoc->decided==TRUE)
	    	return;
    	if(point.x<200||point.x>800||point.y<30||point.y>630)
	    	return;
		if(next==WHITE)
			return;
    	CPoint pos;
      	pos.x=(point.x-200)/40;
    	pos.y=(point.y-30)/40;
    	if(pDoc->GetCondition(pos.x,pos.y)!=EMPTY)
	    	return;
		next=WHITE;
    	pDoc->SetCondition(pos.x,pos.y,COMPUTER);
    	DrawBlack(&dc,pos.x,pos.y);
		if(pDoc->IsGameOver())
		{	
    		pDoc->decided=TRUE;
    	    AfxMessageBox("黑方获胜!");
    	}
		if(pDoc->IsGameOver())
		{
    		CDlg dlg;
    		dlg.DoModal();
    		if(dlg.reset==TRUE)
			{
				CDlg2 dlg2;
                dlg2.DoModal();
			    mode=dlg2.mode;
	           	ResetGame();
			}
		}
	}
	CView::OnRButtonDown(nFlags, point);
}

void CTryView::OnRestart() 
{
	// TODO: Add your command handler code here
	CDlg dlg;
	dlg.DoModal();
	if(dlg.reset==TRUE)
	{
	   CDlg2 dlg2;
	   dlg2.DoModal();
	   mode=dlg2.mode;
	   ResetGame();
	}
	
}

void CTryView::OnDifficulty() 
{
	// TODO: Add your command handler code here
	CClientDC dc(this);
	CDlg1 dlg1;
	if(dlg1.DoModal()==IDOK)
	{
       difficulty=dlg1.difficulty;
	   OnDraw(&dc);      
	}
}

⌨️ 快捷键说明

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