|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - plaf
26
« en: Sábado 10 de Enero de 2004, 03:15 »
bue, grax por los elogios  (y aqui entre nos, soy un bot  (y mas entre nos aun, fui creado por otro bot  (y muy muy entre nos, esta es la matrix  ))) y el bug es xq se me paso la minusculeacion en el juntas(), y a parte sobra reconocer el guion (lo puse al principio y despues agregue el caso generico x si aparecian no-letras) y si se minusculea al principio del tipo() me ahorro un ||  bueno dejo la actualizacion
27
« en: Viernes 9 de Enero de 2004, 20:58 »
pues yo diria q SI es con varios ifs dentro de otros ifs y miles de || y funciones q retornan 1s y 0s (aunque una tuvo q expandirse por los guiones), o bueno, quizas no SEA asi, pero de q se puede hacer asi, se puede. y si no me crees, pues te dejo la prueba 
28
« en: Viernes 9 de Enero de 2004, 18:52 »
a ver a ver, me estas retando??? ah bueno es un foro de retos... pa q no te quejes ya hice el de los gatos entero  y este otro, pos voy a ver q tal me anda, lo voy a empezar a intentar, de ahi te cuento como me va
29
« en: Viernes 9 de Enero de 2004, 00:17 »
waaa eso me huele a miles de ifs dentro de otros ifs y funciones booleanas y muchos || y waaa, pero bueno, cuando este suficientemente aburrido lo intento...  y lo q realmente me trajo a responder era q vi recien ayer lo de los gatos con sombrero y ya me lo cerraron  pero igual queria aportar mi solucion para no sentir q desperdicie el rato... lo de leer y escribir en los archivos es facil asi q hice solo lo de calcular los gatos y alturas, y si no me equivoco podria ser algo asi: double x; // el numero de niveles de gatos q no trabajan int trabajan, alto, flojos, altura, n; // aca leo del archivo "alto" y "trabajan" // como trabajan N^x y la altura del gato mayor es (N+1)^x // N = raiz_x(trabajan); o sea pow(trabajan,1/x); for(x=1.0; (int)(pow(pow(trabajan,1/x)+1,x)+0.01) != alto; x++); // el +0.01 es para arreglar el error q podria dar N=(int)(pow(trabajan,1/x)+0.01); flojos=0; altura=trabajan; for(n=0; n<x; n++) { flojos+=pow(N,n); altura+=pow(N,n)*pow(N+1,x-n); } // y al final imprimo al archivo
30
« en: Miércoles 7 de Enero de 2004, 22:56 »
lo q puedes hacer es q despues de cada fscanf() te devuelvas 1 caracter con fseek() y lo lees con getc(), y ahi ves si es un '\n' quedaria algo asi char c; fscanf(archivo, "%d", &num); hacer_lo_que_tengas_que_hacer_con(num); fseek(archivo, -1L, SET_CUR); c=getc(archivo); if(c=='\n') hacer_cosas_de_cambio_linea(); else hacer_cosas_con_la_misma_linea();
31
« en: Miércoles 7 de Enero de 2004, 07:17 »
wow, gracias por la respuesta, a parte de util tb muy ilustrante  x lo menos el problema de mandar paquetes muy grandes no lo voy a tener, al menos por ahora, xq lo unico q hago es mandar cosas de maximo unos 12 caracteres, o en casos muy extremos hasta 32 bytes... pero eso es una cosa impresionantemente gigante... bueno segun lo q dices no se ve dificil solucionar lo de los datos q llegan a pedazos, con un while hasta q no llegue el ultimo byte basta, pero lo q no veo bien es como separar lo q me llega pegado sin perder lo del final sin hacer cambios muy radicales... por ejemplo podria dejar algo asi y no cambiar nada en el juego: void wsock::mandar(int Num, char *Datos) { if(sock[Num-1]!=INVALID_SOCKET) { char aux[16]; sprintf(aux, "%c%s", (char)(strlen(Datos)), Datos); // mando como #texto send(sock[Num-1], aux, 16, 0); } } void wsock::mandar(char *Datos) { mandar(1,Datos); } void wsock::mandar_todos(char *Datos) { int i; for(i=1;i<=jugadores;i++) mandar(i,Datos); } void wsock::recibir(int Num, char *Datos) { if(sock[Num-1]!=INVALID_SOCKET) { char aux[16]; strcpy(Datos, ""); do { recv(sock[Num-1], aux, 16, 0); strcat(Datos, aux); }while(strlen(Datos) <= (int)(Datos[0])); // sale cuando recibio #+1 caracteres (el '#' es el +1) int i; if(strlen(Datos) > (int)(Datos[0])+1) // si me llego mas de lo q esperaba { for(i=0; i < (int)(Datos[0])+1; i++) // copio en aux lo q esperaba aux[i] = Datos[i]; aux[i] = 0; strcpy(Datos, aux); } for(i=0; i < strlen(Datos); i++) // y al final le quito el # Datos[i] = Datos[i+1]; } } void wsock::recibir(char *Datos) { recibir(1,Datos); }
el problema es q si quisiera prevenir lo de los textos pegados tendria q hacer algo como pasar de parametro al recibir() un arreglo de strings para dejar una especie de cola de datos en espera, y despues al codigo del juego decirle q si no hay nada en la cola q reciba, y si hay algo q lo use y lo saque de la cola. eso deberia funcionar, o no? lo malo es q me da lata hacerlo ahora, pero si es necesario lo podria hacer otro dia
32
« en: Jueves 1 de Enero de 2004, 21:08 »
holas, q emocion, primer tema del año  bueno pues les cuento q he estado haciendo un juego en c++ y ocupo la libreria winsock2 para hacerlo online. el juego es por turnos asi q no necesito hacer cosas raras para la transferencia de datos, solo mando/recibo el problema es q por alguna razon cuando hosteo un juego yo veo todo perfectamente, pero parece q el/los otro(s) jugador(es) por algun motivo no recibe(n) perfectamente los datos y ve como si jugada por medio yo hiciera la misma movida q el. bueno la cosa es medio rara... pero aca pongo una idea del ciclo q hace el juego a ver si alguien ve algun desperfecto: void jugador::mover() { int Listo=0; char txt[16], aux[16]; x=xa+dx; y=ya+dy; // asigno las posiciones nuevas xx=-1; yy=-1; // esto es como la "posicion anterior" para redibujar solo si cambia while(!Listo) { if(x!=xx || y!=yy){ dibujo de nuevo } xx=x; yy=y; // ahora lo q importa if(soy_yo) // si es mi turno mando mis movimientos { leo el teclado y recalculo x e y o hago Listo=1; si apretaron enter sprintf(txt,"%ld",10000*x+y); // mando la posicion nueva como xxxxyyyy if(hosteo) { if(Listo) mandar_todos("l"); // mandar_todos() hace send() a todos los jugadores else mandar_todos(txt); // si aprete enter mando una l, si no, la nueva posicion } else // si no soy el host { if(Listo) mandar("l"); // mandar() le manda al host else mandar(txt); recibir(aux); // cuando el host recibe algo se lo manda a todos, incluyendome a mi } } else // si no es mi turno solo recibo { strcpy(texto,""); // x si acaso if(hosteo) { recibir(turno,txt); // recibo lo q hizo el jugador de turno mandar_todos(txt); // y se lo mando a todos } else{ recibir(txt); } // si no soy el host recibo lo q el me mando (q es lo q le mando el jugador) // aca manejo lo q me llego... } } // fin del while // aca manejo los resultados finales del movimiento... }
bueno la idea es esa, si no se cacha bien mas rato pongo el codigo entero por si a alguien le interesa
33
« en: Lunes 29 de Diciembre de 2003, 20:38 »
(((se te colo un "*" en "nodo_ref *dec_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref *));" <----ese)))
el problema es q cuando tu llamas una funcion con un parametro, la funcion crea otra variable local con el mismo valor q ese parametro, asi q el valor del parametro original no cambia cuando tu haces una_funcion(dec_listaerrores); una_funcion() no trabaja con esa variable, sino q crea otro puntero q apunta donde mismo, asi q puedes cambiar los valores a los q apunta y cuando vuelvas los valores estaran cambiados, pero la variable q pasaste como parametro nunca va a cambiar si quisieras cambiarla tendrias q pasarle a la funcion un puntero a un puntero, algo asi:
void Programa(void) { nodo_ref *dec_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref)); una_funcion(&dec_listaerrores); }
void una_funcion(nodo_ref **dec_listaerrores) { nodo_ref *dec1_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref)); nodo_ref *dec2_listaerrores=(nodo_ref *)malloc(sizeof(nodo_ref)); if (!strcmp(lookahead->cadena,"hola")) { otra_funcion(dec1_listaerrores); una_funcion(dec2_listaerrores); *dec_listaerrores= UNIR(dec1_listaerrores, dec2_listaerrores); } else *dec_listaerrores= NULL; }
bueno espero haber sido claro, cualquier duda avisas
34
« en: Miércoles 24 de Diciembre de 2003, 20:18 »
lo de la instalacion... pos no sabo... yo lo instale siguiendo instruccionesy de winsock yo me hice una libreria ajustada a mi juego, pero igual bastante generica y simple... aqui la adjunto...
35
« en: Miércoles 24 de Diciembre de 2003, 00:07 »
estuve buscando un poco y encontre este tutorial muy bueno y simple (en ingles), y con eso ya hice un miniprograma de prueba q funca bien asi q voy a empezar con la onlinizacion de las carreras vectoriales  (cuando termine lo posteo) y lo de la instalacion de allegro, pos no se xq uso windows... en todo caso descomprimi en la carpeta del dev-c++, me fui a (...)dev-cpp\allegro, fix.bat mingw32 (para configurarlo para windows), make, make install, y listo allegro.h esta en los \include, liballeg.a en \lib
36
« en: Martes 23 de Diciembre de 2003, 02:09 »
ta bueno el juego, eso si no me funco lo de ver el estado de mis barcos, pero bue... sobre lo de hacerlo en red, yo tb estaba tratando de hacerlo y vi q estaba la libreria winsock q servia para eso en C, pero me puse a buscar ejemplos y lo q encontre estaba muy lleno de dialogos de ventanitas y cosas api-windowescas q yo no quiero usar (uso allegro) y con tantas cosas feas q me costo filtrar lo util... donde puedo encontrar un tutorial simple con lo basico de winsock? yo lo unico q necesito es q un jugador sea host, otros se conecten a el y despues mandar y recibir un numero... pal chat y cosas raras ya esta msn  y lo q dijiste de allegro parece q te falta el -lalleg al compilar. x lo menos yo uso el dev-c++ de IDE y compilo con el gcc y hay q agregarle al final de la linea -lalleg pa linkear (si compilas a mano lo agregas al final de la linea, si lo tiras desde el dev-c++ te vas a las opciones de proyecto (alt+p) y o pones abajo)
37
« en: Lunes 22 de Diciembre de 2003, 06:19 »
1- eso se puede hacer con un getch(); para q al paretar una tecla la puedas guardar y no se muestre en pantalla #include <conio.h> #include <stdio.h> void main() { char fija[]="hola, vengo a flotar"; char input[23]; int i; for(i=0;i<20;i++) { input[i]=getch(); printf("%c", fija[i]); } }
o algo asi 2- ahi no te cache bien, la variable es un string, un arreglo de numeros o un numero de varios digitos? si es un arreglo de algo, es cosa de hacer if(arreglo[0]==caracter_especifico); si es un numero, podrias usar un par de funciones matematicas: #include<math.h> #include<stdio.h> void main() { long int num; int primerdigito; printf("numero??: "); scanf("%ld",&num); primerdigito = num/(long int)(pow(10, (int)(log10(num)))); if(primerdigito==3) printf("num empieza con 3"); }
eso te divide el numero por un 10 con un 0 menos q los digitos q tenga el numero para sacar el primer digito (por ejemplo, (int)(3518618/1000000)=3 )
38
« en: Lunes 22 de Diciembre de 2003, 00:34 »
lo q pasa es q char pers[n]; es un string (si es q "n" esta #definido, xq no se pueden declarar arreglos de portes variables), y lo q tu quieres es un arreglo de strings, o sea algo como char pers[n][10]; lo otro es q no puedes llegar e igualar un string a otro, hay q hacerlo caracter a caracter o con una funcion como strcpy(); pero eso ni siquiera es necesario xq puedes simplemente en vez de hacer gets(nombre); hacer gets(pers ); con esos 2 cambios deberia funcionar
pd: %ld es para long ints, cuantos jugadores quieres???? (aunque eso da lo mismo)
39
« en: Domingo 21 de Diciembre de 2003, 19:39 »
gracias, ya habia intentado hacer eso pero no se me habia ocurrido dejar de incluir los .h eso si tuve q cambiar un poco los constructores xq los tenia con parametros y al declarar las clases asi me creaba conflictos, pero ya lo arregle y ahora #inclui los .h en los .cpp y funca bien
40
« en: Domingo 21 de Diciembre de 2003, 07:21 »
tengo varias clases, y cada una tiene metodos q usan como parametros otras clases, y cada una en su respectivo CLASE_X.h el problema es q me alega al compilar xq no conoce las otras clases un .h seria asi:
#ifndef CLASEA_H #define CLASEA_H
#include "ClaseB.h" #include "ClaseC.h"
class ClaseA { public: void metodo(ClaseB *B, ClaseC *C);
};
#endif // CLASEA_H
bueno la idea es esa, las clases b y c son del mismo estilo. como hago para que me las reconozca? pense en poner todos los .h en uno pero no hay una mejor manera?
41
« en: Miércoles 10 de Septiembre de 2003, 07:26 »
primero, gracias por la respuesta, y segundo, a veces me empiezo a volar con el codigo y no me lo entiende nadie... estuve haciendo unos monitos en paint diagramando algunas cosas y me resulto eso, pero debo haber pasado por alto algun detalle q se me sigue pasando... el q puse ahi si funcionaba, pero no perfecto, porque cuando hacia un "cambio de velocidad" dejaba un pedazo de huella. todavia no puedo arreglar eso, pero me rendi y busque un poco de info del doble buffer y lo hice asi (el codigo queda bastante mas lindo y es mas rapido q andar leyendo los pixeles...) al final me quedo esto: void mover_mono(BITMAP *fondo, mono *m, int dx, int dy) { BITMAP *temp; int izq,arr; if(dx<0) izq=m->x+dx; else izq=m->x; if(dy<0) arr=m->y+dy; else arr=m->y; temp = create_bitmap(64+abs(dx),64+abs(dy)); blit(fondo,temp,izq,arr,0,0,64+abs(dx),64+abs(dy)); draw_sprite(temp,m->bmp,m->x+dx-izq,m->y+dy-arr); draw_sprite(screen,temp,izq,arr); destroy_bitmap(temp); m->x+=dx; m->y+=dy; }
despues si me sobra tiempo veo eso de los rectangulos cochinos...
42
« en: Martes 9 de Septiembre de 2003, 05:04 »
jajaja me pastelee, en el for q hice tenia cambiados unos signos > por < y entraba siempre al if, por eso era tan horrible... ahora lo arregle y anda CASI perfecto, el unico detalle es q a veces me deja unos pedazos por ahi... he aca el codigo: void mover_mono(BITMAP *fondo, mono *m, int dx, int dy) { int x,y; for(y=0; y<64; y++) { for(x=0; x<64; x++) { // si hay un pedazo de mono no-transparente y ( el mono se va a mover fuera de esa zona o el pixel q va a ir ahi va a ser transparente ) if(getpixel(m->bmp,x,y)!=MASK_COLOR_16 && ((dx>0 && x<dx) || (dy>0 && y<dy) || (dx<0 && x>64+dx) || (dy<0 && y>64+dy) || getpixel(m->bmp,x-dx,y-dy)==MASK_COLOR_16)) putpixel(screen,m->x+x-dx,m->y+y-dy,getpixel(fondo,m->x+x-dx,m->y+y-dy)); } // entonces en ese punto copio el pixel del fondo encima del resto de mono } m->x += dx; m->y += dy; draw_sprite(screen,m->bmp,m->x,m->y); if(key[KEY_ESC]) exit(0); } void saltar(BITMAP *fondo,mono *m) { float vy,vx; for(vy=-2.49;vy<=2.5;vy+=G) { if(key[KEY_LEFT] && !key[KEY_RIGHT]) vx=-1; else if(key[KEY_RIGHT] && !key[KEY_LEFT]) vx=1; else vx=0; mover_mono(fondo,m,vx,vy); } }
podria hacer q cuando salte no se mueva de a 1, pero eso es facil, lo raro es q me deja unas huellas raras...
43
« en: Martes 9 de Septiembre de 2003, 03:54 »
holas, recien estoy empezando con allegro y necesito mover un mono sobre un fondo obviamente sin dejar huella. el mono es de forma irregular (tiene fondo transparente) asi q no me sirve blitearle rectangulos al lado, y si pesco el pedazo de fondo y lo pongo encima y despues dibujo el mono un poco mas alla, me parpadea la imagen... probe con un for para ir pixel x pixel viendo si hay q borrarlo y anda LENNNNNTO...  ojala me puedan ayudar, grax
44
« en: Viernes 29 de Agosto de 2003, 05:12 »
lo del menor como int debe ser porque lo inicialice como 1000 y no me acorde que el valor maximo de un char es 255... y getche()... no se
45
« en: Martes 26 de Agosto de 2003, 01:07 »
muestra solo la primera o las ordena todas? si es la 1a, es bastante simple:
#include <stdio.h>
int main(int argc, char **argv) {
int num; char ch,menor=1000;
for(num=1; num<11; num++) { printf("Introduzca la letra %d: ", num);
ch=getchar();
if(ch<menor) menor=ch;
printf("n"); } printf("nnLa menor es la %c",menor); system("pause"); }
46
« en: Domingo 24 de Agosto de 2003, 04:51 »
de hecho podrias hacerlo el doble de eficiente haciendolo saltarse los pares (probar con 2 y despues empezar el for en 3 saltando de 2 en 2). y no se, empieza a probar lo q se te ocurra
47
« en: Domingo 24 de Agosto de 2003, 04:33 »
#include<stdio.h> #include<math.h>
int main(){ int i,esprimo; float numero, div; while(1){ printf("nnTengo hambre, dame un numero: "); scanf("%f",&numero); esprimo=1; for(i=2; i <= sqrt(numero) && esprimo; i++) { div=numero/(float)i; if(div-(int)div==0) esprimo=0; } if(esprimo) printf("Gracias, estaba muy primo es numero:)"); else printf("PUAJ!! ESTE NUMERO ES DIVISIBLE POR %d!!!",i-1); } }
48
« en: Sábado 23 de Agosto de 2003, 04:00 »
mmmmm nop, al reves, strtol = string-to-long. lo q el quiere es pasar de numero a caracter (en q quedamos con lo de la marihuana?)
para eso puedes usar _ltoa
char *_ltoa( long numero, char *string, int base);
por ejemplo:
char *sal, *num; _ltoa(num_temp, num, 10); strcpy(sal, "t_"); strcat(sal, num);
(solo un ejemplo, algo q se me vino a la mente...)
pd: traducete los ejemplos, flojo!
49
« en: Lunes 4 de Agosto de 2003, 21:09 »
en C
50
« en: Lunes 4 de Agosto de 2003, 05:48 »
bueno, eso. busque un poco en el MSDN y los parametros de las funciones q encontre eran:o
|
|
|