📄 gameview.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 + -