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