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

📄 dlg_start.cpp

📁 这是纸牌游戏斗地主,算法完整,可以单机,网络连线玩.
💻 CPP
字号:
// Dlg_Start.cpp : implementation file
//
#include "stdafx.h"
#include "斗地主.h"

#include "Game.h"

#include "Link.h"

#include "Dlg_About.h"
#include "Dlg_Start.h"

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

/////////////////////////////////////////////////////////////////////////////
// CDlg_Start dialog


CDlg_Start::CDlg_Start(CWnd* pParent /*=NULL*/)
	: CDialog(CDlg_Start::IDD, pParent)
{
	//{{AFX_DATA_INIT(CDlg_Start)
	m_ServerIP = _T("");
	m_Client = _T("请在此输入服务端IP地址");
	m_Name = _T("");
	m_Face_ID = 0;
	m_Net_States = _T("");
	m_Net_Info = _T("当前还没有建立网络连接");
	//}}AFX_DATA_INIT
}


void CDlg_Start::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CDlg_Start)
	DDX_Text(pDX, EDIT_SERVER, m_ServerIP);
	DDX_Text(pDX, EDIT_CLIENT, m_Client);
	DDX_Text(pDX, EDIT_NAME, m_Name);
	DDV_MaxChars(pDX, m_Name, 6);
	DDX_Scroll(pDX, SCROLLBAR_FACE, m_Face_ID);
	DDX_Text(pDX, STATIC_NET_STATES, m_Net_Info);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CDlg_Start, CDialog)
	//{{AFX_MSG_MAP(CDlg_Start)
	ON_BN_CLICKED(IDB_EXIT, OnExit)
	ON_BN_CLICKED(RADIO_CLIENT, OnClient)
	ON_BN_CLICKED(RADIO_LINK, OnLink)
	ON_BN_CLICKED(RADIO_SINGLE, OnSingle)
	ON_BN_CLICKED(RADIO_SERVER, OnServer)
	ON_WM_HSCROLL()
	ON_BN_CLICKED(IDB_START, OnStart)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDB_GAME_MAKER, OnGameMaker)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDlg_Start message handlers
//服务器端接收函数


DWORD WINAPI CDlg_Start::Server_Login(LPVOID pParam)
{
	CString str;
	char net_info[100];

	CLink listen;
	listen.SocketInit();
	listen.Create();
	listen.Bind();
	listen.Listen();

	s_m_szNetInfo.Format("%s已经建立服务器,等待另两位玩家加入...",pCenterPlayer->m_szName);
	
	//接收第一个客户的请求;
	listen.Accept(pServerLink1);
	
	pServerLink1->Recv(pRightPlayer,sizeof(CPlayerInfo));	
//	str.Format("客户1名字:%s\n头像ID:%d",pRight_Player->m_szName,pRight_Player->m_nFaceID);
//	AfxMessageBox(str);

	s_m_szNetInfo.Format("%s已经建立服务器\n%s加入游戏,等待第三位玩家加入!",\
		pCenterPlayer->m_szName,pRightPlayer->m_szName);

	//发送连接信息;
	sprintf(net_info,s_m_szNetInfo);
	pServerLink1->Send(net_info,sizeof(char)*100);
	
	//接收第二个客户的请求;
	listen.Accept(pServerLink2);
	listen.Close();
	pServerLink2->Recv(pLeftPlayer,sizeof(CPlayerInfo));
//	str.Format("客户2名字:%s\n头像ID:%d",pLeft_Player->m_szName,pLeft_Player->m_nFaceID);
//	AfxMessageBox(str);			
	
	s_m_szNetInfo.Format("%s已经建立服务器\n%s加入游戏\n%s加入游戏\n开始游戏!!",\
		pCenterPlayer->m_szName,pRightPlayer->m_szName,pLeftPlayer->m_szName);
	sprintf(net_info,s_m_szNetInfo);
	pServerLink2->Send(net_info,sizeof(char)*100);
    //再发送一次连接信息;
	pServerLink1->Send(net_info,sizeof(char)*100);
	pServerLink2->Send(net_info,sizeof(char)*100);
	
	//给客户1,2发出客户名和头像ID号;
	pServerLink1->Send(pLeftPlayer,sizeof(CPlayerInfo));
	pServerLink1->Send(pCenterPlayer,sizeof(CPlayerInfo));

	pServerLink2->Send(pCenterPlayer,sizeof(CPlayerInfo));
	pServerLink2->Send(pRightPlayer,sizeof(CPlayerInfo));

	s_m_bOK = TRUE;
	return 1;
}

	
//客户端函数;
DWORD WINAPI CDlg_Start::Client_Login(LPVOID pParam)
{	
	char net_info[100];
	//发送登陆信息到S
	pClientLink->Send(pCenterPlayer,sizeof(CPlayerInfo));
	//接收S连接信息;
	pClientLink->Recv(net_info,sizeof(char)*100);
	s_m_szNetInfo = net_info;
	::Sleep(300);
	//再接收一次连接信息;
	pClientLink->Recv(net_info,sizeof(char)*100);
	s_m_szNetInfo = net_info;

	//接收另两位玩家信息;
	pClientLink->Recv(pRightPlayer,sizeof(CPlayerInfo));
	pClientLink->Recv(pLeftPlayer,sizeof(CPlayerInfo));

	s_m_bOK = TRUE;
//	CString str;
//	str.Format("左边玩家名字:%s\n头像ID:%d\n\n右边玩家名字:%s\n头像ID:%d\n",\
//	pLeft_Player->m_szName,pLeft_Player->m_nFaceID,pRight_Player->m_szName,pRight_Player->m_nFaceID);
//	AfxMessageBox(str);	
	return 1;
}

