28/11/10

Atrás, manos largas




A lo largo de un día, semana o mes cualquiera oigo muchas voces. Y algunas de esas voces me llegan a los oídos sin terminar de comprenderlas. No creo poder hacerlo mientras piense lo que pienso en determinados temas.

¿Nunca os ha emocionado un libro, una película, un videojuego, un cómic, un cuadro o cualquier otra manifestación artística? ¿Nunca habéis sentido esa liberación en forma de fuego abrasador despertando en vuestro interior? ¿Nunca?
Pues yo sí, tantas veces que mi cerebro no es capaz de recordar la cifra. Me he emocionado y he bebido el fuego de la fuerza que esa emoción ha conseguido transmitirme. Gracias a eso he sido capaz de crecer como persona, madurar y orientar mi vida. Son esos momentos los que me han hecho lo que soy y lo que fui. Y estoy segura de que vosotros, a vuestra única manera, también habéis sentido lo mismo: ser capaces de coronar la cima del mundo con vuestra bandera.
Entonces, ¿por qué? ¿Por qué los hacedores se empeñan en castigarnos, amenazarnos, perseguirnos e incapacitarnos cuando les da la santa gana? Tristemente, a lo largo de mis diecinueve años he conocido, directa o indirectamente, a muchísimos autores de manifestaciones artísticas que han cometido semejantes actos.

Entiendo y respeto que haya quien viva de sus libros, películas, pinturas... y que, a cambio de su trabajo, espere una remuneración. Yo misma, de mayor, espero poder ganarme así la vida. También he de decir que yo, como escritora y dibujante ocasional, también he colgado mis "obras" para el uso y disfrute de quien quisiera. Por eso mismo no entiendo que los propios autores me impidan disfrutar sus obras. No entiendo por qué si, visitando Devianart me enamoro de uno de los dibujos y quiero ponerlo de fondo de pantalla, imprimirlo como poster o meterlo en photoshop y customizarlo para hacer de ello un símbolo más que me represente, tengo que frenarme y admirarlo en silencio, en ese sitio, sin mancillarlo con mis sucios clics del ratón o con mis sucias carpetas contenedoras. No entiendo por qué, cuando un fanfiction me llega tan hondo como para arrancarme un par de lágrimas, no pueda ser posible para mí hacérselo llegar a mis allegados porque no tengo absolutamente ningún permiso para traducirlo al castellano, no digamos ya para difundirlo. Y lo mismo podría decirse de la música, los manganimes&cómics, los videojuegos, series y un largo, largo etc.

Lo que estoy afirmando aquí, estúpidos autores egoístas, no es que os vaya a quitar el pan de la boca, ni el crédito de que ese algo sea propiedad de vuestros cerebros. Siempre tendréis el reconocimiento, siempre. Pero cuando algo que habéis hecho es capaz de calar tan profundamente en un ser humano, de obrar en él semejante tormenta de emociones, ¿Cómo podéis seguir pretendiendo que ese algo sea, por entero, vuestro? 
Lo siento, pero me considero más público que autora, y en calidad de tal os voy a decir lo que quizá sea la única verdad que he llegado a entender con los años... 

En el preciso instante en que vuestras obras consiguen hacernos sangrar, justo en ese preciso instante, habremos quedado irremediablemente unidos para siempre. No importa que ocurra después, ni lo tormentosa que sea nuestra relación con vosotros, que habéis creado un arma capaz de hacernos doler tan profundo... no importa, porque en ese momento nosotros no sangramos líquido, sangramos fuego. Quema profundamente, y eso es algo que, una vez probado, jamás, jamás nunca se olvida. Así que atrás, manos largas. Esto también nos pertenece a nosotros.

12/11/10

Next target: Mastermind


-¡Beep! ¡Error! ¡NO compila!
-¡Beep! ¡Error! ¡NO compila! 
(Desperación, golpe)
-¡Beep! ¡Compila! ¡El resultado es el esperado!
Si, hay días que podrían describirse perfectamente así...

