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

📄 gameview.cpp

📁 利用UDP写的一个双人网上对战的迷宫游戏!VC
💻 CPP
字号:
// GameView.cpp : implementation of the CGameView class
//

#include "stdafx.h"
#include "Game.h"

#include "GameDoc.h"
#include "GameView.h"
#include "GameMapMake.h"
#include "GAMELOGIN.h"

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

/////////////////////////////////////////////////////////////////////////////
// CGameView

IMPLEMENT_DYNCREATE(CGameView, CView)

BEGIN_MESSAGE_MAP(CGameView, CView)
	//{{AFX_MSG_MAP(CGameView)
	ON_WM_KEYDOWN()
	//}}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)

	ON_MESSAGE(WM_BEGIN,OnBeginGame)
	ON_MESSAGE(WM_GO,OnGoGame)
	ON_MESSAGE(WM_CHANGE,OnChange)
	ON_MESSAGE(WM_OVER,OnOver)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGameView construction/destruction

CGameView::CGameView()
{
	mx=0;
	my=1;
	nx=0;
	ny=1;
}

CGameView::~CGameView()
{
}

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

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CGameView drawing

void CGameView::OnDraw(CDC* pDC)
{
	CGameDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	if(GameClass==1)
	{		
		GameBegin=1;
		DrawMap();
	}
	if(GameClass==2)
	{
		MPerson=1;
		GameClass=0;
		InitSocket();
		RECVPARAM *pRecvParam=new RECVPARAM;
		pRecvParam->sock=m_socket;
		pRecvParam->hwnd=m_hWnd;
		HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);
		CloseHandle(hThread);
		if(CreateClass==0)
		{			
			GameBegin=1;
		}
		if(CreateClass==1)
		{
			CreateClass=0;
			pDC->TextOut(450,250,"等待玩家加入中...");
		}
		if(CreateClass==2)
		{
	        char *strSend="A";
			SOCKADDR_IN addrTo;
			addrTo.sin_family=AF_INET;
			addrTo.sin_port=htons(7777);
			addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
			SendMessage(strSend,addrTo);
			pDC->TextOut(450,250,"等待玩家响应开始...");
		}		
	}
}

/////////////////////////////////////////////////////////////////////////////
// CGameView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CGameView diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CGameView message handlers

void CGameView::DrawMap()
{
	CDC * pDC=GetWindowDC();
	int i,j;
	for(i=0;i<LENTH;i++)
	{
		for(j=0;j<WIDTH;j++)
		{
			if (map[i][j]==1)
			{
				DrawPerson(j,i,0,0,1);
			}
			else
			if (map[i][j]==3)
			{
				DrawPerson(j,i,0,0,2);
			}
			else 
			if (map[i][j]==5)
			{
				pDC->Rectangle(j*20,i*20,10+j*20,10+i*10);
			}
		}
	}
	DrawPerson(0,0,my,mx,3);
	if (GameClass==2) DrawPerson(0,0,ny,nx,4);
	ReleaseDC(pDC);
}

BOOL CGameView::InitSocket()
{
	m_socket=socket(AF_INET,SOCK_DGRAM,0);
	if(INVALID_SOCKET==m_socket)
	{
		MessageBox("套接字创建失败!");
		return FALSE;
	}
	SOCKADDR_IN addrSock;
	addrSock.sin_family=AF_INET;
	addrSock.sin_port=htons(7777);
	addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);
    
    addrFrom.sin_family=AF_INET;
	addrFrom.sin_port=htons(7777);
	addrFrom.sin_addr.S_un.S_addr=htonl(dwIP);
	

	int retval;
	retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));
	if(SOCKET_ERROR==retval)
	{
		closesocket(m_socket);
		MessageBox("绑定失败!");
		return FALSE;
	}
	return TRUE;
}

DWORD WINAPI CGameView::RecvProc(LPVOID lpParameter)
{
	SOCKET sock=((RECVPARAM*)lpParameter)->sock;
	HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;
	delete lpParameter;	

	int len=sizeof(SOCKADDR);

	char recvBuf[4000];
	//char tempBuf[300];
	int retval;
	while(TRUE)
	{
		retval=recvfrom(sock,recvBuf,4000,0,(SOCKADDR*)&addrFrom,&len);
		if(SOCKET_ERROR==retval)
			break;
		if(recvBuf[0]=='A')
		{
			::PostMessage(hwnd,WM_BEGIN,0,0);			
		}
		if(recvBuf[0]=='B')
		{
			::PostMessage(hwnd,WM_GO,0,(LPARAM)recvBuf);
		}
		if(recvBuf[0]=='C')
		{
			::PostMessage(hwnd,WM_CHANGE,0,(LPARAM)recvBuf);
		}
		if(recvBuf[0]=='D')
		{
			::PostMessage(hwnd,WM_OVER,0,0);
		}
	}
	return 0;
}

void CGameView::OnBeginGame(WPARAM wParam,LPARAM lParam)
{
	MessageBox("有玩家加入,立即开始?");	
	GameBegin=1;
	GameClass=1;
	char strSend[4000]="B";
	int count=0;
	count++;
	for(int i=0;i<LENTH;i++)
	{
		for(int j=0;j<WIDTH;j++)
		{
            strSend[count]=map[i][j]+48;
			count++;
		}
	}	
	SendMessage(strSend,addrFrom);
	Invalidate();
}

void CGameView::OnGoGame(WPARAM wParam,LPARAM lParam)
{
	char *mapclient=(char*)lParam;
	int count=1;
	for(int i=0;i<LENTH;i++)
	{
		for(int j=0;j<WIDTH;j++)
		{
			map[i][j]=(int)(mapclient[count++]-48);
		}
	}
	GameClass=1;
	Invalidate();
}

