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

📄 programview.cpp

📁 一个局域网的斗地主游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ProgramView.cpp : implementation of the CProgramView class
//

#include "stdafx.h"
#include "Program.h"

#include "ProgramDoc.h"
#include "ProgramView.h"
#include "NetControl.h"
#include "Managers.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern Managers manager;
/////////////////////////////////////////////////////////////////////////////
// CProgramView

IMPLEMENT_DYNCREATE(CProgramView, CView)

BEGIN_MESSAGE_MAP(CProgramView, CView)
	//{{AFX_MSG_MAP(CProgramView)
	ON_WM_CREATE()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
	//
	
	//将按钮点击事件同响应函数联系起来
	ON_BN_CLICKED(ID_OK, OnOK)//让ID_OK所指的对象响应单击(ON_BN_CLICKED)事件,事件
								//的处理函数是OnOK
	ON_BN_CLICKED(ID_CANCEL,OnCancel)
	ON_BN_CLICKED(ID_SENDCARD,OnSendCard)
	ON_BN_CLICKED(ID_PASS,OnPass)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CProgramView construction/destruction

CProgramView::CProgramView()
{
	// TODO: add construction code here
	pControl= new NetControl(this);//创建一个指向NetControl的指针
	isgoon = true;
	srand(time(NULL));


}

CProgramView::~CProgramView()
{
	if(!pControl->m_Isserver)
		pControl->SendMsg(pControl->m_pSocket,"退出游戏");
	else
		pControl->Broadcast("退出游戏");
	delete pControl;
}

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

	//加载位图
	m_background.LoadBitmap(IDB_BACKGROUND);
	m_card.LoadBitmap(IDB_CARD);
	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CProgramView drawing

void CProgramView::OnDraw(CDC* pDC)
{
	CProgramDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	//初始化CDC
	static	bool	st=TRUE;
	if(st)
	{	Background.CreateCompatibleDC(pDC);
		Background.SelectObject(m_background);
		Mcard.CreateCompatibleDC(pDC);
		Mcard.SelectObject(m_card);
		st=FALSE;
	}
	PrintAll();
}

/////////////////////////////////////////////////////////////////////////////
// CProgramView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CProgramView message handlers

int CProgramView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	// TODO: Add your specialized creation code here
	