El pasado lunes empezamos la tercera y última práctica de mi asignatura cuatrimestral favorita (ejemprogramaciónejem). Muchas, muchísimas veces me he preguntado cuál sería el primer videojuego que programaría... y, aunque no es exactamente un videojuego, ahora ya tengo una respuesta: Mastermind.
La verdad es que casi me caigo de la silla cuando nuestro otro profesor de prácticas (tenemos dos, éste es el especial que solo nos da cuatro clases clave en el curso) nos comentó por encima cómo teníamos que enfocar este proyecto, porque, uhm... cómo decirlo... bueno, el caso es que nunca antes había jugado al Mastermind. Para los que, como yo por aquel entonces, no tengan ni puñetera idea de qué va el juego, podéis informaros aquí y jugarlo aquí.
Después del susto inicial y de unos cuantos ejercicios con matrices y números aleatorios con los que soltarnos, he de decir que estoy emocionada. He leído el guión de la práctica y he empezado a programarlo hasta donde mis conocimientos me han permitido, pero tengo muchas ganas de terminarlo y verlo funcionar de verdad. Y, como me apetece seguir hablando del Mastermind, voy a colgar el primer método del programa porque es muy sencillo y creo que voy a saber explicarlo bien. Este método (en general todos los métodos) hace una determinada función que nosotros hemos programado de antemano. Así, para no tener que estar escribiendo siete veces, por ejemplo, "quiero que eleves al cuadrado el valor de la variable no se cual..." en sintaxis de Java, lo que hacemos es llamar al método "eleva al cuadrado" y decirle sobre qué queremos que lo aplique (normalmente los métodos suelen contener funciones más complicadas). Tachan, lo que antes nos ocupaba veinte líneas ahora sólo nos ocupa una. Ahorramos espacio y el código es mucho más claro y legible.

Método: generaNumeroAleatorio

Los comentarios en Java se escriben mediante doble barra // ó bien barra asterisco-asterisco barra /*-comentario-*/. El código está muy, muy, muy comentado para que sepáis qué significa exactamente cada línea. Cada comentario se refiere a la línea inmediatamente posterior a él (comentario arriba, línea comentada abajo). Los colores los pongo tal y como se asignan en java.

    /*Este método genera un número aleatorio comprendido en el intervalo [1,valoresPosibles]*/
    public static int generaNumeroAleatorio(int valoresPosibles){
                    /*Almacena en una variable llamada "f", un número aleatorio decimal generado entre [0,valoresPosibles]*/
        double f=Math.random()*(valoresPosibles+1);
                    /*Le pedimos que sólo se quede con la parte entera (número sin comas) del número generado.*/
        int a=(int)f;
        /*En las tres líneas siguientes evalúa si el número generado es cero. De ser así lo cambia.*/
        while(a==0){
            f=Math.random()*(valoresPosibles+1);
            a=(int)f;
        }
        /*Una vez nuestros requisitos se cumplan, se devuelve el valor del número generado*/
        return a;
    }


Y eso es todo. Queríamos un número del intervalo cerrado [1, valoresPosibles], así que sólo teníamos que generar números aleatorios y decirle que si generaba un cero lo descartase y volviese a generar otro número aleatorio.


Oh, btw... sólo hay dos lenguas que me resultan tremendamente apasionantes. Puede que la primera ocupe ese lugar privilegiado porque la mayoría de los lenguajes de programación se escriban así, porque sus construcciones idiomáticas resulten apasionantes o porque resulte Descaradamente Genial en labios de Brian Kinney... pero, sea como sea, el inglés es definitivamente la lengua más cool y sexy del mundo. Seguida de cerca, claro está, por el fluido japonés que emana de los labios de Orihara Izaya y compañía...



7/11/10

Sweetie, I'm trying my best

 
Ready... take aim... FIRE!


Ahora no es ya la falta de sentido común lo que gobierna nuestros días. Ahora, además, nos controlan unos principios que pisamos sin miramientos. Y utilizo la primera persona del plural porque la segunda sería una falta de cortesía para el lector que se molesta en leer mis textos, pero realmente yo no me incluyo en ella.

La hipocresía y la falsa moral, viejas enemigas que hoy se han dejado caer por el lugar en el que me encontraba, han hablado a través de labios humanos una vez más. Sinceramente, no sé de qué me sorprendo a estas alturas de la vida. Oh, espera, sí que lo sé. Me molestan soberanamente los jodidos discursitos que se ven asesinados a manos de acciones propias contrarias. Me llevan hasta el extremo infinito de la paciencia. Pero gracias, estúpida. Gracias por recordarme con tanta fuerza por qué hemos de luchar.

