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

📄 bombplanedlg.cpp

📁 小时候玩过的在纸上画的小游戏
💻 CPP
字号:
#include "stdafx.h"
/*
Copyright (c)  2005  william.
      Permission is granted to copy, distribute and/or modify this document
      under the terms of the GNU Free Documentation License, Version 1.2
      or any later version published by the Free Software Foundation;
      with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
	 Texts.  A copy of the license is included in the section entitled "GNU
      Free Documentation License".
*/
/*
不时地会出现msg发送不成功的情况。

我应该使用timer来确定对方是否收到了关键消息,
来确定是否依然连接....

或者每个消息发送两次。
*/
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CbombplaneDlg::CbombplaneDlg(CWnd* pParent /*=NULL*/)
: CDialog(CbombplaneDlg::IDD, pParent)
,GuessZone(4,true)
,SetZone(3,false)
, ZoneGuide(_T(""))
, GameState(_T(""))
{
	sock_c = 0;
	sock_s =0;
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	This = this;
	IsURStart = false;
	BombedPlanes = 0;
}
//initialize
CMsg CbombplaneDlg::msg;
CbombplaneDlg* CbombplaneDlg::This= 0;


void CbombplaneDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_CREATE, CreateBtn);
	DDX_Control(pDX, IDC_CONNECT, ConnetBtn);
	DDX_Control(pDX, IDC_DISCONN, diconBtn);
	DDX_Control(pDX, IDC_RICHCHAT, chatWnd);
	DDX_Text(pDX, IDC_CHATINPUT, chatInput);
	DDX_CBString(pDX, IDC_YOURIP, YourIP);
	DDV_MaxChars(pDX, YourIP, 15);
	DDX_Control(pDX, IDC_YOURIP, ComboIP);
	DDX_Control(pDX, IDC_CHATINPUT, ChatInputEdit);
	DDX_Control(pDX, IDC_SENDCHAT, SendIt);
	DDX_Control(pDX, IDC_BEGIN, GameBeginEnd);

	DDX_Control(pDX, IDC_BOMBPLANE, GuessZone);
	DDX_Control(pDX, IDC_SETPLANE, SetZone);
	DDX_Text(pDX, IDC_GUIDE, ZoneGuide);
	DDX_Text(pDX, IDC_STATE, GameState);
}

BEGIN_MESSAGE_MAP(CbombplaneDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_DESTROY()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_SENDCHAT, OnBnClickedSendChat)
	ON_BN_CLICKED(IDC_CONNECT, OnBnClickedConnect)
	ON_BN_CLICKED(IDC_CREATE, OnBnClickedCreate)
	ON_BN_CLICKED(IDC_DISCONN, OnBnClickedDisconn)
	ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
	ON_BN_CLICKED(IDC_HELPER, OnBnClickedHelper)
	ON_BN_CLICKED(IDC_CLEARUP, OnBnClickedClearup)
	ON_WM_RBUTTONUP()
	ON_BN_CLICKED(IDC_BEGIN, OnBnClickedStart)
	ON_WM_LBUTTONUP()
	ON_WM_MBUTTONUP()
END_MESSAGE_MAP()


BOOL CbombplaneDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	GuessZone.OnInit();
	SetZone.OnInit();

	ReadIpList();

   I_Just_Executed_This_App();
	//TODO: add my IP str..
	return TRUE;
}

//////////////////////////////////////////////////////////
// called by callback function
//收到对方发出的确认位置信息。
//
//

UINT Result[4]={0,IDS_GS_URTURN_N,IDS_GS_URTURN_B,IDS_GS_URTURN_H};
//oponent send the result...
bool CbombplaneDlg::OnRcvHit(CMsg* rcv_msg){
	_tag tag = (_tag)rcv_msg->PosX;
	UINT x = rcv_msg->PosY>>16;
	UINT y = rcv_msg->PosY & 0x0000FFFF;

	ASSERT(Hitx==x&&Hity==y);
	ASSERT(tag==tagBODY || tag==tagHEAD || tag==tagNONE);

	CTagPos pos(x,y);
	GuessZone.SetFlag(pos,tag);
	SetGameState(Result[tag]);

	It_Is_Ur_Turn_Now();

   return true;
}

bool CbombplaneDlg::OnRcvLose(CMsg* rcv_msg){
	if((rcv_msg->state)>stBACK){
      I_Am_Win_U_Abort();
	}else{
		ASSERT(Hitx==rcv_msg->PosX&&Hity==rcv_msg->PosY);
		CTagPos pos(rcv_msg->PosX,rcv_msg->PosY);
		GuessZone.SetFlag(pos,tagHEAD);
		I_Am_Winner();	
	}
	return true;
}