void CGameView::OnChange(WPARAM wParam,LPARAM lParam)
{
    char *move=(char*)lParam;
	int orginx=(int)(move[1]-48);
	int orginy=(int)(move[2]-48);
	nx=(int)(move[3]-48);
	ny=(int)(move[4]-48);
	DrawPerson(orginy,orginx,ny,nx,4,1);
}

void CGameView::SendMessage(char*strSend,SOCKADDR_IN addrTo)
{
	sendto(m_socket,strSend,strlen(strSend)+1,0,
		(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
}

void CGameView::Move(UINT nChar)
{
	int x,y;
	switch(nChar)
	{
	case VK_UP:
			if(mx-1>=0)
				if(map[mx-1][my]==0 || map[mx-1][my]==3)
				{
					x=mx;
					y=my;
					mx=mx-1;
					if(MPerson)
					{
						char strSend[6]="C";
						strSend[1]=(char)(x+48);
						strSend[2]=(char)(y+48);
						strSend[3]=(char)(mx+48);
						strSend[4]=(char)(my+48);
						SendMessage(strSend,addrFrom);
					}
				}
				break;
		case VK_RIGHT:
			if(my+1<WIDTH-1)
				if(map[mx][my+1]==0 || map[mx][my+1]==3)
				{
					x=mx;
					y=my;
					my=my+1;
					if(MPerson)
					{
						char strSend[6]="C";
						strSend[1]=(char)(x+48);
						strSend[2]=(char)(y+48);
						strSend[3]=(char)(mx+48);
						strSend[4]=(char)(my+48);
						SendMessage(strSend,addrFrom);
					}
				}break;
		case VK_DOWN:
			if(mx+1<LENTH)
				if(map[mx+1][my]==0 || map[mx+1][my]==3)
				{
					x=mx;
					y=my;
					mx=mx+1;
					if(MPerson)
					{
						char strSend[6]="C";
						strSend[1]=(char)(x+48);
						strSend[2]=(char)(y+48);
						strSend[3]=(char)(mx+48);
						strSend[4]=(char)(my+48);
						SendMessage(strSend,addrFrom);
					}
				}break;
		case VK_LEFT:
			if(my-1>=0)
				if(map[mx][my-1]==0 || map[mx][my-1]==3)
				{

					x=mx;
					y=my;
					my=my-1;
					if(MPerson)
					{
						char strSend[6]="C";
						strSend[1]=(char)(x+48);
						strSend[2]=(char)(y+48);
						strSend[3]=(char)(mx+48);
						strSend[4]=(char)(my+48);
						SendMessage(strSend,addrFrom);
					}
				}break;
	}
	DrawPerson(y,x,my,mx,3,1);
	if (map[mx][my]==3) GameOver();
}

void CGameView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	if(GameBegin)
	{
		Move(nChar);		
	}
	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CGameView::DrawPerson(int x1, int y1, int x2, int y2, int flag, int flag2)
{	
	CBitmap headbmp;
	CBitmap headbmp2;
	CBitmap cleanbmp;
	CBitmap wallbmp;
	CBitmap endbmp;

	headbmp.LoadBitmap(IDB_HEAD1);
	headbmp2.LoadBitmap(IDB_HEAD2);
	cleanbmp.LoadBitmap(IDB_CLEAN);
	wallbmp.LoadBitmap(IDB_WALL);	
	endbmp.LoadBitmap(IDB_END);
	

	CDC dcMemory;
	CDC* pDC=GetDC();
	dcMemory.CreateCompatibleDC(pDC);

	if (flag==1)
	{
		dcMemory.SelectObject(&wallbmp);
		pDC->BitBlt(x1*20,y1*20,20+x1*20,20+y1*20,&dcMemory,0,0,SRCCOPY);
	}
	
	if (flag==2)
	{
		dcMemory.SelectObject(&endbmp);
		pDC->BitBlt(x1*20,y1*20,20+x1*20,20+y1*20,&dcMemory,0,0,SRCCOPY);
	}

	if (flag2==1)
	{
		dcMemory.SelectObject(&cleanbmp);
		pDC->BitBlt(x1*20,y1*20,19+x1*20,19+y1*20,&dcMemory,0,0,SRCCOPY); 
	}

	if (flag==3)
	{
		dcMemory.SelectObject(&headbmp);
		pDC->BitBlt(x2*20,y2*20,19+x2*20,19+y2*20,&dcMemory,0,0,SRCCOPY);
	}

	if (flag==4)
	{
		dcMemory.SelectObject(&headbmp2);
		pDC->BitBlt(x2*20,y2*20,19+x2*20,19+y2*20,&dcMemory,0,0,SRCCOPY);
	}
	ReleaseDC(pDC);
}

void CGameView::GameOver()
{
    
	
	if(MPerson)
	{
		char *strSend="D";
		SendMessage(strSend,addrFrom);
	}
	MessageBox("恭喜你获胜!!!");
	Init();

}

void CGameView::OnOver(WPARAM wParam,LPARAM lParam)
{
	MessageBox("很遗憾,你输了!!");
	Init();
}

void CGameView::Init()
{
	GameClass=0;
	CreateClass=0;
	dwIP=0;	
	GameBegin=0;
  	MPerson=0;
	mx=1;
	my=1;
	CGAMELOGIN gldlg;  
	gldlg.DoModal();
	closesocket(m_socket);
	Invalidate();
}

⌨️ 快捷键说明

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