Podremos ser pocos, jóvenes o incluso estar demasiado ocupados y desquiciados como para empezar a movernos seriamente. Pero aún así existimos y llevamos la llama del cambio ardiendo en nuestro interior.


2/11/10

Fuck off

Y que siga habiendo gente que no pueda evitar sonrojarse cuando traen a primer plano lo que es. Que se avergüence de ello, que siga pensando en el qué dirán. Que intente ocultarlo, esconderlo, taparlo, fingir.


Pues por mí... 

¡PUEDEN ESCRIBIRLO CON LETRAS DE NEÓN EN EL CIELO!






Si me disculpáis... estimo que me quedan menos de ochenta años de vida que no, obviamente NO pienso desperdiciar en gilipolleces como esa.

1/11/10

¿Tú no sabes hacer magia?


Pues yo sí. Yo sé hacer magia sirviéndome de mis dedos.
No sé cuándo, cómo o por qué exactamente empecé a interesarme por la programación. Pero sí sé que cuando termino de programar algo que sé que sirve para hacer otro algo, experimento una sensación increíble. El simple hecho de pedirle a una cosa inanimada que cobre vida por un instante y realice la tarea que le estoy pidiendo me resulta asombroso. Y más asombro aún me resulta ver que no hay huecos, fallos y que contempla todas las posibilidades de acción de una mente humana. Es decir, que funciona para todos y cada uno de los supuestos que un ser humano podría exigir. Es magia, joder. 
Metafóricamente hablando, claro.

El otro día, terminando mi segunda práctica para la asignatura de programación me di cuenta de lo difícil que me resultaba pensar en los algoritmos y el código de según qué ejercicios. Así que, aunque no fue uno de los que más me costó, voy a colgar el código de mi primer juego de ajedrez en Java. Creo que fue el más laborioso, aunque no es ni de lejos un programa que sirva para jugar una partida completa de ajedrez. Pero, joder, me siento orgullosa de este código. 

Si queréis probarlo tenéis que tener la herramienta Eclipse (sección Download, ahora mismo la versión que está es Eclipse Classic 3.6.1). Muy rápida y fácil de bajar y ejecutar.

Enunciado ejercicio 5. Ajedrez
Crear una clase que recibirá como parámetros del método main 2 valores, que se almacenarán en 2 variables de tipo entero, una llamada numeroPeon y otra llamada movimiento. Crear un único array para representar un tablero de ajedrez con la posición inicial de todas las piezas. Imprimir por pantalla el tablero. Implementar el movimiento del peón blanco indicado por numeroPeon (el situado más a la izquierda será el 1, etc.), que avanzará 1 ó 2 casillas según indique la variable movimiento, e imprimir por pantalla la situación final de tablero. Si elnumeroPeon no es un número entre 1 y 8, o movimiento no es igual a 1 ó 2, imprimir por pantalla "Movimiento no válido". Representar: 


-Casillas vacías: símbolos @ y símbolos #, para casillas blancas y negras
respectivamente.
-Casillas ocupadas: inicial del nombre de la pieza que la ocupa, en
mayúscula para las blancas y en minúscula para las negras (ej. T para una
torre blanca, d para una dama negra, etc.).
 

package práctica3ªParte;

public class Ejercicio5 {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
       