bool CbombplaneDlg::OnRcvPos(CMsg* rcv_msg){
	DUMP(L"pos sig");
	CTagPos pos(rcv_msg->PosX,rcv_msg->PosY);
	_tag tag = SetZone.IsBombed(pos.x,pos.y);

	//I lose...
	if(tag == tagHEAD){
		++BombedPlanes;
		if(BombedPlanes == 3){
			I_Am_Loser_3_Bombed();
			SetZone.SetFlag(pos,tag);
			msg.Set4Lose(pos.x,pos.y);
			SendMsg(msg);
			return true;
		}
	}

#ifdef _DEBUG
if(tag == tagHEAD)ASSERT(BombedPlanes<3);
#endif

	ASSERT(tag == tagBODY || tag == tagNONE || tag == tagHEAD);
	SetZone.SetFlag(pos,tag);
	//
   msg.Set4Hit(tag,pos.x,pos.y);
	SendMsg(msg);

	It_Is_My_Turn_Now();
	return true;
}

bool CbombplaneDlg::OnRcvChat(CMsg* rcv_msg){
	DUMP(L"Chat sig");
	InsertChat(rcv_msg->str);
	//SendMsg(msg);
	return true;
}

bool CbombplaneDlg::OnRcvConn(CMsg* rcv_msg){

	if((rcv_msg->state)>stBACK){
		//msg from sever
		DUMP(L"Conn back sig");
		InsertState(IDS_CONNECT);
		WriteIpList();
	}else{
		//Msg from client
		DUMP(L"Conn sig");
		InsertState(IDS_CONNBACK);
		msg.Set4Conn(true);
		SendMsg(msg);
	}

	//client and server connect successful 
   U_And_Me_Connected();
	return true;
}

bool CbombplaneDlg::OnRcvDisc(CMsg* /*rcv_msg*/){
	DUMP(L"Disc sig");
	CString str;
	InsertState(IDS_DISCONN);
	msg.Set4Disc();
	OnBnClickedDisconn();
	return false;
}


bool CbombplaneDlg::OnRcvStart(CMsg* rcv_msg){

	if((rcv_msg->state)>stBACK){//back
      You_Stated_too_But_I_1st();
	}else{
		IsURStart = true;
		U_Started_Waiting_4_Me();
	}
	return true;
}

bool CbombplaneDlg::OnRcvNone(CMsg* /*rcv_msg*/){
	DUMP(L"none sig");
	InsertInfo(IDS_NONESIG);
	return true;
}

void CbombplaneDlg::OnErrorDisc(UINT info){
	InsertInfo(info);
	We_Are_Disconnected();
	msg.Set4Disc();
	OnBnClickedDisconn();
}

CCntSock* CbombplaneDlg::OnAccept()
{
	sock_c = new CCntSock((RcvCallBack)Dispatch,(DisConnBack)DisConnect);
	SendIt.EnableWindow();
	return sock_c;
}

//////////////////////////////////////////////////
//
// Button event
//

void CbombplaneDlg::OnBnClickedSendChat()
{
	UpdateData();
	chatInput.Trim(L' ');
	if(chatInput.GetLength()>0)
	{
		chatInput.Append(L"\n");
		msg.Set4Chat(chatInput);
		if(sock_c)
		{
			SendMsg(msg);
			InsertChat(chatInput);
		}     
	}
	chatInput.Empty();
	UpdateData(FALSE);
	ChatInputEdit.SetFocus();
}


//Greate or connect. otherwise,can do nothing else.
void CbombplaneDlg::OnBnClickedCreate()
{
	I_Clicked_Created();

	sock_s = new CSvrSock((AcptCallBack)onAccept,(DisConnBack)DisConnect);
	InsertInfo(IDS_CREATE_CLK);
	sock_s->BeginListen();
}

void CbombplaneDlg::OnBnClickedConnect()
{
	I_Clicked_Connect();

	sock_c = new CCntSock((RcvCallBack)Dispatch,(DisConnBack)DisConnect);
	InsertInfo(IDS_CONN_CLK);
	UpdateData();//get your ip
	sock_c->BeginConnect(YourIP);
	if(!msg.IsDiscSignal())
	{
		msg.Set4Conn();
		SendMsg(msg);
	}

	//than waiting for server send back...
}


void CbombplaneDlg::OnBnClickedDisconn()
{
	We_Are_Disconnected();

	InsertInfo(IDS_DISCING);

	if(!msg.IsDiscSignal()){

		if(sock_c){
			msg.Set4Disc();
			SendMsg(msg);
		}
	}
	msg.Set4None();
	try{
		if(sock_c){
			delete sock_c;
			sock_c=0;
		}
		if(sock_s){
			delete sock_s;
			sock_s=0;
		}
	}catch(CException* e)
	{
		e->Delete();
		sock_c=0;
		sock_s=0;
		InsertState(IDS_EX_REBOOT);
	}
}

void CbombplaneDlg::OnBnClickedCancel()
{
	OnBnClickedDisconn();
	OnCancel();
}

