📄 nbnclient.c
字号:
/* * 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 + -