btwin.cpp

来自「网络战船游戏」· C++ 代码 · 共 260 行

CPP
260
字号
/*
 * Batalla Naval - Cliente para Win16
 * por Horacio Pe馻
 */

#include "btwin.h"

struct tagstatus {
		char	Bar4,Bar3,Bar2,Bar1;
		} ;
typedef struct tagstatus status;
typedef char 	tablero[100];
typedef char   nomjug[22];
void inline		Linea(HDC hdc,int orgx,int orgy,int desx,int desy) {MoveTo(hdc,orgx,orgy);LineTo(hdc,desx,desy);}
/* Variables globales*/
char 					szProgName[]="Batalla Naval para Win16";
char					tab 		 []="Control para tableros";
char					stat 		 []="Control para status";
WSADATA				Wsadata;
SOCKET				sock;
HINSTANCE 			hInstancia;
int		   		estado=BTW_NO_CONECTADO;
HWND					VentPrinc;
char 					servidor[200];
int					puerto;
nomjug				jugador;
char					tmp_gethost[MAXGETHOSTSTRUCT];
char 					Error[250];
char					jug;
struct protocolo	proto;
tablero				tableros[6];
nomjug				jugadores[5];
status				sta[5];

#pragma argsused
int PASCAL WinMain(HINSTANCE hInst,HINSTANCE hPreInst,
						 LPSTR lpszCmdLine,int nCmdShow)
{
  MSG  lpMsg;
  WNDCLASS wcApp;
  int tmp,tmp2;

  hInstancia=hInst;
  for(tmp2=0;tmp2<6;tmp2++)
		for(tmp=0;tmp<100;tmp++)
				tableros[tmp2][tmp]=0;
  for(tmp=0;tmp<5;tmp++)
		{sta[tmp].Bar4=-1;sta[tmp].Bar3=-1,sta[tmp].Bar2=-1,sta[tmp].Bar1=-1;}

  if (!hPreInst) {
		wcApp.lpszClassName=szProgName;
		wcApp.hInstance    =hInst;
		wcApp.lpfnWndProc  =WndProc;
		wcApp.hCursor      =LoadCursor(NULL,IDC_ARROW);
		wcApp.hIcon        =LoadIcon(hInst,"1");
		wcApp.lpszMenuName =NULL;
		wcApp.hbrBackground=GetStockObject(WHITE_BRUSH);
		wcApp.style        =CS_HREDRAW|CS_VREDRAW;
		wcApp.cbClsExtra   =0;
		wcApp.cbWndExtra   =0;
		if (!RegisterClass (&wcApp)) {
				sprintf(Error,"Error registrando clase %s",wcApp.lpszClassName);
				MessageBox(NULL,Error,szProgName,MB_ICONSTOP);
				return FALSE;
				}
		wcApp.lpszClassName=tab;
		wcApp.hInstance    =hInst;
		wcApp.lpfnWndProc  =tabProc;
		wcApp.hCursor      =LoadCursor(NULL,IDC_ARROW);
		wcApp.hIcon        =NULL;
		wcApp.lpszMenuName =NULL;
		wcApp.hbrBackground=GetStockObject(WHITE_BRUSH);
		wcApp.style        =CS_HREDRAW|CS_VREDRAW;
		wcApp.cbClsExtra   =0;
		wcApp.cbWndExtra   =sizeof(LONG)*2;
		if (!RegisterClass (&wcApp)) {
				sprintf(Error,"Error registrando %s",wcApp.lpszClassName);
				MessageBox(NULL,Error,szProgName,MB_ICONSTOP);
				return FALSE;
				}
		wcApp.lpszClassName=stat;
		wcApp.hInstance    =hInst;
		wcApp.lpfnWndProc  =staProc;
		wcApp.hCursor      =LoadCursor(NULL,IDC_ARROW);
		wcApp.hIcon        =NULL;
		wcApp.lpszMenuName =NULL;
		wcApp.hbrBackground=GetStockObject(WHITE_BRUSH);
		wcApp.style        =CS_HREDRAW|CS_VREDRAW;
		wcApp.cbClsExtra   =0;
		wcApp.cbWndExtra   =sizeof(LONG)*2;
		if (!RegisterClass (&wcApp)) {
				sprintf(Error,"Error registrando %s",wcApp.lpszClassName);
				MessageBox(NULL,Error,szProgName,MB_ICONSTOP);
				return FALSE;
				}
		}
  tmp=WSAStartup(0x101,&Wsadata);
  if(tmp!=0) {
		sprintf(Error,"Error en WSAStartup: %d",tmp);
		MessageBox(NULL,Error,szProgName,MB_ICONSTOP);
		return 0;
		}
  sock=0;
  sock=socket(PF_INET,SOCK_STREAM,0);
  if(sock==INVALID_SOCKET) {
		sprintf(Error,"Error en socket: %d",WSAGetLastError());
		MessageBox(NULL,Error,szProgName,MB_ICONSTOP);
		WSACleanup();
		return 0;
		}

  VentPrinc=CreateWindow(szProgName,szProgName,
						  WS_CAPTION|WS_CLIPCHILDREN|WS_MAXIMIZE|
						  WS_MINIMIZEBOX|WS_POPUPWINDOW|WS_VISIBLE,
						  0,0,640,480,
						  (HWND)NULL,(HMENU)NULL,
						  (HANDLE)hInstancia,(LPSTR)NULL);
  ShowWindow(VentPrinc,nCmdShow);
  UpdateWindow(VentPrinc);
  while (GetMessage(&lpMsg,NULL,NULL,NULL)) {
	 TranslateMessage(&lpMsg);
	 DispatchMessage(&lpMsg);
  }

  if(estado>=BTW_CONECTADO)
		bnwrite(sock,"",BNEXT,0,0,jug);
  closesocket(sock);
  WSACleanup();
  return(lpMsg.wParam);
}