void CbombplaneDlg::OnBnClickedStart()
{
	CString st;
	CString tit;

	st.LoadString(IDS_BTN_AB);
	GameBeginEnd.GetWindowText(tit);
	if(tit == st){
		I_Am_Loser_Abort();
		msg.Set4Lose(0,0,true);
		SendMsg(msg);
		return;
	}

	st.LoadString(IDS_BTN_NW);
	if(tit == st){
		Start_A_New_Turns();
		return;
	}

	//2nd click
	if(IsURStart){
		I_Am_2nd_Start_Wait_U_Guess();
		msg.Set4Start(true);
		SendMsg(msg);
	//1st click
	}else{
      I_Am_1st_Started_Plz_Quick();
		msg.Set4Start();
		SendMsg(msg);
	}
}

///////////////////////////////////////////////////
//
//mouse operate for PlayZone
//
bool CbombplaneDlg::IsGuessZone(CPoint& point) const{
	CPoint pt(point);
	CRect rect;
	GuessZone.GetWindowRect(&rect);
	ScreenToClient(&rect);
	if(rect.PtInRect(pt))
	{
		ClientToScreen(&pt);
		GuessZone.ScreenToClient(&pt);
		point = pt;
		return true;
	}
	return false;
}

bool CbombplaneDlg::IsSetZone(CPoint& point)const{
	CPoint pt(point);
	CRect rect;
	SetZone.GetWindowRect(&rect);
	ScreenToClient(&rect);
	if(rect.PtInRect(pt))
	{
		ClientToScreen(&pt);
		SetZone.ScreenToClient(&pt);
		point = pt;
		return true;
	}
	return false;
}

void CbombplaneDlg::OnRButtonUp(UINT nFlags, CPoint point)
{
	if(IsGuessZone(point)){
      GuessZone.OnGuessRButtonUp(point);
		return;
	}
	//SetZone No need RB
   CDialog::OnRButtonUp(nFlags, point);
}

void CbombplaneDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
	if(IsGuessZone(point)){
		int x,y;
      if(GuessZone.OnGuessLButtonUp(point,x,y))
		{
			msg.Set4Pos(x,y);
			Hitx = x;Hity = y;
			SendMsg(msg);
			I_Guessed_Wait_Result();
		}
		return;
	}
	//SetZone No need LB
   CDialog::OnRButtonUp(nFlags, point);
}

void CbombplaneDlg::OnMButtonUp(UINT nFlags, CPoint point)
{
	if(IsGuessZone(point)){
      MBU st = GuessZone.OnMButtonUp(point);
		if(st!=mbNONE)MBU2Guide(st,true);
	}

	if(IsSetZone(point)){
      MBU st = SetZone.OnMButtonUp(point);
		if(st!=mbNONE)MBU2Guide(st,false);
	}

   CDialog::OnMButtonUp(nFlags, point);
}

//mbNONE=0,mbDEL=1,mbMax=2,mbSEL=3,mbCANT=4,mbOKMAX=5,mbNEXT=6,mbCANCEL=7
UINT MbuGuide[2][8]={
	{0,IDS_GU_DEL_SET,IDS_GU_MAXNUM_SET,IDS_GU_SELTAIL,IDS_GU_CANNOTSET,
      IDS_GU_OK_MAXNUM_SET,IDS_GU_OK_GONO_SET,IDS_GU_CANCEL_SET},
	{0,IDS_GU_DEL_GUESS,IDS_GU_MAXNUM_GUESS,IDS_GU_SELTAIL,IDS_GU_CANNOTSET,
		IDS_GU_OK_MAXNUM_GUESS,IDS_GU_OK_GONO_GUESS,IDS_GU_CANCEL_GUESS},
};

void CbombplaneDlg::MBU2Guide(MBU mbu,bool isGuess)
{
	UINT IDS_id;
	if(isGuess){
		IDS_id = MbuGuide[1][mbu];
	}else{
		IDS_id = MbuGuide[0][mbu];
		if(mbu==mbDEL)SetZoneNotDone();
		if(mbu==mbOKMAX)SetZoneDone();
	}
	SetGameGuide(IDS_id);
}

const int IPNum = 5;
void CbombplaneDlg::ReadIpList()
{
	CWinApp* pApp = AfxGetApp();
	CString tGet;
	CString entry;
	for(int i = 0;i<IPNum;++i){
		entry.Format(L"IP%d",i);
		tGet = pApp->GetProfileString(L"IpList", entry);
		if(tGet.GetLength()>0)
		{
			IpList.Add(tGet);
         ComboIP.AddString(tGet);
		}
	}
}

void CbombplaneDlg::WriteIpList()
{	
	if(YourIP.GetLength()<1)return;   
	CString str;
	for(int i = 0;i<IpList.GetCount();++i){
		str = IpList.GetAt(i);
		if(str == YourIP)return;
	}


	ComboIP.AddString(YourIP);

	if(IpList.GetCount()>4)
      IpList.RemoveAt(IpList.GetCount()-1);
	IpList.InsertAt(0,YourIP);
	CString entry;

	CWinApp* pApp = AfxGetApp();
	for(int i = 0;i<IpList.GetCount();++i){
		entry.Format(L"IP%d",i);
		pApp->WriteProfileString(L"IpList", entry,IpList.GetAt(i));
	}
}

⌨️ 快捷键说明

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