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

📄 nbnclient.c

📁 网络战船游戏
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * Batalla Naval (c) 1995,96,97,98 Ricardo Quesada * (rquesada@dc.uba.ar) *  * Cliente ncurses * version: 0.60 *   * Varios bugs resueltos por: * Horacio Pe馻 ( horape@balug.org.ar ) *  *//* *                includes */#include <ncurses.h>#include <stdio.h>#include <stdlib.h>#include "../share/protocol.h"#include "../share/tablas.h"#include <sys/types.h>#include <sys/socket.h>#include <sys/time.h>#include <netinet/in.h>#include <unistd.h>#include <netdb.h> #include <syslog.h>#include <errno.h>#include <string.h>/* *                DEFINES */ #define BN_NVER "0.60"#define BN_NVERH 0#define BN_NVERL 60#define MAXPLAYER 5#define  WHITE  0#define  BLACK  1#define  BLUE   2#define  GREEN  3#define  GOOD   4#define  VGOOD  5#define  RED    6#define  NORMAL 7#define  BLUCKY 8#define  LUCKY  9#define  MITABLA 0#define  BOTONES 1#define  TUTABLA 2#define  SENDMSG 3#define  THECONF 4#define  MAXLUGARC 6                 /* fucking cantidad de botones */#define RAPID 25                     /* similar to x client */void globaltab(void);/* *                VARIABLES GLOBALES */ int    sock;struct sockaddr_in server;struct hostent *host_info;char   mitabla[10][10];          /* mi tabla de barcos */char   tutabla[10][10];          /* tabla para disparar */char   barquitos[4];             /* tama;os de los barcos 1 de 4, 2 de 3, etc. */short  int x,y;                  /* punteros de la tabla mia */char   bnsup;                    /* usado por bnwrite */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 */   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];   int  hide;                        /* hide my board new on v0.44 */} usuario;/* referente a ncurses */WINDOW *miboard;                       /* ventana de mis barcos */WINDOW *tuboard;                       /* ventana de tus barcos */WINDOW *msgboard;                      /* ventana de los mensajes */WINDOW *title;WINDOW *bconnect;WINDOW *bstart;WINDOW *bmsg;WINDOW *bconfig;WINDOW *babout;WINDOW *bquit;WINDOW *bstatus;                        /* new on v0.43 */WINDOW *wright;WINDOW *wleft;WINDOW *myname;WINDOW *yourname;WINDOW *about;WINDOW *sendmesg;WINDOW *config;struct ncur {   short int lugarg;              /* lugar grande 0 (izq) 1 (medio) 2(derecha) */   short int lugarc;              /* lugar chico */   short int quit;   short int x,y;   short int xt,yt;   char minombre[24];   char tunombre[24];   char lefty[40];   char righty[40];      int  sendx;                    /* coordenadas */   char sendmsg[MSGMAXLEN];              /* mensaje */   int  sendto;                   /* a quien */   int  sendle;                   /* local echo */   int  sendpos;                  /* internal position */      int  conf[3];                   /* coordenadas del config */   char confc[3][60];              /* guardar la info */   int  confpos;      int  flag1;                     /* chequea posible bug */   int  color;                     /* terminal color new on v0.41 */} ncur;char outbuftemp[MSGMAXLEN];fd_set readfds;                           /* used by proceso() */#ifndef __linuxstruct timeval tout=  { 0,250000 };#elsestruct timeval tout;#endif/*  *                           FUNCIONES *//*  * varias funciones de manejo de pantalla */void wattroncm(WINDOW *win, int attrs) {   if(ncur.color==TRUE)      wattrset(win,attrs);   else      {	switch(attrs) 	  {	   case COLOR_PAIR(WHITE):	   case COLOR_PAIR(BLUCKY):	   case COLOR_PAIR(GOOD):	     attrs=A_REVERSE;	     break;	   case COLOR_PAIR(NORMAL):	   case COLOR_PAIR(BLACK):	   case COLOR_PAIR(VGOOD):	     attrs=A_BOLD;	     break;	   case COLOR_PAIR(RED):	   case COLOR_PAIR(BLUE):	   case COLOR_PAIR(GREEN):	   case COLOR_PAIR(LUCKY):	   default:	     attrs=A_NORMAL;	     break;	  }   /* switch */	wattrset(win,attrs);     }      /* else */}void waddchcm(WINDOW *win,chtype ch,int attrs) {   if(ncur.color==TRUE)       {	waddch(win,ch);	waddch(win,ch);     }   else {      switch(attrs) 	{        /* NOTA: QUE KILOMBO HICE CON LOS COLORES, TODOS CAMBIADOS */	 case COLOR_PAIR(GREEN):       /* barco */	   waddch(win,ACS_BOARD);	   waddch(win,ACS_BOARD);	   break;	 case COLOR_PAIR(BLUE):      /* agua */	   waddch(win,'.');	   waddch(win,'.');	   break;	 case COLOR_PAIR(RED):        /* tocado */	   waddch(win,'x');	   waddch(win,'x');	   break;	 case COLOR_PAIR(BLACK):      /* hundido */	   waddch(win,'*');	   waddch(win,'*');	   break;	}   /* switch */   }      /* else */}/* 2 funciones para escribir mensajes abajo */void foot_right( char msg[] ) { /* this function is buggy */   int i,n;      for(i=0;i<40;i++)      ncur.righty[i]=' ';   n=40-strlen(msg);   for(i=n;i<40;i++)     ncur.righty[i]=msg[i-n];   ncur.righty[40]=0;   mvwprintw(wright,0,0,"%s",ncur.righty);   wrefresh(wright);}void foot_left( char msg[] ) {   int i,n;      for(i=0;i<40;i++)      ncur.lefty[i]=' ';   n=strlen(msg);   for(i=0;i<n;i++)     ncur.lefty[i]=msg[i];   ncur.lefty[40]=0;   mvwprintw(wleft,0,0,"%s",ncur.lefty);   wrefresh(wleft);}void yname( void ) {   char ch[23]="                     ";   int n,i,j;   n=strlen(ncur.tunombre)/2;   i=10-n;   for(j=0;j<strlen(ncur.tunombre);j++)     ch[i+j]=ncur.tunombre[j];   if(ncur.lugarg==TUTABLA)     wattroncm(yourname,COLOR_PAIR(VGOOD));   else     wattroncm(yourname,COLOR_PAIR(GOOD));   mvwprintw(yourname,0,0,"%s",ch);   wrefresh(yourname);}void mname( void ) {   char ch[23]="                     ";   int n,i,j;   n=strlen(ncur.minombre)/2;   i=10-n;   for(j=0;j<strlen(ncur.minombre);j++)     ch[i+j]=ncur.minombre[j];   if(ncur.lugarg==MITABLA)     wattroncm(myname,COLOR_PAIR(VGOOD));   else     wattroncm(myname,COLOR_PAIR(GOOD));   mvwprintw(myname,0,0,"%s",ch);   wrefresh(myname);}void pmicell(int x,int y,int color) {   if(x<10 && x>=0 && y>=0 && y<10)     {	if(color==WHITE) 	  {	     wattroncm(miboard,COLOR_PAIR(GOOD));	     wmove(miboard,y+1,x*2+1);	     waddch(miboard,' ');	     waddch(miboard,ACS_VLINE);	     wrefresh(miboard);	  }	else  	  {	     wattroncm(miboard,COLOR_PAIR(color));	     wmove(miboard,y+1,x*2+1);	     waddchcm(miboard,ACS_BOARD,COLOR_PAIR(color));	     wrefresh(miboard);	  }     }}void ptucell(int x,int y,int color) {   if(x<10 && x>=0 && y>=0 && y<10)     {	if(color==WHITE) 	  {	     wattroncm(tuboard,COLOR_PAIR(GOOD));	     wmove(tuboard,y+1,x*2+1);	     waddch(tuboard,' ');	     waddch(tuboard,ACS_VLINE);	     wrefresh(tuboard);	  }	else  	  {	     wattroncm(tuboard,COLOR_PAIR(color));	     wmove(tuboard,y+1,x*2+1);	     waddchcm(tuboard,ACS_BOARD,COLOR_PAIR(color));	     wrefresh(tuboard);	  }     }}/* * Cliente inteligente - 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)	       {		  if(table[i+1]==HUNDIDO)		    ptucell(x,y,BLUE);	       }	     if(x>0)	       {		  if(table[i-1]==HUNDIDO)		    ptucell(x,y,BLUE);	       }	     if(y<9)	       {		  if(table[i+10]==HUNDIDO)		    ptucell(x,y,BLUE);	       }	     if(y>0)	       {		  if(table[i-10]==HUNDIDO)		    ptucell(x,y,BLUE);	       }								   default:	     break;	  }	x++;	if(x==10)	  {	     x=0;	     y++;	  }     }}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++;	  }     }}void repaintmi( void )  {   int x,y;   for(x=0;x<10;x++)      {	for(y=0;y<10;y++)  	  {	     switch(mitabla[x][y]) 	       {		case BARCO:		  pmicell(x,y,GREEN);		  break;		case NOBARCO:		  pmicell(x,y,WHITE);		  break;		case AGUA:		  pmicell(x,y,BLUE);		  break;		case TOCADO:		  pmicell(x,y,RED);		  break;		case HUNDIDO:		  pmicell(x,y,BLACK);		  break;	       }	  }     }}void repainttu( char outbuf[] )  {   int x,y,i;   for(x=0,y=0,i=0;i<MSGMAXLEN;i++)      {	if( outbuf[i]==TOCADO)              /* tocado */	  ptucell(x,y,RED);	else if(outbuf[i]==HUNDIDO)          /* hundido */	  ptucell(x,y,BLACK);	else if(outbuf[i]==AGUA)         /* agua */	  ptucell(x,y,BLUE);	else if(outbuf[i]==NOBARCO)          /* nada */	  ptucell(x,y,WHITE);	else if(outbuf[i]==BARCO)          /* barco */	  ptucell(x,y,GREEN);	x++;	if(x>=10) 	  {	     x=0;y++;	  }     }}void fillenemyt( char filltable[] ,int a) {   int i,x,y;   x=y=0;   for(i=0;i<100;i++)      {	if(a==0)	  pmicell(x,y,filltable[i]);	else if(a==1)ptucell(x,y,filltable[i]);	x++;	if(x==10) 	  {	     x=0;y++;	  }     }}void fill0( int b,int a ) {   int i;   int x,y;   x=y=0;      for(i=0;i<100;i++)      {	if(a==0)	  pmicell(x,y,b);	else if(a==1)	  ptucell(x,y,b);	x++;	if(x==10) 	  {	     x=0;y++;	  }     }}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 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) ) ;

⌨️ 快捷键说明

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