        /*Lo primero que hace es comprobar que se introducen dos  parámetros. Si no es así, el programa lo notificará y se finalizará.*/
        if (args.length>2 || args.length<2){
            System.out.println("Han de introducirse dos parámetros.");
            System.exit(0);
           
        /*Si el número de parámetros introducido es correcto, entonces transformará los parámetros de tipo String a tipo int y los almacenará cada uno en una variable. También crea un array bidimensional de tipo String de 8x8*/
           
        }else{
           
        int numeroPeon= Integer.parseInt(args[0]);
        int movimiento= Integer.parseInt(args[1]);
        String [][] tablero= new String[8][8];
       
        /*Atendiendo a las reglas del ajedrez, sabemos que la primera casilla situada más a la izquierda de cada jugador ha de ser negra y que el rey ha de estar en su color. Planteando que nosotros utilizaramos las piezas negras, la diposición del tablero sería la siguiente.*/
       
        //Piezas blancas frente a nosotros.
        tablero [0][0]= "T";
        tablero [0][1]= "C";
        tablero [0][2]= "A";
        tablero [0][3]= "D";
        tablero [0][4]= "R";
        tablero [0][5]= "A";
        tablero [0][6]= "C";
        tablero [0][7]= "T";
       
        //Peones blancos colocados en sus respectivas posiciones con ayuda de un bucle for.
        for(int j=0; j<8; j++){
            tablero[1][j]= "P";
        }
       
        /*Entre las piezas blancas y las negras hay cuatro filas de casillas vacías. Con ayuda de bucles for inicializamos cada casilla de cada fila con su correspondiente valor.*/
        for (int j=0; j<8; j++){
            tablero[2][j]="@";
            tablero[2][1]="#";
            tablero[2][3]= "#";
            tablero[2][5]="#";
            tablero[2][7]="#";
        }
        for (int j=0; j<8; j++){
            tablero[3][j]="#";
            tablero[3][1]="@";
            tablero[3][3]= "@";
            tablero[3][5]="@";
            tablero[3][7]="@";
        }
       
        for (int j=0; j<8; j++){
            tablero[4][j]="@";
            tablero[4][1]="#";
            tablero[4][3]= "#";
            tablero[4][5]="#";
            tablero[4][7]="#";
        }
        for (int j=0; j<8; j++){
            tablero[5][j]="#";
            tablero[5][1]="@";
            tablero[5][3]= "@";
            tablero[5][5]="@";
            tablero[5][7]="@";
        }
        //Los peones negros son colocados en sus respectivas posiciones con un bucle for.   
        for(int j=0; j<8; j++){
        tablero[6][j]= "p";
        }
        //Piezas negras.
        tablero[7][0]= "t";
        tablero[7][1]="c";
        tablero[7][2]="a";
        tablero[7][3]="d";
        tablero[7][4]="r";
        tablero[7][5]="a";
        tablero[7][6]="c";
        tablero[7][7]="t";
       
        /*El programa se sirve de dos bucles "for" para recorrer todas las posiciones del array. Empieza asignándoles a las dos variables el valor [0][0] y termina cuando asigna la última posición de las filas y las columnas. Imprime por pantalla el tablero de ajedrez con sus posiciones iniciales.*/
        for (int i=0; i
            for (int j=0; j
                System.out.print(tablero[i][j] + "\t");
            }
            System.out.println("");   
        }
        /*Imprime por pantalla un mensaje que separa el tablero inicial del tablero con la jugada*/
        System.out.println("El movimiento de la jugada:");
       
        /*Antes de ejecutar el movimiento, comprueba que los parámetros introducidos son válidos. Si no lo son, lo notifica y se finaliza.*/
        if (numeroPeon>8 || numeroPeon<1){
            System.out.println("Movimiento no válido");
            System.exit(0);
        }
        if (movimiento>2 || movimiento<1){
            System.out.print("Movimiento no válido");
            System.exit(0);
        }
       
        /*Si los parámetros son válidos comprueba qué peón ha de mover y de qué color es la casilla que va a abandonar. Esta comprobación la realiza mirando si el parámetro (al que le restamos una unidad ya que la primera posición de los arrays es "0") es par. Si es par implementamos el movimiento del peón blanco asignando a la casilla que deja vacía el color negro y a la casilla donde se traslada el símbolo del peón*/
        if((numeroPeon-1)%2==0){
            tablero[1][(numeroPeon-1)]="#";
            tablero[1+movimiento][(numeroPeon-1)]="P";
        /*Si el peón no es par implementamos su movimiento asignando a la casilla que deja vacía el color blanco y a la casilla donde se traslada el símbolo del peón.*/
        }else{
            tablero[1][(numeroPeon-1)]="@";
            tablero[1+movimiento][(numeroPeon-1)]="P";
        }
        //Por último, se imprime el tablero por pantalla con el movimiento implementado.
        for (int i=0; i
            for (int j=0; j
                System.out.print(tablero[i][j] + "\t");
            }
            System.out.println("");   
        }
        }
    }
}





Ejecución con parámetros 5 y 2.
 
Nos vemos.