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

📄 xbnclient.c

📁 网络战船游戏
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Batalla Naval (c) 1995,96,97,98 Ricardo Quesada * (rquesada@dc.uba.ar) *  * Cliente X  * version: 0.60 *   * Depende de las librerias xview *//* *  New in v0.50 * -------------- * - Tiene un cliente 'inteligente' *  * - No usa las librerias SlingShot: Estas librerias no las use porque no las  * tenia en Debian, y en vez de portalas decidi modificar el juego. *  * - Esta version igual depende en las 'buggy' librerias xview. Tiene algunos  * bugs corregidos, aunque creo que todavia quedan algunos sueltos por ahi. * *//* * Includes de X y de las xview  */#include <X11/Xlib.h> #include <xview/xview.h> #include <xview/window.h> #include <xview/openmenu.h> #include <xview/panel.h>#include <xview/canvas.h>#include <xview/xv_xrect.h>#include <xview/frame.h>#include <xview/cms.h>#include <xview/notify.h>#include <xview/svrimage.h>     #include <xview/icon.h>         #include <xview/ttysw.h>        /*  * includes para sockets y otras yerbas  */#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>#include <netdb.h>#include <stdio.h>#include <syslog.h>#include <errno.h>#include <string.h>#include "../share/protocol.h"           /* definicion del protocolo */#include "../share/tablas.h"             /* boards for win,lost,etc. new on v0.30 */#include "batnav.icon.h"        /* fucking icono *//* * Defines */ #define  WHITE  0  #define  BLACK  1#define  BLUE   2#define  GREEN  3#define  LBLUE  4#define  YELLOW 5#define  RED    6#define MAXPLAYER 5#define BN_XVER "0.60"#define BN_XVERH 0#define BN_XVERL 60#define LARGO 20#define ANCHO 20#define RAPID 10                       /* the lower, more time for select() *//*  *                   VARIABLES GLOBALES */int sock;struct sockaddr_in server;struct hostent *host_info;char mitabla[10][10];          /* mi tabla de barcos */char barquitos[4];             /* tama;os de los barcos 1 de 4, 2 de 3, etc. */short int x,y;                 /* punteros de la tabla mia */Frame  frame,           /* frame principal que contiene todo */       subframe1,       /* ventana about */       subframe2,       /* ventana de config */       subframe3;       /* ventana de sendmsg */Panel  panel,           /* contenedor de los botones */       panelcito,       /* connect/disconnect button */       panelinfo,       /* config button */       panelcit2,       /* send board/start button */       panel3,          /* contenedor de sendmsg */       panelcit3,       /* players button */       panelcit4,       /* sendmsg button */       panelcit5;       /* status button */Canvas canvas,           /* del about */       canvas_mib,       /* de miboard ya que no uso las sspkg */       canvas_tub,       /* de tuboard - v0.50 */       canvas_min,       /* nombre de mi board */       canvas_tun;       /* nombre de tu board */Menu menu;Menu_item mi[MAXPLAYER];                 /* new on v0.36 *//*  * I think that these variables could be put locally . * solo sera cuestion de probar ya que este codigo tiene * mas de 2 a駉s de antiguedad */Cms cms;                                 /* Colores */Server_image icon_image;                 /* Icono v0.31 */Icon icon;                               /* Icono v0.31 */Tty  tty;                                /* Mensajes abajo v0.32 */GC gc;                                   XGCValues gc_val;Display *display;                        /* */XID xid; fd_set readfds;                           /* used by proceso() */struct itimerval timer;                   /* used by proceso() */char bnsup;                               /* usado por bnwrite */#ifndef __linuxstruct timeval timeout=  { 0,250000 };#elsestruct timeval timeout;#endifunsigned long *colors;static Xv_singlecolor cms_colors[]= {     { 255,255,255 },              /* white */     {   0,  0,  0 },              /* black */     {   0,  0, 255},              /* blue  INVERTED in v0.29 */     {   0,255,  0 },              /* green INVERTED in v0.29 */     {  30,230, 250},              /* light blue */     { 255,255,  0 },              /* yellow */     { 255,  0,  0 },              /* red */     {   0,  0,  0 },              /* color por defecto */};/* * Estructura principal  */struct usuario {   char server_name[50];             /* server name */   int port;                         /* server port */   char nombre[MAXNAMELEN];          /* user name */   char names[MAXPLAYER][MAXNAMELEN]; /* other players's name */      int firsthit;                     /* para borrar BN new on 0.30 */   int play;                         /* already playing ? */   int numjug;                       /* number of player */   int usrfrom;                      /* player who is owner of enemy window */      char tomsg[MSGMAXLEN];            /* usuadas para mandar mensajes */   int  towho;   int  lecho;                       /* local echo */      char status[5][16];               /* new on v0.43 */   int  hide;                        /* hide my board new on v0.44 */} usuario;char fijo01[MSGMAXLEN];/*   * Funciones *//* * Funcion pricicipal de comunicaciones */size_t bnwrite(int fd,char *buf,char tip0,char tip1,char tip2,char jugyo ){   int i;      struct protocolo proto;   proto.bnptip0=tip0;   proto.bnptip1=tip1;   proto.bnptip2=tip2;   proto.jugador=jugyo;   for(i=0;i<MSGMAXLEN;i++)     proto.bnpmsg[i]=buf[i];   strcpy(proto.bnphead,BNPHEAD);   proto.bnpver=BNPVER;   return( write(fd,&proto,MAXLEN) ) ;}/* * mandar mensajes a la teletype (tty) */void ttyfill(char msg[]) {   char messg[100];   strncpy(messg,msg,100);   ttysw_output(tty,messg,strlen(messg));}/* 2 funciones para escribir mensajes abajo */void foot_right( char msg[] ) {   char tempbuf[100];   strncpy(tempbuf,msg,100);   xv_set(frame,	  FRAME_RIGHT_FOOTER,tempbuf,	  NULL);}void foot_left( char msg[] ) {   char tempbuf[100];   strncpy(tempbuf,msg,100);   xv_set(frame,	  FRAME_LEFT_FOOTER,tempbuf,	  NULL);}/* Draw  name */void dname(char * nombre, int a) {   Xv_Window xv_w;   GC gc;   Display *display;   Window xwin;   int largo;      if(a==0)     xv_w = canvas_paint_window(canvas_min);   else if(a==1)     xv_w = canvas_paint_window(canvas_tun);			      xwin = xv_get(xv_w,XV_XID);   display = (Display *) xv_get(canvas_mib,XV_DISPLAY);   gc = DefaultGC(display,DefaultScreen(display));         XSetForeground(display,gc,colors[WHITE]);   XFillRectangle(display, xwin, gc,0,0,ANCHO*10, LARGO*2);		      XSetForeground(display,gc,colors[BLACK]);   largo=strlen(nombre);		   XDrawString(display,xwin,gc,50,25,nombre,largo);   }/* paint mi cell */void pmicell(int x,int y,int color) {   Xv_Window xv_w;   GC gc;   Display *display;   Window xwin;      if(x<10 && x>=0 && y>=0 && y<10)     {	xv_w = canvas_paint_window(canvas_mib);	xwin = xv_get(xv_w,XV_XID);	display = (Display *) xv_get(canvas_mib,XV_DISPLAY);	gc = DefaultGC(display,DefaultScreen(display));		XSetForeground(display,gc,colors[color]);	XFillRectangle(display, xwin, gc,		       x*ANCHO+1,y*LARGO+1,		       ANCHO-1, LARGO-1);		     }}/* Otro uso en v0.50 - usada por inteliclient */void ptucell(int x,int y,int color){   Xv_Window xv_w;   GC gc;   Display *display;   Window xwin;      if(x<10 && x>=0 && y>=0 && y<10)     {	xv_w = canvas_paint_window(canvas_tub);	xwin = xv_get(xv_w,XV_XID);	display = (Display *) xv_get(canvas_mib,XV_DISPLAY);	gc = DefaultGC(display,DefaultScreen(display));		XSetForeground(display,gc,colors[color]);	XFillRectangle(display, xwin, gc, 		       x*ANCHO+1,y*LARGO+1,		       ANCHO-1, LARGO-1);     }}/* v0.50 */void inteliclient( char *table){   int i,x,y;      x=0;   y=0;      for(i=0;i<100;i++)     {	switch(table[i])	  {	   case HUNDIDO:	   case TOCADO:	     ptucell(x-1,y-1,BLUE);	     ptucell(x-1,y+1,BLUE);	     ptucell(x+1,y-1,BLUE);								     ptucell(x+1,y+1,BLUE);	     break;	   case NOBARCO:	     if(x<9 && table[i+1]==HUNDIDO)	       ptucell(x,y,BLUE);	     	     if(x>0 && table[i-1]==HUNDIDO)	       ptucell(x,y,BLUE);	     	     if(y<9 && table[i+10]==HUNDIDO)	       ptucell(x,y,BLUE);	     	     if(y>0 && table[i-10]==HUNDIDO)	       ptucell(x,y,BLUE);	     break;	   default:	     break;	  }	x++;	if(x==10)	  {	     x=0;	     y++;	  }     }}/* funcion que rellena los tableros * IN: char * - relleno * IN: int - 0 - miboard *         - 1 - tuboard */void fillboard( char *filltable, int a ){   int i,j;   Xv_Window xv_w;   GC gc;   Display *display;   Window xwin;      int k;      /* board mio */   if(a==0)     {	xv_w = canvas_paint_window(canvas_mib);	xwin = xv_get(xv_w,XV_XID);	display = (Display *) xv_get(canvas_mib,XV_DISPLAY);	gc = DefaultGC(display,DefaultScreen(display));      }   /* board tuyo */   else if(a==1)     {	xv_w = canvas_paint_window(canvas_tub);	xwin = xv_get(xv_w,XV_XID);	display = (Display *) xv_get(canvas_mib,XV_DISPLAY);	gc = DefaultGC(display,DefaultScreen(display));      }      i=0;   j=0;   for(k=0;k<100;k++)     {	switch( filltable[k] )	  {	   case BARCO: /* 1 */	     XSetForeground(display,gc,colors[GREEN]);	     XFillRectangle(display, xwin, gc, 			    i*ANCHO+1,j*LARGO+1,			    ANCHO-1, LARGO-1);	     break;	   case NOBARCO: /* 0 */	     XSetForeground(display,gc,colors[WHITE]);	     XFillRectangle(display, xwin, gc, 			    i*ANCHO+1,j*LARGO+1,			    ANCHO-1, LARGO-1);	     break;	   case AGUA: /* -1 */	     XSetForeground(display,gc,colors[BLUE]);	     XFillRectangle(display, xwin, gc, 			    i*ANCHO+1,j*LARGO+1,			    ANCHO-1, LARGO-1);	     break;	   case TOCADO: /* 2 */	     XSetForeground(display,gc,colors[RED]);	     XFillRectangle(display, xwin, gc, 			    i*ANCHO+1,j*LARGO+1,			    ANCHO-1, LARGO-1);	     break;	   case HUNDIDO: /* 3 */	     XSetForeground(display,gc,colors[BLACK]);	     XFillRectangle(display, xwin, gc, 			    i*ANCHO+1,j*LARGO+1,			    ANCHO-1, LARGO-1);	     break;	   default:	     XSetForeground(display,gc,colors[LBLUE]);	     XFillRectangle(display, xwin, gc, 			    i*ANCHO+1,j*LARGO+1,			    ANCHO-1, LARGO-1);	     break;	  }	i++;	if (i==10)	  {	     j++;	     i=0;	  }     }}/* void fill0( int b,int a ) -eliminada en v0.50 *//* void repaintmi( void ) -eliminada en v0.50 *//* void repainttu( char outbuf[] ) -eliminada en v0.50 *//* convierte un char[10][10] a un char[100] */void iwtable( char *dest) {   int i,x,y;   x=0;y=0;   for(i=0;i<100;i++)      {	dest[i]=mitabla[x][y];	x++;	if(x>=10) 	  {	     x=0;y++;	  }     }}/* pone por default la misma tabla que jugue antes */void filtermiboard()  {   int x,y;      for(x=0;x<10;x++)      {	for(y=0;y<10;y++) 	  {	     if( mitabla[x][y] >= BARCO ) 	       mitabla[x][y]=BARCO;	     else if( mitabla[x][y] <= NOBARCO ) 	       mitabla[x][y]=NOBARCO;	     	  }     }}/* * Funciones que dibujan mi tabla y la tuya */void dibujar_mi_nombre(Canvas canvas,        /* unused */		       Xv_Window paint_window, /* unused */		       Display *dpy,		       Window xwin,		       Xv_xrectlist *xrects ) /* unused */{   GC gc;      gc = DefaultGC(dpy,DefaultScreen(dpy));   XSetForeground(dpy,gc,colors[BLACK]);   XDrawString(dpy,xwin,gc,60,25,"My board",8);   }void dibujar_tu_nombre(Canvas canvas,        /* unused */		       Xv_Window paint_window, /* unused */		       Display *dpy,		       Window xwin,		       Xv_xrectlist *xrects ) /* unused */{   GC gc;      gc = DefaultGC(dpy,DefaultScreen(dpy));   XSetForeground(dpy,gc,colors[BLACK]);   XDrawString(dpy,xwin,gc,50,25,"Enemy's board",13);   }void dibujar_mi_tabla(Canvas canvas,        /* unused */		      Xv_Window paint_window, /* unused */		      Display *dpy,		      Window xwin,		      Xv_xrectlist *xrects ) /* unused */{   GC gc;   int  i;   gc = DefaultGC(dpy,DefaultScreen(dpy));   XSetForeground(dpy,gc,colors[BLACK]);   for(i=0;i<10;i++)     {	XDrawLine( dpy, xwin, gc, LARGO*i, 0, LARGO*i, LARGO*10);	XDrawLine( dpy, xwin, gc, 0, ANCHO*i, ANCHO*10, ANCHO*i);     }   }void dibujar_tu_tabla(Canvas canvas,        /* unused */		      Xv_Window paint_window, /* unused */		      Display *dpy,		      Window xwin,		      Xv_xrectlist *xrects ) /* unused */{   GC gc;   int i;   gc = DefaultGC(dpy,DefaultScreen(dpy));   XSetForeground(dpy,gc,colors[BLACK]);   for(i=0;i<10;i++)     {	XDrawLine( dpy, xwin, gc, LARGO*i, 0, LARGO*i, LARGO*10);	XDrawLine( dpy, xwin, gc, 0, ANCHO*i, ANCHO*10, ANCHO*i);     }   }/*  * Eventos de mi tabla y tu tabla *//* mi tabla - eventos */void event_mib( Xv_Window window, Event *event ){   char temptable[100];   int x,y;         switch( event_action(event) )     {	/* Boton Izquierdo */      case ACTION_SELECT:      case MS_LEFT:	if(!event_is_down(event))	  {	     /* Es primer disparo y no estoy jugando */	     if( (usuario.firsthit==0) && (usuario.play<2))	       {		  for(x=0;x<10;x++)		    {		       for(y=0;y<10;y++)			 mitabla[x][y]=NOBARCO;		    }		  iwtable(temptable);		  fillboard(temptable,0);		  fillboard(temptable,1);		  usuario.firsthit=1;	       }	     if( usuario.play >=3 )	       {		  ttyfill("You cant modify the board while playing!\n\r");		  break;		  /*							return; */	       }	     if( usuario.play ==2 )	       {		  ttyfill("The board is OK, so you cant modify it\n\r");		  break;		  /*							return; */	       }	     x = event_x(event) / ANCHO;

⌨️ 快捷键说明

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