///////////////////////////////////////////////////////////////////////
/*
*函数名称:CBUTTON.Creat(_T("确定"),//按钮的caption属性,按钮的显示
			WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, // 按钮也是一种窗体,同样有不同
	//风格,通过对常量或运算进行组合,达到一定的效果,这些常量的含义可以参考MSDN
	CRect(660,410,765,450), //这个参数指出按钮在视图中左上角和右下角坐标,在
	//确定了按钮位置的同时也确定了其大小
	this,//这个指针指向按钮这个窗体的父窗体
	ID_OK);//这是刚才为按钮定义的常量,按钮的控制ID
*函数介绍:创建按钮
*输入参数:见上
*输出参数:无
*返回值	 :无
*/

	//创建按钮OK
	m_ok.Create(_T("确定"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
	CRect(660,420,765,460), this, ID_OK);
	//创建按钮CANCEL
	m_cancel.Create(_T("退出"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
	CRect(660,502,765,542), this, ID_CANCEL);
	//出牌
	m_sendcard.Create(_T("出牌"), WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON, 
	CRect(532,387,637,427), this, ID_SENDCARD);
	//过牌
	m_pass.Create(_T("过牌"),WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,
	CRect(533,460,638,500),this,ID_PASS);

//////////////////////////////////////////////////////////////////////////
/*
*函数名称:CBUTTON.ShowWindow(SW_SHOW)
*函数介绍:按钮的显示控制
*输入参数:当输入参数为SW_SHOW表示显示按钮,当为SW_HIDE表示隐藏按钮
*输出参数:无
*返回值	 :无
*/
	//显示按钮
	m_ok.ShowWindow(SW_SHOW);
	m_cancel.ShowWindow(SW_SHOW);
	m_sendcard.ShowWindow(SW_SHOW);
	m_pass.ShowWindow(SW_SHOW);
//在游戏界面开始前强制输入用户名称,如果用户点的是确定,则将用户名存入PlayerName[manager.PlayAc]中
//点取消的话则用户名为默认用户名。

	CName	dlg3;
	if(dlg3.DoModal()==IDOK)
	{	
		PlayerName[1]=dlg3.m_name;
	}
	else
		PlayerName[1]="路人甲";

//选择时候为主机/客户机
	pControl->OnSorc();
	return 0;
}

void CProgramView::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	//跟踪光标坐标
	int	mx=point.x;
	int	my=point.y;

	CString	st;
	CDC	*pdc=GetDC();
	st.Format("%d  ,%d   ",point.x,point.y);
//	pdc->SetBkMode(TRANSPARENT); 
//	pDC->SetTextColor(RGB(255,255,255));
	pdc->TextOut(400,5,st);
	ReleaseDC(pdc);
	CView::OnMouseMove(nFlags, point);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:OnOk()
函数介绍:响应确定按钮的点击
输入参数:无
输出参数:无
返回值	:无
*/
void CProgramView::OnOK()
{
//	MessageBox("你点击了确定按钮");//改变
	if(manager.Game_State>=0 && manager.Game_State<3)
		return;
	if(manager.Game_State>=3 )
	{
		manager.Game_State=-2;
		isgoon=true;
	}
	if(isgoon)
	{
			
		OutCards[0][0].Num=16;
		OutCards[1][0].Num=16;
		OutCards[2][0].Num=16;
		PrintAll();
		if(!pControl->m_Isserver)
		{
			pControl->SendGetReady();
		}
		else 
		{
			pControl->m_ready[1]=true;
			if(pControl->m_ready[0] && pControl->m_ready[1] && pControl->m_ready[2])
			{
				pControl->m_ready[0]=false;
				pControl->m_ready[1]=false;
				pControl->m_ready[2]=false;
				manager.GameStart();
				pControl->StartCards();
				PlayerPos();
				PrintAll(1);
			}
		}
		CDC	*pdc=GetDC();
		pdc->SetBkMode(TRANSPARENT);
		pdc->TextOut(545,435,"准备");
		ReleaseDC(pdc);
	}

}
////////////////////////////////////////////////////////////////////
/*
函数名称:OnCancel()
函数介绍:响应取消按钮的点击
输入参数:无
输出参数:无
返回值	:无
*/
void CProgramView::OnCancel()
{
//	MessageBox("你点击了取消按钮");
	if(!pControl->m_Isserver)
		pControl->SendMsg(pControl->m_pSocket,"退出游戏");
	else
		pControl->Broadcast("退出游戏");
	exit(0);
}
///////////////////////////////////////////////////////////////////////
/*
函数名称:PrintAll(CDC *pdc)
函数介绍:用来整体重画
输入参数:绘图用CDC
输出参数:无
返回值	:无
*/
void CProgramView::PrintAll()
{	
	CDC	*pdc=GetDC();
	pdc->BitBlt(0,0,800,600,&Background,0,0,SRCCOPY);
	if(manager.Game_State==-2)
		CardReady();	
	if(manager.Game_State==-1)
	{
		pdc->SetBkMode(TRANSPARENT);
		pdc->TextOut(600,435,"准备");
		pdc->TextOut(630,435,"准备");
	}
	DrawLeft();
	DrawCardOut(3);
	DrawMyCard();
	DrawOtherCard();
	PrintState();
	ReleaseDC(pdc);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:CardReady()
函数介绍:画发牌前牌的摆放
输入参数:无
输出参数:无
返回值	:无
*/
void CProgramView::CardReady()
{
	CDC	*pdc=GetDC();
	for(int	i=0;i<54;i++)
	pdc->BitBlt(300+i*2,220,72,97,&Mcard,142,384,SRCCOPY);
	ReleaseDC(pdc);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:DrawMyCard()
函数介绍:画出当前玩家手中的牌
输入参数:无
输出参数:无
返回值	:无
*/
void CProgramView::DrawMyCard()
{
	CDC *pdc=GetDC();
	int	i;
	for(i=0;i<20&&manager.PlayCards[manager.PlayerAc][i].Num<=15;i++)
	{
		if(manager.PlayCards[manager.PlayerAc][i].Num<14)
		{	if(manager.PlayCards[manager.PlayerAc][i].Click)
				pdc->BitBlt(100+i*15,480-40,71,96,&Mcard,(manager.PlayCards[manager.PlayerAc][i].Num-1)*71,manager.PlayCards[manager.PlayerAc][i].Type*96,SRCCOPY);
			else
				pdc->BitBlt(100+i*15,480,71,96,&Mcard,(manager.PlayCards[manager.PlayerAc][i].Num-1)*71,manager.PlayCards[manager.PlayerAc][i].Type*96,SRCCOPY);
		}
		else if(manager.PlayCards[manager.PlayerAc][i].Num<=15)
		{	if(manager.PlayCards[manager.PlayerAc][i].Click)
				pdc->BitBlt(100+i*15,480-40,71,96,&Mcard,(manager.PlayCards[manager.PlayerAc][i].Num-14)*71,384,SRCCOPY);
			else
				pdc->BitBlt(100+i*15,480,71,96,&Mcard,(manager.PlayCards[manager.PlayerAc][i].Num-14)*71,384,SRCCOPY);
		}
	}		
	ReleaseDC(pdc);
}
//////////////////////////////////////////////////////////////////
/*
函数名称:DrawOtherCard
函数介绍:画出其他玩家的牌(包括其还剩下多少张牌及当前出的牌)
输入参数:Card	*card 为传入的对方出的牌即OutCards
输出参数:无
返回值	:无
*/
void CProgramView::DrawOtherCard()
{	
	CDC	*pdc=GetDC();
	int	i;
	if(manager.Game_State==-2)
		return;
	//画其他玩家剩下的牌/反面
	for(i=0;i<20&&cardleft[i].Num<=15;i++)
	{
			pdc->BitBlt(55,55+i*10,97,75,&Mcard,214,408,SRCCOPY);	
	}
	for(i=0;i<20&&cardright[i].Num<=15;i++)
	{	
			pdc->BitBlt(630,55+i*10,97,75,&Mcard,214,408,SRCCOPY);
	
	}
	ReleaseDC(pdc);
}

void CProgramView::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	int	mx=point.x;
	int	my=point.y;

⌨️ 快捷键说明

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