| |
|
228
|
Programación / Programación General / Re: Intento de juego en Pascal
|
en: 18 Junio 2008, 01:52
|
Hola Yo para la universidad tuve que hacer un "pinball" en pascal, que realmente es una pelota (bueno una 'O') que choca y cae xD Te lo dejo para que veas como hize para imprimir el tablero y tal. Lo del busca-minas es muy simple. Pintas el tablero y pides por teclado una casilla (no hace falta que uses grafics ni nada de eso) y usas GoToXY para pintar donde quieras y listo. Te dejo mi "pinball" por si le quieres hechar un ojo a algunas funciones que te pueden ser útiles  PROGRAM P3A; USES CRT; CONST (* Colores para el formato del texto *) BLANCO = 15; AMARILLO = 14; ROJO = 4; (* Bordes del tablero *) ESQ_SUPI = chr(201); ESQ_SUPD = chr(187); ESQ_INFI = chr(200); ESQ_INFD = chr(188); BOR_HORI = chr(205); BOR_VERT = chr(186); (* Elementos del tablero *) PELOTA = 'O'; OBSTAC = chr(219); TYPE (* El tipo de array del tablero *) ATablero = ARRAY [0..9, 0..6] OF char; (* Estructura para la posici¢n de la pelota *) StructPos = RECORD F : Integer; (* Fila donde se encuentra la pelota *) C : Integer; (* Columna donde se encuentra la pelota *) Direccion : Integer; (* Direcci¢n hacia la que va la pelota *) END; (************************************) (* SUBPROGRAMAS *) (************************************) (* Procedure que va llamando a distintos procedures para crear la animaci¢n completa as¡ como pedir datos y de m s. *) PROCEDURE CrearAnimacion; VAR Obstaculos : Integer; (* El n£mero de obstaculos *) Tablero : ATablero; (* El tablero *) PosPelota : StructPos; (* La posici¢n de la pelota *) Ganar : Boolean; (* Si hemos ganado o no *) Continuar : Integer; (* Para saber si el jugador quiere jugar m s *) (* Funci¢n que lee por teclado el n£mero de obstaculos que tendr el tablero *) FUNCTION LeerObstaculos : Integer; VAR Obstaculos : Integer; (* El n£mero de obstaculos *) BEGIN (* LeerObstaculos *) REPEAT Clrscr; WriteLn; Write ('šCu ntos obstaculos quiere poner en el tablero? '); ReadLn (Obstaculos); IF (Obstaculos < 0) OR (Obstaculos > 39) THEN BEGIN TextColor(ROJO); WriteLn; WriteLn ('N£mero de obstaculos incorrecto, introduzca un valor entre 0 y 39'); TextColor(BLANCO); delay(2000); END; UNTIL (Obstaculos >= 0) AND (Obstaculos <= 39); LeerObstaculos := Obstaculos; END; (* LeerObstaculos *) (* Procedure que inicializa el tablero coloc ndole los bordes, la pelota y los obstaculos. ENTRADA: - VAR Tablero : El tablero a inicializar - Obstaculos : EL n£mero de obstaculos - StructPos : La posici¢n de la pelota *) PROCEDURE IniTablero(var Tablero : ATablero; Obstaculos : Integer; var PosPelota : StructPos); (* Procedure que pone los bordes al tablero *) PROCEDURE PonerBordes (var Tablero : ATablero); VAR F, C : Integer; (* Contadores para recorres filas y columnas *) BEGIN (* PonerBordes *) FOR F :=0 TO 9 DO BEGIN FOR C :=0 TO 6 DO BEGIN IF F=0 THEN (* Primera fila *) CASE C OF 0 : Tablero[F,C] := ESQ_SUPI; 6 : Tablero[F,C] := ESQ_SUPD; ELSE Tablero[F,C] := BOR_HORI; END ELSE IF F=9 THEN (* Ultima fila *) CASE C OF 0 : Tablero[F,C] := ESQ_INFI; 3 : Tablero[F,C] := ' '; 6 : Tablero[F,C] := ESQ_INFD; ELSE Tablero[F,C] := BOR_HORI; END ELSE (* El resto de las filas *) CASE C OF 0,6 : Tablero[F,C] := BOR_VERT; ELSE Tablero[F,C] := ' '; END; END; (* Segundo FOR *) END; (* Primer FOR *) END; (* PonerBordes *) (* Procedure que pone la pelota en alguna de las casillas superiores del tablero *) PROCEDURE PonerPelota (var Tablero : ATablero; var PosPelota : StructPos); VAR Posicion : Integer; (* La posici¢n aleatoria de la pelota *) BEGIN Posicion := Random(5)+1; Tablero[1,Posicion] := PELOTA; PosPelota.F := 1; PosPelota.C := Posicion; PosPelota.Direccion := Random(8); END; (* Procedure que pone los obstaculos en el tablero aleatoriamente *) PROCEDURE PonerObstaculos(var Tablero : ATablero; Obstaculos : Integer); VAR F, C, N : Integer; (* Filas y columnas *) BEGIN FOR N:= 1 TO Obstaculos DO BEGIN F := Random(8)+1; C := Random(5)+1; IF (Tablero[F,C] = ' ') THEN Tablero[F,C] := chr(219) ELSE N:= N-1; END; END; BEGIN (* IniTablero *) PonerBordes(Tablero); PonerPelota(Tablero, PosPelota); PonerObstaculos(Tablero, Obstaculos); END; (* IniTablero *) (* Procedure que muestra por pantalla el tablero que anteriormente debe haber sido inicializado. ENTRADA: - Tablero : El tablero a pintar *) PROCEDURE PintarTablero(Tablero : ATablero); VAR F, C : Integer; (* Contadores para recorrer filas y columnas *) BEGIN (* PintarTablero *) Clrscr; WriteLn; WriteLn; WriteLn(' Si desea salir pulse enter. Si no el juego finalizar cuando la pelota'); WriteLn(' salga por la casilla vacia de la parte inferior del tablero.'); WriteLn; WriteLn; WriteLn; Write(' '); FOR F := 0 TO 9 DO BEGIN FOR C := 0 TO 6 DO Write (Tablero[F, C]); WriteLn; Write(' '); END; END; (* PintarTablero *) (* Procedure que mueve la pelota por el tablero seg£n corresponda. Devuelve TRUE si la partida ha terminado y FALSE en caso contrario. *) FUNCTION PosicionarPelota(var Tablero : ATablero; var PosPelota : StructPos) : Boolean; (* Procedure que comprueba el posible choque de la pelota y si no choca la posiciona donde corresponde. ENTRADA: - SumFil, SumCol: El n£mero que hay que sumar en el array para mover la pelota en la direcci¢n correcta. - Tablero: El array que representa el tablero. - PosPelota: La estructura con los datos de la pelota. *) Procedure MoverPelota(SumFil, SumCol : Integer; var Tablero : ATablero; var PosPelota : StructPos); BEGIN (* Si la pelota se puede mover *) IF Tablero[PosPelota.F + SumFil, PosPelota.C + SumCol] = ' ' THEN BEGIN Tablero[PosPelota.F, PosPelota.C ] := ' '; PosPelota.F := PosPelota.F + SumFil; PosPelota.C := PosPelota.C + SumCol; Tablero[PosPelota.F, PosPelota.C] := PELOTA; END (* Si la pelota se choca *) ELSE PosPelota.Direccion := Random(8); END; BEGIN (* PosicionarPelota *) (* Comprobamos si hemos ganado *) IF (PosPelota.F = 9) AND (PosPelota.C = 3) THEN BEGIN PosicionarPelota := TRUE; WriteLn; WriteLn; WriteLn; TextColor(AMARILLO); WriteLn(' Felicidades! Ha ganado usted el juego.'); TextColor(BLANCO); END ELSE PosicionarPelota := FALSE; CASE PosPelota.Direccion OF 0: (* Arriba *) MoverPelota(-1, 0, Tablero, PosPelota); 1: (* Arriba-Derecha *) MoverPelota(-1, 1, Tablero, PosPelota); 2: (* Arriba-Izquierda *) MoverPelota(-1, -1, Tablero, PosPelota); 3: (* Izquierda *) MoverPelota(0, -1, Tablero, PosPelota); 4: (* Derecha *) MoverPelota(0, 1, Tablero, PosPelota); 5: (* Abajo *) MoverPelota(1, 0, Tablero, PosPelota); 6: (* Abajo-Derecha *) MoverPelota(1, 1, Tablero, PosPelota); 7: (* Abajo-Izquierda *) MoverPelota(1, -1, Tablero, PosPelota); END; (* END CASE *) END; (* PosicionarPelota *) BEGIN (* CrearAnimacion*) REPEAT Obstaculos := LeerObstaculos; IniTablero (Tablero, Obstaculos, PosPelota); REPEAT PintarTablero(Tablero); Ganar := PosicionarPelota(Tablero, PosPelota); Delay(20); UNTIL KeyPressed OR Ganar; REPEAT WriteLn; WriteLn; WriteLn; Write(' šDesea jugar otra partida? (1 Si/2 No)'); ReadLn (Continuar); IF (Continuar <> 1) AND (Continuar <> 2) THEN BEGIN TextColor(ROJO); WriteLn; WriteLn('Opcion incorrecta. 1 Si/2 No'); TextColor(BLANCO); END; UNTIL (Continuar = 1) OR (Continuar = 2); UNTIL Continuar = 2; END; (* CrearAnimacion*) (************************************) (* PROGRAMA PRINCIPAL *) (************************************) BEGIN (* Programa principal *) Randomize; TextColor(BLANCO); CrearAnimacion; END. Salu2 E0N
|
|
|
|
|
232
|
Programación / Programación C/C++ / Re: duda sobre evadir antivirus...
|
en: 15 Junio 2008, 14:12
|
lo del cripter es relativo... el antivirus no lo va a detectar hasta no ejecutarlo... pero al ejecutarlo el antivirus rastrea las operaciones que se hacen... así que de todas formas los detiene (te digo porque a varios gusanos no me los detectó hasta que se ejecutaron) Eso depende de como esté hecho el crypter. Si el crypter es solo scan-time a la hora de ejecutarlo te lo va a detectar, ya que lo que hace es desencriptar el archivo que lleba pegado, guardarlo en disco y ejecutarlo. Si también es runtime no te lo va a detectar ningún AV, por que el archivo se ejecuta directamente en memoria, sin pasar por disco  lo mejor que podes hacer es evitar un comportamiento predecible Ciertamente si tienes el código es lo mejor que puedes hacer, evita cosas como auto-copiarte y añadirte al registro nada más iniciarse el programa, apis como UrlDownloadFile o CreateRemoteThread, etc Aunque si encriptas la llamada al api bien puedes usarlas sin problemas  Sinos que es lo que te detecta exactamente el AV y a ver que se puede hacer Salu3
|
|
|
|
|
233
|
Programación / Programación C/C++ / Re: Duda en declaración de funciones...
|
en: 15 Junio 2008, 13:59
|
alguien sabe como podría quedar el código final sin tanto fallo? Con gcc -c -Wall pru.cpp y sin ningún error o warning: #include <stdio.h> int main (void) { // FUNCIONES void tabla_multiplicar(int A); void producto_sumas (int numero1, int numero2); void numeros_comprendidos (int numero3, int numero4); int opcion, numero, numero1, numero2, numero3, numero4; printf ("\t\t----Menú----\t\t\n\n"); printf ("\t1. Tabla de multiplicar.\n"); printf ("\t2. Producto por sumas.\n"); printf ("\t3. Números comprendidos.\n"); printf ("\t0. Salir.\n"); printf ("\tElija una opción (0-3): "); scanf ("%d", &opcion); switch (opcion) { case 1: printf ("\tHa elegido la opción 1.\n"); printf ("\tIntroduzca el número a multiplicar: "); scanf ("%d", &numero); tabla_multiplicar (numero); break; case 2: printf ("\tHa elegido la opción 2.\n"); printf ("\tIntroduzca el primer número: "); scanf ("%d", &numero1); printf ("\tIntroduzca el segundo número: "); scanf ("%d", &numero2); if (numero&&numero2>0) producto_sumas (numero1, numero2); else printf ("\tLos valores introducidos son incorrectos.\n"); break; case 3: printf ("\tHa elegido la opción 3.\n"); printf ("\tIntroduzca el primer número: "); scanf ("%d", &numero3); printf ("\tIntroduzca el segundo número: "); scanf ("%d", &numero4); numeros_comprendidos (numero3, numero4); break; case 0: printf ("\tHa elegido la opción 0.\n"); break; default: printf ("\tLa opción elegida es incorrecta.\n"); } } void tabla_multiplicar (int A) { int resultado; int i; for (i=0; i<11; i++) { resultado= A * i; printf ("%d\n", resultado); } } void producto_sumas (int numero1, int numero2) { int c=0; int contadorB; contadorB=0; do { c+=numero1; contadorB++; }while (contadorB<numero2); printf ("El numero es: %d\n", c); } void numeros_comprendidos (int numero3, int numero4) { int numeroauxiliar; if (numero3<numero4) { numero4--; while (numero3<numero4) { numero3++; printf ("%d\n", numero3); } } if (numero4<numero3) { numeroauxiliar=numero4; numero3--; while (numero3>numeroauxiliar) { numeroauxiliar++; printf ("%d\n", numeroauxiliar); } } } La declaración de las funciones las puedes sacar del main y llevártelas arriba sin problemas, pero si solo las vas a llamar desde el main... Salu2
|
|
|
|
|
234
|
Programación / Programación VB / Re: Presentacion en un programa en vb
|
en: 15 Junio 2008, 13:49
|
Se suele llamar Splash a esa ventana. La idea es cargar esa ventana y la ventana principal de tu programa a la vez pero oculta y pasado un tiempo prudencial para que haya cargado todo ocultar el Splash y mostrar tu programa ya cargado. Si tu programa tarda poco en cargar y lo quieres poner por que queda bien simplemente pues haz lo que te ha dicho Xerok1! y listo  Salu2
|
|
|
|
|
235
|
Seguridad Informática / Análisis y Diseño de Malware / Re: AVISO TEMPORAL: Para TOMAR EN CUENTA
|
en: 15 Junio 2008, 13:29
|
A mi esta restructuración no me parece mal porque yo ya aprendí lo suficiente y me se defender con términos normales-complejos de este foro pero a mi me parece mal que el foro no deje por lo menos ALGÚN POST de recopilación de como usar troyanos y de FAQ para los principiantes con ganas de aprender (como yo lo fuí en algún momento)
saludos
pd: cuando el nuevo foro se reestructure yo mismo podría crear un post con una recopilación de como usar el PI 2.3 y las FAQ si Man-in-the-Middle me deja.
Precisamente ese tipo de lammeradas es lo que queremos eliminar, si alguien quiere hacerse el super-hax0r pasándole al PI el crypter indetectable de turno he infectar a mil personas que se vaya a otro foro. El cambio lo que pretende es precisamente evitar ese tipo de cosas, de ahí lo de no subir ejecutables y solo dar el código fuente. El problema va a estar con las personas que no quieran dar el codigo fuente  No veo el problema, si no quieres dar el código fuente, pues no publiques la herramienta, es así de simple. Me pongo a mi mismo como ejemplo, no voy a liberar el código fuente del Small Crypter Público, pues simplemente se borra mi post y aquí paz y despues gloria  Salu2, por fin se lleva a cabo el cambio que todos queríamos
|
|
|
|
|
236
|
Programación / Programación C/C++ / Re: Duda en declaración de funciones...
|
en: 13 Junio 2008, 18:33
|
Pues a mi como es lógico el gcc no me lo compila: e0n@equipo:~/Escritorio$ gcc pru.cpp pru.cpp: In function ‘int main()’: pru.cpp:22: error: ‘tabla_multiplicar’ no se declaró en este ámbito pru.cpp:30: error: ‘producto_sumas’ no se declaró en este ámbito pru.cpp:39: error: ‘numeros_comprendidos’ no se declaró en este ámbito pru.cpp: At global scope: pru.cpp:50: error: ISO C++ prohíbe la declaración de ‘tabla_multiplicar’ sin tipo pru.cpp:66: error: ISO C++ prohíbe la declaración de ‘producto_sumas’ sin tipo pru.cpp:86: error: ISO C++ prohíbe la declaración de ‘numeros_comprendidos’ sin tipo
No se que versión usarás tu o que distro o Dios sabe que, por que eso no está contemplado en el estándar de C. Aparte de que te falta declarar los tipos que devuelve cada función... Salu2
|
|
|
|
|
|
| |
|