CString CDlg_Start::s_m_szNetInfo = _T("");
int CDlg_Start::s_m_bOK = FALSE;

void CDlg_Start::OnStart() 
{
	UpdateData(TRUE);
	if( m_Name == _T("") )
	{
		AfxMessageBox("请填入你的名字(昵称)!");
		GetDlgItem(EDIT_NAME)->SetFocus();
		return ;
	}

	GetDlgItem(IDB_START)->EnableWindow(FALSE);
	//玩家名字;
	sprintf(pCenterPlayer->m_szName,m_Name);
	//玩家选择的头像ID;
	pCenterPlayer->m_nFaceID = m_Face_ID;

	if( ((CButton* )GetDlgItem(RADIO_SINGLE))->GetCheck() )
	{		
		pCenterPlayer->m_nPlayerType = 0;	//类型0表示单人游戏;
		//随机初始化:
		pRightPlayer->m_nFaceID = rand()%4;
		sprintf(pRightPlayer->m_szName,"林江");
		pLeftPlayer->m_nFaceID = rand()%4;
		sprintf(pLeftPlayer->m_szName,"杨娱");

		CDialog::OnOK();
	}
	else
	{
		//服务器;
		if( ((CButton* )GetDlgItem(RADIO_SERVER))->GetCheck() )
		{
			pCenterPlayer->m_nPlayerType = 1;	//类型1表示客户端;   		

			pServerLink1 = new CLink;  //连接客户1;
			pServerLink2 = new CLink;  //连接客户2;

			m_hThread = ::CreateThread(NULL,0,Server_Login,0,0,&m_dwThreadId);
			SetTimer(1,200,NULL);  //用于更新的计时器;
		}
		//客户端;
		else
		{
			pCenterPlayer->m_nPlayerType = 2;   //类型2表示客户端;

			pClientLink = new CLink;
			pClientLink->SocketInit();
			pClientLink->Create();
			if( !pClientLink->Connect(m_Client) )
			{
				pClientLink->Close();
				delete pClientLink;
				GetDlgItem(IDB_START)->EnableWindow(TRUE);
				return ;
			}
 
			m_hThread = ::CreateThread(NULL,0,Client_Login,0,0,&m_dwThreadId);
			SetTimer(1,200,NULL);  //用于更新的计时器; 
		}
	}//end if~
}

void CDlg_Start::OnExit() 
{
	CDialog::OnCancel();
}