LONG FAR PASCAL WndProc(HWND hWnd,UINT messg,
								WPARAM wParam,LPARAM lP)
	{
	DLGPROC			dlgproc;
	PAINTSTRUCT 	ps;
	HDC 				hdc;
	/* para conectar */
	u_long			addr;
	sockaddr_in		ca;
	int				i,j;

	switch (messg)
			{
			case WM_CREATE:
					CreateWindow("button","Conectar",WS_VISIBLE|BS_PUSHBUTTON|
							WS_CHILD, 40,420,160,35,hWnd,(HMENU)ID_Accion,
							hInstancia, NULL);
					CreateWindow("button","Enviar Mensaje",WS_VISIBLE|BS_PUSHBUTTON|
							WS_CHILD|WS_DISABLED,240,420,160,35,hWnd,
							(HMENU)ID_Mensaje, hInstancia, NULL);
					CreateWindow("button","Salir",WS_VISIBLE|BS_PUSHBUTTON|
							WS_CHILD,440,420,160,35,hWnd,(HMENU)ID_Salir,
							hInstancia, NULL);
					CreateWindow("static","No conectado",WS_VISIBLE|WS_BORDER|
							WS_CHILD,30,380,580,20,hWnd,(HMENU)ID_Txtmsj,
							hInstancia, NULL);

					CreateWindow(tab,"",WS_VISIBLE|WS_CHILD,
							 39, 24,161,161,hWnd,(HMENU)ID_tab+1,
							hInstancia, (void*) MAKELONG(1,ID_tab+1));
					CreateWindow("static","",WS_VISIBLE|WS_CHILD|SS_RIGHT,
							 39,  6,161, 17,hWnd,(HMENU)ID_nom+1,
							hInstancia, NULL);
					CreateWindow(tab,"",WS_VISIBLE|WS_CHILD,
							239, 24,161,161,hWnd,(HMENU)ID_tab+2,
							hInstancia, (void*) MAKELONG(2,ID_tab+2));
					CreateWindow("static","",WS_VISIBLE|WS_CHILD|SS_RIGHT,
							239,  6,161, 17,hWnd,(HMENU)ID_nom+2,
							hInstancia, NULL);
					CreateWindow(tab,"",WS_VISIBLE|WS_CHILD,
							440, 24,161,161,hWnd,(HMENU)ID_tab+3,
							hInstancia, (void*) MAKELONG(3,ID_tab+3));
					CreateWindow("static","",WS_VISIBLE|WS_CHILD|SS_RIGHT,
							440,  6,161, 17,hWnd,(HMENU)ID_nom+3,
							hInstancia, NULL);
					CreateWindow(tab,"",WS_VISIBLE|WS_CHILD,
							 39,209,161,161,hWnd,(HMENU)ID_tab+4,
							hInstancia, (void*) MAKELONG(4,ID_tab+4));
					CreateWindow("static","",WS_VISIBLE|WS_CHILD|SS_RIGHT,
							 39,191,161, 14,hWnd,(HMENU)ID_nom+4,
							hInstancia, NULL);
					CreateWindow(tab,"",WS_VISIBLE|WS_CHILD,
							239,209,161,161,hWnd,(HMENU)ID_tab+5,
							hInstancia, (void*) MAKELONG(5,ID_tab+5));
					CreateWindow("static","",WS_VISIBLE|WS_CHILD|SS_RIGHT,
							239,191,161, 14,hWnd,(HMENU)ID_nom+5,
							hInstancia, NULL);
					CreateWindow(stat,"",WS_VISIBLE|WS_CHILD,
							440,209,161,161,hWnd,(HMENU)ID_sta,
							hInstancia, (void*) MAKELONG(0,ID_sta));
					break;
			case WM_PAINT:
					hdc=BeginPaint(hWnd,&ps);
					MoveTo(hdc,  0,410);
					LineTo(hdc,640,410);
					ValidateRect(hWnd,NULL);
					EndPaint(hWnd,&ps);
					break;
			case WM_DESTROY:
					PostQuitMessage(0);
					break;
			case WM_COMMAND:
					switch( wParam ) {
							case ID_Accion:
									switch( estado ) {
											case BTW_NO_CONECTADO: /* Conectar */
													dlgproc= (DLGPROC) MakeProcInstance(
																		(FARPROC) DConectar,
																		hInstancia);
													if(DialogBox(hInstancia,"CONECTAR_A",
																		hWnd,dlgproc)) {
															EnableWindow(GetDlgItem(hWnd,ID_Accion),
																		FALSE);
															estado=BTW_BUSCANDO_SERVER;
															sprintf(Error,"Haciendo busqueda en DNS");
															SetDlgItemText(hWnd,ID_Txtmsj,Error);
															} /* if(Dialog) */
													break;
											case BTW_CONECTADO: /* Mandar tablero */
													dlgproc= (DLGPROC) MakeProcInstance(
																		(FARPROC) DMandtab,
																		hInstancia);
													if(DialogBox(hInstancia,"MANDARTAB",
																		hWnd,dlgproc)) {
															EnableWindow(GetDlgItem(hWnd,ID_Accion),
																		FALSE);
															estado=BTW_TABLERO_MANDADO;
															sprintf(Error,"Tablero mandado. Esperando respuesta.");
															SetDlgItemText(hWnd,ID_Txtmsj,Error);
															} /* if(Dialog) */
																												break;
											case BTW_LISTO:
													bnwrite(sock,"",BNSTR,0,0,jug);
													EnableWindow(GetDlgItem(hWnd,ID_Accion),
															FALSE);
													estado=BTW_EMPEZANDO;
													sprintf(Error,"Vamos a jugar.");
													SetDlgItemText(hWnd,ID_Txtmsj,Error);
													break;
											} /* switch(estado) */
									break; /* case ID_Accion */
							case ID_Mensaje:
									dlgproc= (DLGPROC) MakeProcInstance(
														(FARPROC) DMensaje,
														hInstancia);
									DialogBox(hInstancia,"MANDARMSJ",
														NULL,dlgproc);
									break;
							case ID_Salir:
									DestroyWindow(hWnd);
									break;
							case ID_tab+1:
							case ID_tab+2:
							case ID_tab+3:
							case ID_tab+4:
							case ID_tab+5:
									if(estado!=BTW_MI_TURNO) {
											if(estado==BTW_JUGANDO)
												sprintf(Error," 

⌨️ 快捷键说明

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