BOOL CDlg_Start::OnInitDialog() 
{
	CDialog::OnInitDialog();

	( (CButton* )GetDlgItem(RADIO_SINGLE) )->SetCheck(TRUE);
	( (CButton* )GetDlgItem(RADIO_LINK) )->SetCheck(FALSE);
//设置滚动条范围;
	CScrollBar* pSB = (CScrollBar*) GetDlgItem(SCROLLBAR_FACE);
	pSB->SetScrollRange(0, 3);

	m_cBitmap0.LoadBitmap("IDB_FACE0");
	m_cBitmap1.LoadBitmap("IDB_FACE1");
	m_cBitmap2.LoadBitmap("IDB_FACE2");
	m_cBitmap3.LoadBitmap("IDB_FACE3");

	SendDlgItemMessage(PIC_FACE,STM_SETIMAGE,IMAGE_BITMAP,LPARAM(m_cBitmap0.m_hObject) );

	CLink::GetHostIP();   //得到本机IP地址;

	pCenterPlayer = new CPlayerInfo;
	pLeftPlayer = new CPlayerInfo;
	pRightPlayer = new CPlayerInfo;

	GetDlgItem(EDIT_NAME)->SetFocus();
	return FALSE;  	          
}
//单人游戏;
void CDlg_Start::OnSingle() 
{
	( (CButton* )GetDlgItem(RADIO_SINGLE) )->SetCheck(TRUE);
	( (CButton* )GetDlgItem(RADIO_LINK) )->SetCheck(FALSE);

	GetDlgItem(RADIO_SERVER)->EnableWindow(FALSE);
	GetDlgItem(RADIO_CLIENT)->EnableWindow(FALSE);

	GetDlgItem(EDIT_SERVER)->EnableWindow(FALSE);
	GetDlgItem(EDIT_CLIENT)->EnableWindow(FALSE);
	
}
//多人对战;
void CDlg_Start::OnLink() 
{
	( (CButton* )GetDlgItem(RADIO_SINGLE) )->SetCheck(FALSE);
	( (CButton* )GetDlgItem(RADIO_LINK) )->SetCheck(TRUE);

	GetDlgItem(RADIO_SERVER)->EnableWindow();
	GetDlgItem(RADIO_CLIENT)->EnableWindow();

	GetDlgItem(EDIT_SERVER)->EnableWindow();
	GetDlgItem(EDIT_CLIENT)->EnableWindow();
	
	( (CButton* )GetDlgItem(RADIO_SERVER) )->SetCheck(TRUE);
	( (CButton* )GetDlgItem(RADIO_CLIENT) )->SetCheck(FALSE);

	m_ServerIP = "本机IP地址:";
	m_ServerIP += CLink::m_szIpaddress;

	UpdateData(FALSE);
}
//作子机(客户端);
void CDlg_Start::OnClient() 
{
	( (CButton* )GetDlgItem(RADIO_SERVER) )->SetCheck(FALSE);
	( (CButton* )GetDlgItem(RADIO_CLIENT) )->SetCheck(TRUE);
	GetDlgItem(EDIT_CLIENT)->SetFocus();	
}
//本机作服务器;
void CDlg_Start::OnServer() 
{
	( (CButton* )GetDlgItem(RADIO_SERVER) )->SetCheck(TRUE);
	( (CButton* )GetDlgItem(RADIO_CLIENT) )->SetCheck(FALSE);	
}

void CDlg_Start::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	int nTemp1;

	nTemp1 = pScrollBar->GetScrollPos();
	switch(nSBCode)
	{
	case SB_LINELEFT: // left arrow button
		if(nTemp1 != 0)
		{
			pScrollBar->SetScrollPos(nTemp1-1);
		}
		break;
	case SB_LINERIGHT: // right arrow button
		if(nTemp1 < 3)
		{
			pScrollBar->SetScrollPos(nTemp1+1);
		}
		break;
	}

	switch(nTemp1)
	{
	case 0:
		SendDlgItemMessage(PIC_FACE,STM_SETIMAGE,IMAGE_BITMAP,LPARAM(m_cBitmap0.m_hObject) );
		break;
	case 1:
		SendDlgItemMessage(PIC_FACE,STM_SETIMAGE,IMAGE_BITMAP,LPARAM(m_cBitmap1.m_hObject) );
		break;
	case 2:
		SendDlgItemMessage(PIC_FACE,STM_SETIMAGE,IMAGE_BITMAP,LPARAM(m_cBitmap2.m_hObject) );
		break;
	case 3:
		SendDlgItemMessage(PIC_FACE,STM_SETIMAGE,IMAGE_BITMAP,LPARAM(m_cBitmap3.m_hObject) );
		break;
	}
}


void CDlg_Start::OnTimer(UINT nIDEvent) 
{
	m_Net_Info = s_m_szNetInfo;
	UpdateData(FALSE);

	if( s_m_bOK )
	{
		KillTimer(1);
		CDialog::OnOK();
	}

	CDialog::OnTimer(nIDEvent);
}

void CDlg_Start::OnGameMaker() 
{
	CDlg_About	dlg;
	dlg.DoModal();
}

⌨️ 快捷键说明

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