introducción a la programación con greenfoot - michael kölling

211
Introducción a la Programación con Greenfoot Programación Orienda a Objetos en Java TM con Juegos y simulaciones Michael Kölling

Upload: edison-patron

Post on 25-Nov-2015

597 views

Category:

Documents


9 download

TRANSCRIPT

  • www.pearsoneducacion.com

    ISBN 978-84-8322-766-4

    9 7 8 8 4 8 3 2 2 7 6 6 4

    Escrito por el creador de Greenfoot y desarrollador de BlueJ, Michael Klling, Introduccin a la Programacin con Greenfoot usa Greenfoot, un entorno educativo de programacin ganador de premios, para ensear programacin Java estndar.

    Greenfoot utiliza simulaciones y juegos para ensear los principios y conceptos de la programacin orientada a objetos de una forma divertida y asequible. Greenfoot facilita la transicin a la programacin en Java, haciendo que incluso temas avanzados sean fciles de ensear.

    Introduccin a la Programacin con Greenfoot cubre:

    FundamentosdeprogramacinJavaestndar. Enfoqueobjetos-primero. Aprendizajeprcticodirigidoporproyectos. Oportunidadesparaquelosestudiantesdesarrollenrpidamente

    animaciones, juegos y simulaciones.

    Para unirse a la comunidad en lnea Greenfoot y obtener los recursos compartidos para profesores y estudiantes, visite www.greenfoot.org/book/.

    Intr

    oduc

    cin

    a la

    Pro

    gram

    aci

    n co

    n G

    reen

    foot

    Kl

    ling

    ISB

    N 9

    78-8

    4-83

    22-7

    66-4

    97

    88

    48

    32

    27

    66

    4

    Introduccin a la Programacin con GreenfootProgramacin Orienda a Objetos en JavaTM con Juegos y simulaciones

    Michael Klling

    Otro libro de intersProgramacin orientada

    a objetos con Java David J. BarnesMichael KllingPEArsOnPrEnticEHAll

    isBn978-84-832-2350-5

  • 00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina VIII

    www.detodoprogramacion.com

  • Sitio Web ComplementarioLos materiales y recursos adicionales para este libro pueden ser encontrados enhttp://www.greenfoot.org/book/

    Para estudiantes: El software Greenfoot Los escenarios tratados en este libro La galera de Greenfoot una exhibicin de escenarios Videotutoriales Un foro de discusin Soporte tcnico

    Para profesores: Un foro de discusin para profesores Ejercicios adicionales relacionados con el libro El sitio web Green Room conteniendo ejercicios y otros recursos educa-

    tivos

    Introduccin a la Programacin con Greenfoot

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina I

    www.detodoprogramacion.com

  • Introduccin a la Programacin con Greenfoot

    Programacin Orienta a Objetos en Java con Juegos y Simulaciones

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina III

    www.detodoprogramacion.com

  • Introduccin a la Programacin con Greenfoot

    Programacin Orienta a Objetos en Java con Juegos y Simulaciones

    Michael Klling

    TRADUCCIN Y REVISIN TCNICA

    Carlos A. IglesiasDepartamento de Ingeniera de Sistemas Telemticos

    Universidad Politcnica de Madrid

    REVISIN TCNICA PARA LATINOAMRICA

    Ingeniero Marcelo GiuraTitular Informtica II

    Secretario Acadmico UTNUTN Regional Buenos Aires

    Ingeniero Marcelo ngel TrujilloProfesor asociado Informtica I y II

    UTN Regional Buenos Aires

    Mag. Ingeniero Santiago Cristbal PrezProfesor Asociado Arquitectura de Computadoras

    UTN Regional MendozaUniversidad Nacional de Chilecito (La Rioja)

    Ingeniero Atilio RanzugliaJTP Programacin Avanzada y Diseo de Sistemas

    UTN Regional Mendoza

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina V

    www.detodoprogramacion.com

  • Cualquier forma de reproduccin, distribucin, comunicacin pblica o transformacin de esta obra slo puedeser realizada con la autorizacin de sus titulares, salvo excepcin prevista por la ley. La infraccin de los derechosmencionados puede ser constitutiva de delito contra la propiedad intelectual (arts. 270 y sgts. Cdigo penal).

    Dirjase a CEDRO (Centro Espaol de Derechos Reprogrficos: www.cedro.org), si necesita fotocopiar o esca-near algn fragmento de esta obra.

    DERECHOS RESERVADOS 2011, PEARSON EDUCACIN S.A.Ribera del Loira, 2828042 Madrid (Espaa)

    ISBN: 978-84-8322-766-4

    Authorized translation from the English language edition, entitled INTRODUCTION TO PROGRAMMING WITHGREENFOOT: OBJECT-ORIENTED PROGRAMMINGIN JAVA WITH GAMES AND SIMULATIONS, 1st Edition by MICHAEL KOLLING, published by PearsonEducation, Inc, publishing as Prentice Hall, Copyright 2010 All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,electronic or mechanical, including photocopying, recording or by any information storage retrieval system,without permission from Pearson Education, Inc. SPANISH language edition published by PEARSONEDUCACIN S.A., Copyright 2011

    Depsito Legal:

    Equipo editorial:Editor: Miguel Martn-RomoTcnico Editorial: Esther Martn

    Equipo de produccin:Director: Jos A. ClaresTcnico: Irene Iriarte

    Diseo de cubierta: COPIBOOK, S. L.Composicin:Impreso por:

    IMPRESO EN ESPAA - PRINTED IN SPAINEste libro ha sido impreso con papel y tintas ecolgicos

    Nota sobre enlaces a pginas web ajenas: Este libro puede incluir enlaces a sitios web gestionados porterceros y ajenos a PEARSON EDUCACIN S.A. que se incluyen slo con finalidad informativa. PEARSON EDUCACIN S.A. no asume ningn tipo de responsabilidad por los daos y perjuicios derivadosdel uso de los datos personales que pueda hacer un tercero encargado del mantenimiento de las pginasweb ajenas a PEARSON EDUCACIN S. A y del funcionamiento, accesibilidad o mantenimiento de los sitiosweb no gestionados por PEARSON EDUCACIN S.A. Las referencias se proporcionan en el estado en que seencuentran en el momento de publicacin sin garantas, expresas o implcitas, sobre la informacin que seproporcione en ellas.

    INTRODUCCIN A LA PROGRAMACIN CON GREENFOOT. Programacin orientada a Objetos en Java con Juegos y SimulacionesMichael Klling

    PEARSON EDUCACIN, S.A. 2011ISBN: 978-84-8322-766-4

    Materia: 004, Informtica

    Datos de catalogacin bibliogrfica

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina VI

    www.detodoprogramacion.com

  • A Krmel y Crackersu imaginacin no puede nunca desvanecerse.

    mk

    La educacin no es rellenar un cubo, sino encender un fuego.

    William Butler Yeats

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina VII

    www.detodoprogramacion.com

  • 00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina VIII

    www.detodoprogramacion.com

  • Lista de escenarios tratados en este libro XIIIAgradecimientos XVII

    Introduccin 1

    Captulo 1 Comenzando a conocer Greenfoot 3

    1.1 Comenzando 31.2 Objetos y clases 41.3 Interaccionando con objetos 51.4 Tipos de vuelta 61.5 Parmetros 81.6 Ejecucin con Greenfoot 91.7 Un segundo ejemplo 101.8 Comprendiendo el diagrama de clases 101.9 Jugando con asteroides 11

    1.10 Cdigo fuente 121.11 Resumen 14

    Captulo 2 El primer programa: el cangrejito 17

    2.1 El escenario del cangrejito 172.2 Haciendo que el cangrejo se mueva 182.3 Girando 202.4 Tratando los bordes de la pantalla 222.5 Resumen de las tcnicas de programacin 25

    Captulo 3 Mejorando el cangrejo programacin ms sofisticada 27

    3.1 Aadiendo conducta aleatoria 273.2 Aadiendo gusanos 303.3 Comiendo gusanos 323.4 Creando nuevos mtodos 333.5 Aadiendo una langosta 353.6 Control de teclado 363.7 Terminando el juego 383.8 Aadiendo sonido 40

    Contenido

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina IX

    www.detodoprogramacion.com

  • 3.9 Resumen de tcnicas de programacin 41

    Captulo 4 Terminando el juego del cangrejo 43

    4.1 Aadiendo objetos automticamente 434.2 Creando nuevos objetos 454.3 Animando imgenes 464.4 Imgenes de Greenfoot 464.5 Variables de instancia (campos) 484.6 Asignacin 494.7 Usando constructores de actor 504.8 Alternando las imgenes 514.9 La sentencia if/else 52

    4.10 Contando gusanos 534.11 Ms ideas 554.12 Resumen de tcnicas de programacin 55

    Intermedio 1 Compartiendo tus escenarios 57

    I1.1 Exportando tu escenario 57I1.2 Exportar a una aplicacin 57I1.3 Exportar a una pgina web 58I1.4 Publicando en la Galera de Greenfoot 59

    Captulo 5 Haciendo msica: un piano virtual 61

    5.1 Animando las teclas 625.2 Reproduciendo el sonido 645.3 Abstraccin: creando muchas teclas 665.4 Construyendo el piano 675.5 Empleando bucles: el bucle while 685.6 Usando arrays 725.7 Resumen de tcnicas de programacin 76

    Captulo 6 Objetos interactuando: el laboratorio de Newton 79

    6.1 El punto de partida: el laboratorio de Newton 806.2 Clases auxiliares: SmoothMover y Vector 806.3 La clase dada Body 836.4 Primera extensin: creando movimiento 866.5 Usando clases de la librera Java 866.6 Aadiendo fuerza gravitatoria 886.7 El tipo List 916.8 El bucle for-each 926.9 Aplicando la gravedad 94

    6.10 Probando 96

    X | Contenido

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina X

    www.detodoprogramacion.com

  • 6.11 Gravedad y msica 97

    6.12 Resumen de tcnicas de programacin 99

    Captulo 7 Deteccin de colisiones: asteroides 103

    7.1 Investigacin: Qu hay all? 104

    7.2 Pintando estrellas 105

    7.3 Girando 108

    7.4 Volando hacia delante 109

    7.5 Colisionando con asteroides 111

    7.6 Conversin de tipos 113

    7.7 Aadiendo propulsin: la onda de protones 116

    7.8 Creciendo la onda 117

    7.9 Interactuando con objetos al alcance 120

    7.10 Otras mejoras 122

    7.11 Resumen de tcnicas de programacin 123

    Intermedio 2 La competicin Greeps 125

    I2.1 Cmo comenzar 126

    I2.2 Programando tus Greeps 127

    I2.3 Ejecutando la competicin 128

    I2.4 Detalles tcnicos 128

    Captulo 8 Creando imgenes y sonido 129

    8.1 Preparacin 129

    8.2 Trabajando con sonido 131

    8.3 Grabacin y edicin de sonido 131

    8.4 Formatos de los ficheros de sonido y tamaos de ficheros 133

    8.5 Trabajando con imgenes 135

    8.6 Ficheros de imagen y formatos de ficheros 135

    8.7 Dibujando imgenes 137

    8.8 Combinando ficheros de imgenes y dibujo dinmico 139

    8.9 Resumen 141

    Captulo 9 Simulaciones 143

    9.1 Zorros y conejos 144

    9.2 Hormigas 146

    9.3 Recogiendo comida 148

    9.4 Creando el mundo 151

    9.5 Aadiendo feromonas 151

    9.6 Formando un camino 153

    9.7 Resumen 154

    Contenido | XI

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina XI

    www.detodoprogramacion.com

  • Captulo 10 Ms ideas de escenarios 157

    10.1 Canicas 15710.2 Ascensores 15810.3 Boids 15910.4 Crculos 16010.5 Explosin 16010.6 Breakout 16210.7 Salto de plataforma 16310.8 Onda 16410.9 Resumen 164

    Apndice 167

    A Instalando Greenfoot 167B API de Greenfoot 169C Deteccin de colisiones 173D Algunos detalles de Java 179

    ndice analtico 189

    XII | Contenido

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina XII

    www.detodoprogramacion.com

  • Hojas y Wombtidos (Captulo 1)ste es un ejemplo sencillo que muestra cmo los wombtidos se mueven por la pantallas, comiendohojas ocasionalmente. El escenario no tiene ningn otro propsito que ilustrar algunos conceptos im-portantes de la orientacin a objetos as como las interacciones con Greenfoot.

    Asteroides 1 (Captulo 1) sta es una versin simplificada del juego clsico de arcade. Vuelas una nave espacial e intentasevitar ser golpeado por asteroides. En esta etapa, slo usamos el escenario para hacer algunos peque-os cambios e ilustrar algunos conceptos bsicos.

    Cangrejito (Captulo 2)ste es nuestro primer desarrollo completo. A partir de casi nada, desarrollamos un juego simplepoco a poco, aadiendo muchas cosas tales como movimiento, control del teclado, sonido y muchosotros elementos tpicos de los juegos.

    Piano (Captulo 5)Un piano virtual donde puedes tocar realmente.

    El laboratorio de Newton (Captulo 6)El laboratorio de Newton es una simulacin de los movimientos de las estrellas y los planetas en elespacio. La gravedad juega un papel central aqu. Tambin hacemos una variante de esto que combinala gravedad con la creacin de msica, terminando con una salida musical activada por los objetosbajo movimientos gravitatorios.

    Asteroides 2 (Captulo 7) Volvemos al ejemplo de asteroides del Captulo 2. Esta vez, investigamos con ms detalle cmo im-plementarlo.

    Hormigas (Captulo 9)Ana simulacin de colonias de hormigas buscando comida, y comunicndose mediante gotas deferomonas dejadas en la tierra.

    Los siguientes escenarios se presentan en el Captulo 10 y algunos aspectos seleccionados sedescriben brevemente. Estn pensados como inspiracin para otros proyectos.

    CanicasUna simulacin del juego de las canicas. Las canicas deben sacarse del tablero en un nmero limitadode movimientos. Contiene fsica simple.

    AscensoresUn inicio de una simulacin de un ascensor. Est incompleto en esta fase puede ser usado comocomienzo de un proyecto.

    Lista de escenarios tratadosen este libro

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina XIII

    www.detodoprogramacion.com

  • BoidsUna demostracin de comportamiento gregario: una bandada de aves vuela por la pantalla, con el ob-jetivo de permanecer unidas mientras evitan obstculos.

    CrculosRealiza patrones en diferentes colores en la pantalla con crculos en movimiento.

    ExplosinUna demostracin de un efecto de explosin ms sofisticado.

    Breakoutste es el inicio de una implementacin del juego clsico Breakout. Muy incompleto, pero con unosefectos visuales interesantes.

    Salto de plataformasUna demostracin de una implementacin parcial de un gnero siempre popular de videojuegos:salto de plataformas.

    OndaEste escenario es una demostracin simple de un efecto fsico: la programacin de una onda en unacadena.

    XIV | Lista de escenarios tratados en este libro

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina XIV

    www.detodoprogramacion.com

  • PrefacioGreenfoot es un entorno de programacin que puede ser usado tanto para auto-aprendizaje, como enescuelas o en cursos universitarios introductorios para aprender y ensear los principios de progra-macin. Es suficientemente flexible para ser adecuado para adolescentes o estudiantes mayores.

    Greenfoot soporta el lenguaje de programacin Java, de forma que los estudiantes aprenden de formaconvencional programacin orientada a objetos en Java. El entorno ha sido diseado especficamentepara cubrir los conceptos y principios orientados a objetos de una forma limpia y asequible.

    El entorno Greenfoot hace que la creacin de grficos e interacciones sea fcil. Los estudiantes pue-den concentrarse en modificar la lgica de la aplicacin, y combinar y experimentar con los objetos.El desarrollo de simulaciones y juegos interactivos se convierte en algo sencillo, que proporciona re-sultados de forma inmediata.

    El entorno ha sido diseado para atraer rpidamente a estudiantes que pueden no tener conocimientosprevios o experiencia en programacin. Se consigue rpidamente realizar animaciones simples, y esposible realizar escenarios con un aspecto profesional.

    Accediendo a materiales complementarios

    Las ayudas al aprendizaje y materiales complementarios citados en el libro pueden ser accedidos atravs del sitio web complementario o a travs del sitio web de la editorial:

    Sitio web complementario: http://www.greenfoot.org/book/Sitio web de la editorial: http://www.prenhall.com/kolling

    Materiales complementarios disponibles para los estudiantes

    Los siguientes complementos estn disponibles para los estudiantes:

    El software de Greenfoot.

    Los escenarios tratados en este libro.

    La galera de Greenfoot un sitio pblico de escenarios.

    Videotutoriales.

    Un foro de discusin.

    Soporte tcnico.

    Materiales complementarios disponibles para instructores

    Los siguientes complementos estn disponibles para instructores:

    Un foro de discusin de profesores.

    Ejercicios adicionales relacionados con el libro.

    El sitio web Green Room que contiene ejercicios y otros recursos.

    Para ms detalles sobre Greenfoot y este libro, por favor, mira la Introduccin despus de los Agra-decimientos.

    Lista de escenarios tratados en este libro | XV

    00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina XV

    www.detodoprogramacion.com

  • 00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina XVI

    www.detodoprogramacion.com

  • Este libro es el resultado de ms de cinco aos de trabajo de un grupo de personas. En primer lugar,y de forma ms destacada, estn las personas que han contribuido al desarrollo del entorno Greenfoot,que hace que sea posible este enfoque educativo. Paul Henriksen comenz la implementacin deGreenfoot como su proyecto de Master y desarroll el primer prototipo. l tambin acept el reto depasar este prototipo a un sistema en produccin. Durante el primer ao o as, fuimos un equipo dedos personas, y el trabajo de Poul condujo a la calidad y robustez del sistema actual.

    Bruce Quig y Davin McCall fueron los siguientes desarrolladores que se unieron al proyecto, y Poul,Bruce, y Davin desarrollaron conjuntamente la mayora de lo que es Greenfoot hoy. Los tres son de-sarrolladores software excepcionales, y no puede dejar de recalcarse la importancia de su contribucinal proyecto. Es un placer trabajar con ellos.

    Finalmente, el grupo entero BlueJ se involucr en el proyecto Greenfoot, incluyendo a John Rosen-berg y Ian Utting, y este libro se ha elaborado a partir de las contribuciones y trabajo comn de todoslos miembros del grupo.

    Los colegas del Laboratorio de Computacin de la Universidad de Kent tambin me han ayudado engran medida, especialmente nuestro director de departamento Simon Thompson, que vio el valor deGreenfoot desde el principio y nos ha apoyado y motivado para que continuramos su desarrollo.

    Otra contribucin importante, sin la que el desarrollo de Greenfoot (y en ltima instancia, este libro)no hubiera sido posible, es el generoso apoyo de Sun Microsystems. Emil Sarpa, Katherine Hartsell,Jessica Orquina, Sarah Hammond, y muchos otros en Sun creyeron en el valor de nuestro sistema ynos proporcionaron apoyo importante.

    Todo el mundo en Pearson Education trabajaron duramente para conseguir que este libre se publicaraa tiempo, con una planificacin muy ajustada, e incluso a veces en circunstancias difciles. TracyDunkelberger trabaj conmigo en este libro desde el principio. Ella gestion asombrosamente bienel mantener una actitud positiva y entusiasta a la vez que soportaba mis reiterados retrasos en las en-tregas, y an me animaba para continuar escribiendo. Melinda Haggerty hizo un montn de cosas di-ferentes, incluyendo la gestin de las revisiones.

    Un especial agradecimiento debe ir a los revisores del libro, que han proporcionado comentarios muydetallados, meditados y tiles. Han sido Carolyn Oates, Damianne President, Detlef Rick, Gunnar Jo-hannesmeyer, Josh Fishburn, Mark Hayes, Marla Parker, Matt Jadud, Todd OBryan, Lael Grant,Jason Green, Mark Lewis, Rodney Hoffman y Michael Kadri. Han ayudado sealando muchos erroresas como oportunidades de mejora.

    Mi buen amigo Michael Caspersen tambin merece un agradecimiento por proporcionarme comen-tarios desde el principio y animarme, lo que ha sido muy importante para m, porque ayud a mejorarel libro, y, an ms importante, porque me anim a creer que este trabajo podra ser interesante a losprofesores y mereca la pena terminarlo.

    Agradecimientos

    00-Primeras:Maquetacin 1 15/2/11 11:18 Pgina XVII

    www.detodoprogramacion.com

  • Bienvenido a Greenfoot! En este libro, aprenderemos cmo programar programas grficos, talescomo simulaciones o juegos, usando el lenguaje de programacin Java y el entorno Greenfoot.

    Hay varios objetivos para hacer esto: uno es aprender a programar, otro es divertirse en el camino.Aunque los ejemplos que emplearemos en el libro son especficos del entorno de programacin Gre-enfot, los conceptos son generales. Es decir, mientras avanzas con el libro aprenders principios ge-nerales de programacin, siguiendo un lenguaje moderno orientado a objetos. Adems, aprenderscmo realizar tu propio juego de ordenador, una simulacin biolgica o un piano virtual.

    Este libro sigue una orientacin muy prctica. Los captulos y ejercicios estn estructurados mediantetareas prcticas de desarrollo. En primer lugar, se presenta un problema que debemos resolver, y acontinuacin se muestran los constructores del lenguaje y las estrategias que nos ayudan a resolverel problema. Este enfoque es bastante diferente de muchos libros de programacin que a menudo seestructuran siguiendo el orden de los constructores del lenguaje.

    Como resultado, este libro comienza con menos teora y ms actividades prcticas que la mayora delibros de programacin. sta es tambin la razn por la que usamos Greenfoot, que es el entorno quelo hace posible. Greenfoot nos permite jugar. Y eso no se limita a jugar con juegos de ordenador, sig-nifica tambin jugar con la programacin: podemos crear objetos, moverlos en la pantalla, llamar asus mtodos, y observar lo que hacen, todo de forma fcil e interactiva. Esto conduce a un enfoquems prctico a la programacin que no sera posible sin contar con este entorno.

    Un enfoque ms prctico no significa que el libro no cubra tambin la teora y principios necesariosde programacin. Simplemente se ha cambiado el orden. En vez de introducir un concepto terica-mente primero, y luego hacer ejercicios, a menudo vamos a emplear directamente un constructor,explicando slo lo que sea imprescindible para realizar la tarea, volviendo ms tarde con el soporteterico. Seguiremos normalmente un enfoque en espiral: introducimos algunos aspectos de un con-cepto la primera vez que lo encontramos, luego volvemos a revisarlo ms tarde en otro contexto, yprofundizamos en su comprensin de forma gradual.

    El objetivo es hacer que el trabajo que hagamos sea interesante, relevante y divertido. No hay ningunarazn por la que la programacin tenga que ser rida, formal o aburrida. Es conveniente divertirsemientras aprendemos. Creemos que debemos conseguir que la experiencia de aprender sea interesantey pedaggicamente consistente a la vez. Esto es un enfoque que ha sido llamado diversin seria hacemos algo interesante, y aprendemos algo til a la vez.

    Este libro puede ser usado como libro de auto-estudio al igual que como libro de texto en un cursode programacin. Los ejercicios se desarrollan a lo largo del libro si los haces todos, acabarssiendo un programador bastante competente.

    Los proyectos que se desarrollan en el libro son suficientemente sencillos como para que puedan serresueltos por estudiantes de secundaria, pero tambin son suficientemente abiertos y extensiblescomo para que incluso programadores avezados puedan encontrar aspectos interesantes y desafiantespara realizarlos. Aunque Greenfoot es un entorno educativo, Java no es un lenguaje de juguete. Como

    Introduccin

    00-Primeras:Maquetacin 1 15/2/11 11:18 Pgina 1

    www.detodoprogramacion.com

  • Java es el lenguaje elegido en este libro, los proyectos desarrollados (y cualquier otro que quieras crearcon Greenfoot) pueden ser tan complejos y complicados como quieras.

    Aunque es posible crear juegos rpida y fcilmente en Greenfoot, es igualmente posible construir si-mulaciones muy sofisticadas de sistemas complejos, pudiendo emplear algoritmos de inteligenciaartificial, tecnologa de agentes, conectividad con base de datos, o cualquier otra tecnologa en laque puedas pensar. Java es un lenguaje muy completo que te permite usar todo el potencial del mundode la programacin, y Greenfoot no impone ninguna restriccin en qu aspectos del lenguaje puedesusar.

    En otras palabras, Greenfoot escala bien. Permite empezar a programar fcilmente a los jvenes pro-gramadores, pero tambin permite que programadores experimentados puedan implementar escena-rios interesantes y sofisticados.

    Slo ests limitado por tu imaginacin!

    2 | Introduccin

    00-Primeras:Maquetacin 1 15/2/11 11:18 Pgina 2

    www.detodoprogramacion.com

  • Este libro mostrar cmo desarrollar juegos y simulaciones con Greenfoot, un entorno de desarrollosoftware. En este captulo, presentaremos el entorno Greenfoot, qu puede hacer y cmo se usa, em-pleando programas ya hechos.

    Una vez que nos hayamos familiarizado con el uso de Greenfoot, empezaremos directamente a es-cribir juegos nosotros mismos.

    El mejor modo para leer este captulo (y de hecho todo el libro) es sentndote con tu ordenador abiertoen tu mesa. Te pediremos frecuentemente que hagas cosas con Greenfoot mientras lees. Algunas delas tareas te las puedes saltar; sin embargo, tendrs que hacer algunas para poder progresar en el ca-ptulo. En cualquier caso, aprenders mejor si las realizas.

    En este punto, asumimos que tienes ya instalado el software de Greenfoot as como los escenarios dellibro (descritos en el Apndice A). Si no, lee este apndice primero 1.

    ComenzandoLanza Greenfoot y abre el escenario leaves-and-wombats del directorio book-scenarios de Greenfoot.

    Comprueba que has abierto el escenario leaves-and-wombats que encuentras en el directorio book-scenarios, y no uno similar, escenario wombats, de la instalacin estndar de Greenfoot.

    Vers la interfaz de la ventana principal de Greenfoot, con el escenario abierto, de forma similar a laFigura 1.1. La ventana principal consta de tres reas principales y un par de botones adicionales. Lasreas principales son:

    temas: la interfaz de Greenfoot, interaccionando con objetos, invocando m-todos, ejecutando un escenario

    conceptos: objeto, clase, llamada a un mtodo, parmetro, valor de vuelta

    Nota Si es la primera vez que lanzas Greenfoot, vers un cuadro de dilogo que te pregunta ququieres hacer. Selecciona Elegir un escenario. En otro caso, usa Escenario-Abrir 2 del men.

    1 N. del T. En el libro se asume que usas la interfaz de usuario en espaol. Consulta el manual para ver cmolanzarla en http://www.greenfoot.org/doc/translations.html.2 Usamos esta notacin para decirte cmo seleccionar una funcin del men. Escenario-Abrir te indica queselecciones el elemento Abrir del men Escenario.

    CAPTULO

    1 Comenzando a conocer Greenfoot

    1.1

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 3

    www.detodoprogramacion.com

  • El mundo. Se llama mundo al rea ms grande que ocupa la mayor parte de la pantalla (una rejillade color tierra en este caso). Es donde el programa se ejecutar y vers lo que ocurre.

    El diagrama de clases. Se llama diagrama de clases al rea de la derecha con cajas y flechas decolor beis. Lo describiremos con ms detalle en breve.

    Los controles de ejecucin. Los controles de ejecucin son los botones Accionar, Ejecutar, yReiniciar y la barra inferior para ajustar la velocidad. Volveremos tambin ms tarde con ellos.

    Objetos y clasesComenzaremos con el diagrama de clases. El diagrama de clases nos muestra las clases que participanen este escenario. En este caso, tenemos World, WombatWorld, Actor, Leaf y Wombat.

    Emplearemos el lenguaje de programacin Java en nuestros proyectos. Java es un lenguaje orientadoa objetos. Los conceptos de clases y objetos son fundamentales en la orientacin a objetos.

    Comencemos observando la clase Wombat. La clase Wombat representa el concepto general de unwombtido describe a todos los wombtidos. Una vez que tenemos una clase en Greenfoot, pode-mos crear objetos de esa clase. (Los objetos se llaman a menudo instancias o ejemplares en progra-macin estos trminos son sinnimos.)

    Un wombtido, por cierto, es un marsupial australiano (Figura 1.2). Si quieres saber ms sobre ellos,busca en Internet encontrars muchos resultados.

    Pincha con el botn derecho 3 en la clase Wombat, y vers una ventana emergente con el men de clase(Figura 1.3a). Esta primera opcin del men, new Wombat(), nos permite crear nuevos objetos dela clase Wombat. Intntalo.

    4 | Captulo 1 Comenzando a conocer Greenfoot

    Figura 1.1La ventana principal

    de Greenfoot

    Mundo

    Diagramade clases

    Controles de ejecucin

    1.2

    3 En Mac OS, pincha mientras mantienes pulsada la tecla Control, en vez de pinchar con el botn derecho si tie-nes un ratn de un botn.

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 4

    www.detodoprogramacion.com

  • Vers que obtienes una pequea imagen de un objeto Wombat, que puedes mover por la pantalla contu ratn (Figura 1.3b). Coloca el objeto wombat en el mundo simplemente pinchando en cualquier sitiodel mundo (Figura 1.3c).

    a) b) c)

    Una vez que tienes una clase en Greenfoot, puedes crear tantos objetos como quieras.

    Actualmente, slo nos interesan las clases Wombat y Leaf. Trataremos el resto de clases ms tarde.

    Interaccionando con objetosUna vez que has colocado varios objetos en el mundo, podemos interactuar con estos objetos pinchandocon el botn derecho sobre ellos. Esto abrir una ventana emergente con el men de los objetos (Fi-

    1.2 Interaccionando con objetos | 5

    Figura 1.2Un wombtido en

    el Parque Nacional

    de Narawntapu,

    Tasmania 4

    Figura 1.3a) El men de clase

    b) Arrastrando

    un nuevo objeto

    c) Colocando

    el objeto

    Concepto:

    Se pueden crearmuchos objetosde una clase.

    Ejercicio 1.1 Crea algunos wombtidos ms en el mundo. Crea algunas hojas (clase Leaf 5).

    1.3

    4 Fuente de la imagen: Wikipedia, sujeta a la licencia GNU Free Documentation License.5 N. del T. Leaf es hoja en ingls.

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 5

    www.detodoprogramacion.com

  • gura 1.4). El men de los objetos nos muestra todas las operaciones que este objeto especfico puederealizar. Por ejemplo, el men de un objeto de la clase Wombat, nos muestra lo que el wombtido puedehacer (ms dos funciones adicionales, Inspeccionar y Eliminar, que comentaremos ms tarde).

    En Java, estas operaciones se llaman mtodos. Es bueno usar la terminologa estndar, as que tambinles llamaremos mtodos a partir de ahora. Podemos invocar un mtodo seleccionndolo del men.

    En breve, podemos comenzar a hacer que pasen cosas si creamos objetos de una de las clases pro-porcionadas, y podemos dar rdenes a los objetos invocando sus mtodos.

    Observemos con ms atencin el objeto men. Los mtodos move y turnLeft se listan como:

    void move()void turnLeft()

    Podemos ver que los nombres de los mtodos no son la nica cosa que se muestra. Tambin aparecela palabra void al comienzo y un par de parntesis al final. Estas dos piezas crpticas de informacinnos dicen qu datos recibe una llamada a un mtodo y qu datos nos devuelve dicha llamada.

    Tipos de vueltaLa palabra del principio se llama tipo de vuelta (return type). Nos dice lo que el mtodo nos devolversi lo invocamos. La palabra void significa nada en este contexto: los mtodos con un tipo devuelta void no devuelven ninguna informacin. Estos mtodos simplemente ejecutan su accin, yluego paran.

    6 | Captulo 1 Comenzando a conocer Greenfoot

    Concepto:

    Los objetos tienenmtodos. Si invocas un mtodo, se realizauna accin.

    Ejercicio 1.2 Invoca el mtodo move() de un wombtido. Qu hace? Prubalo varias veces.Invoca el mtodo turnLeft() (girarIzquierda()). Coloca enfrentados dos wombtidosen tu mundo.

    Figura 1.4El men del objeto

    wombtido

    1.4

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 6

    www.detodoprogramacion.com

  • Cualquier otra palabra diferente de void nos dice que el mtodo devuelve alguna informacin cuandoes llamado, y de qu tipo es esa informacin. En el men del wombtido (Figura 1.4) podemos vertambin las palabras int y boolean. La palabra int es la abreviatura de integer (entero) y se re-fiere a todos los nmeros enteros (nmeros sin punto decimal). Algunos ejemplos de nmeros enterosson 3, 42, -3, y 12000000.

    El tipo booleano (boolean) tiene slo dos valores posibles: true (cierto) y false (falso). Unmtodo que devuelve un boolean nos devolver o bien el valor true o bien el valor false.

    Los mtodos con tipo de vuelta void son como rdenes. Si invocamos el mtodo turnLeft, elwombtido obedece y gira a la izquierda. Los mtodos con tipos de vuelta diferentes de void soncomo preguntas. Considera el mtodo canMove:

    boolean canMove()

    Cuando invocamos este mtodo, vemos un resultado similar al mostrado en la Figura 1.5, que muestrauna ventana de dilogo. La informacin importante aqu es la palabra true, que es lo que el mtodonos ha devuelto.

    En efecto, acabamos de preguntar al wombtido Puedes moverte? y el wombtido ha respondidoS! (true).

    Prueba otro mtodo que tambin devuelve un valor:

    int getLeavesEaten()

    Usando este mtodo, podemos conseguir la informacin de cuntas hojas se ha comido el womb-tido.

    1.4 Tipos de vuelta | 7

    Ejercicio 1.3 Invoca el mtodo canMove() en tu wombtido. Siempre devuelve true? Opuedes encontrar situaciones que devuelva false?

    Ejercicio 1.4 Usando un objeto wombtido que acabes de crear, el mtodo getLeavesEaten()siempre devolver cero. Puedes crear una situacin en que el resultado de este mtodo no seacero? (En otras palabras, puedes hacer que tu wombtido coma algunas hojas?)

    Concepto:

    El tipo de vueltade un mtodoespecifica lo quedevolver unallamada a dichomtodo.

    Concepto:

    Un mtodo contipo de vuelta voidno devuelveningn valor.

    Figura 1.5Un resultado

    de un mtodo

    Concepto:

    Los mtodos contipos de vueltavoid representanrdenes; losmtodos con tiposde vueltadiferentes de voidrepresentanpreguntas

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 7

    www.detodoprogramacion.com

  • Los mtodos con tipos de vuelta que no son void normalmente nos dicen algo sobre el objeto(Puede moverse? Cuntas hojas ha comido?), pero no cambian el objeto. El wombtido est igualque antes de que le preguntramos sobre las hojas. Los mtodos con tipos de vuelta void son nor-malmente rdenes a los objetos para que hagan algo.

    ParmetrosLa otra parte que an no hemos visto del men mtodo son los parntesis tras el nombre del mtodo.

    int getLeavesEaten()void setDirection(int direction)

    Los parntesis despus del nombre del mtodo contienen la lista de parmetros (o argumentos). Estonos dice que el mtodo requiere alguna informacin adicional para poder ejecutarse, y si la requiere,qu tipo de informacin.

    Si slo vemos un par de parntesis sin nada ms dentro (tal como hemos visto en todos los mtodoshasta ahora), entonces el mtodo tiene una lista vaca de parmetros. En otras palabras, no espera nin-gn parmetro cuando invoquemos el mtodo, simplemente se ejecutar. Si no hay nada dentro delos parntesis, entonces el mtodo espera uno o ms parmetros se debe proporcionar informacinadicional.

    Probemos el mtodo setDirection2. Podemos ver que tiene las palabras int direction escritasen su lista de parmetros. Cuando lo invocamos, vemos una ventana de dilogo similar a la mostradaen la Figura 1.6.

    Las palabras int direction nos indican que este mtodo espera un parmetro de tipo int, que es-pecifica una direccin. Un parmetro es una informacin adicional que debemos proporcionar a unmtodo para que se ejecute. Cada parmetro se define mediante dos palabras: primero, el tipo del pa-rmetro (aqu: int) y luego el nombre, que nos da una idea de para qu se usa este parmetro. Si unmtodo tiene un parmetro, necesitamos proporcionar esta informacin adicional cuando invoquemosel mtodo.

    En este caso, el tipo int nos dice que deberamos proporcionar un nmero entero, y el nombre sugiereque este nmero especifica de alguna forma la direccin para girar.

    En la parte superior de la ventana hay un comentario que nos da un poco ms de informacin: el pa-rmetro direction debera valer entre 0 y 3.

    8 | Captulo 1 Comenzando a conocer Greenfoot

    1.5

    Concepto:

    Un parmetro esun mecanismopara pasar datosadicionales a unmtodo.

    Concepto:

    Los parmetros y los valores de vuelta tienentipos. Algunosejemplos de tiposson int paranmeros, yboolean paravalorescierto/falso.

    Figura 1.6Una ventana de

    llamada a un mtodo

    2 N. del T. Direction es direccin en ingls. El mtodo setDirection se traduce por establece direccin.

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 8

    www.detodoprogramacion.com

  • El mtodo setDirection espera slo un parmetro. Despus, veremos casos de mtodos que es-peran ms de un parmetro. En ese caso, el mtodo listar todos los parmetros que espera dentro delos parntesis.

    La descripcin de cada mtodo se muestra en el men del objeto, incluyendo el tipo de vuelta, elnombre del mtodo, y la lista de parmetros, que se denomina signatura del mtodo.

    Hemos alcanzado ahora un punto donde puedes realizar las principales interacciones con los objetosde Greenfoot. Puedes crear objetos de clases, interpretar las signaturas de los mtodos, e invocar losmtodos (con y sin parmetros).

    Ejecucin con GreenfootHay otra forma de interaccionar con los objetos de Greenfoot: los controles de ejecucin.

    El mtodo act es un mtodo fundamental de los objetos Greenfoot. Lo encontramos frecuentementeen todos los captulos restantes. Todos los objetos en un mundo Greenfoot tienen este mtodo act.Invocar al mtodo act es como si le ordenramos al objeto Haz lo que quieres hacer ahora. Si lohas probado en nuestro wombtido, vers que el mtodo act hace algo as:

    Si estoy sentado en una hoja, me la como.

    Si no, si puedo ir hacia delante, me muevo hacia delante.

    En el resto de casos, giro a la izquierda.

    Los experimentos de los ejercicios anteriores deberan haberte mostrado que el botn Actuar de loscontroles de ejecucin simplemente llama al mtodo act de los actores en el mundo. La nica dife-

    1.6 Ejecucin con Greenfoot | 9

    Concepto:

    La especificacinde un mtodo, quemuestra su tipo devuelta, nombre yparmetros sedenominasignatura.

    Ejercicio 1.5 Invoca el mtodo setDirection(int direction). Proporciona un valor alparmetro y observa qu ocurre. Qu nmero corresponde a cada direccin? Escrbelo. Quocurre cuando escribes un nmero mayor de 3? Qu ocurre si introduces algo que no sea unnmero entero, como por ejemplo un nmero (2.5) o una palabra (tres)?

    1.6

    Consejo:

    Puedes colocar los objetos en el mundo msrpidamente si seleccionas una clase en eldiagrama declases, y entoncespinchas en elmundo mientraspulsas la tecla de maysculas.

    Ejercicio 1.6 Coloca un wombtido y un buen nmero de hojas en el mundo, e invoca enton-ces varias veces el mtodo act6() del wombtido. Qu hace el mtodo? En qu se diferenciadel mtodo move? Asegrate de comprobar situaciones diferentes, por ejemplo con un wom-btido mirando en el borde del mundo, o sentado sobre una hoja

    Ejercicio 1.7 An con un wombtido y algunas hojas en el mundo pincha en el botn Accionarsituado en los controles de ejecucin cerca de la parte inferior de la ventana de Greenfoot. Quhace?

    Ejercicio 1.8 Cul es la diferencia entre pinchar en el botn Actuar e invocar el mtodoact()? (Intenta con varios wombtidos en el mundo.)

    Ejercicio 1.9 Pincha en el botn Ejecutar. Qu hace?Concepto:

    Los objetos que sepueden colocar enel mundo sellaman actores.

    6 N. del T. Act significa actuar o accionar.

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 9

    www.detodoprogramacion.com

  • rencia con invocar el mtodo a travs del men del objeto es que el botn Actuar llama al mtodo actde todos los objetos del mundo, mientras que el men de objeto slo afecta al objeto escogido.

    El botn Ejecutar simplemente llama al mtodo act una y otra vez hasta que pinchas en Pausa.Vamos a probar lo que hemos visto hasta ahora en el contexto de otro escenario.

    Un segundo ejemploAbre otro escenario, denominado asteroids1, de la carpeta chapter01 enlos escenarios del libro. Debeser como el de la Figura 1.7 (excepto que no vers an el cohete o los asteroides en tu pantalla).

    Comprendiendo el diagrama de clasesObservemos primero con mayor detalle el diagrama de clases (Figura 1.8). En la parte superior, versdos clases llamadas World (mundo) y Space (espacio), conectadas por una flecha.

    La clase World est siempre en todos los escenarios de Greenfoot forma parte de Greenfoot. Laclase debajo de ella, Space en este caso, representa el mundo especfico de este escenario concreto(el espacio). Su nombre puede ser diferente en cada escenario, pero todos los escenarios siempre ten-drn un mundo especfico aqu.

    La flecha indica una relacin es-un: Space es un World (en el sentido de mundos de Greenfoot:Space, aqu, es un mundo especfico de Greenfoot). Tambin a veces decimos que Space es una sub-clase de World.

    10 | Captulo 1 Comenzando a conocer Greenfoot

    1.7

    1.8

    Concepto:

    Una subclasees una clase querepresenta unaespecializacin deotra. En Greenfoot,esto se denotacon una flecha en el diagrama de clases.

    Figura 1.7El escenario

    asteroids1

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 10

    www.detodoprogramacion.com

  • Normalmente no tenemos que crear objetos de las clases mundo Greenfoot lo hace por nosotros.Cuando abrimos un escenario, Greenfoot crea automticamente un objeto de la subclase mundo. Elobjeto se muestra entonces en la parte principal de la pantalla. (La imagen negra grande del espacioes un objeto de la clase Space.)

    Debajo de esto, vemos otro grupo de seis clases, enlazadas por flechas. Cada clase representa a suspropios objetos. Listando desde abajo, vemos que tenemos cohetes (rockets), balas (bullets), y aste-roides (asteroids), y que todos son movibles (movers), mientras que las explosiones (explosions)y los movibles son actores.

    De nuevo, tenemos definidas relaciones de subclase: Rocket, por ejemplo, es una subclase de Mover,y tanto Mover como Explosion son subclases de Actor. (Recprocamente, decimos que Mover esuna superclase de Rocket y que Actor es una superclase de Explosion.)

    La relacin de subclase puede recorrer varios niveles: Rocket, por ejemplo, es tambin una subclasede Actor (porque es una subclase de Mover, la cual es una subclase de Actor). Trataremos mstarde ms detalles del significado de subclases y superclases.

    La clase Vector, mostrada en la parte inferior del diagrama bajo el encabezado Otras clases, es unaclase de apoyo o auxiliar usada por otras clases. No podemos poner objetos de ella en el mundo.

    Jugando con asteroidesPodemos comenzar a jugar en este escenario creando algunos objetos actores (objetos de subclasesde Actor) y colocarlos en el mundo. En este caso, slo creamos objetos de las clases que no tienensubclases: Rocket, Bullet, Asteroid y Explosion.

    1.9 Jugando con asteroides | 11

    Figura 1.8Un diagrama

    de clases

    1.9

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 11

    www.detodoprogramacion.com

  • Comencemos colocando un cohete (rocket) y dos asteroides en el espacio. (Recuerda: puedes crearlos objetos pinchando con el botn derecho en la clase, o seleccionando la clase y pinchando mientraspulsas maysculas.)

    Cuando hayas colocado los objetos, pincha en el botn Ejecutar. Ya puedes controlar la nave espacialcon las flechas del teclado, y puedes disparar usando la barra de espacio. Intenta evitar los asteroidesantes de chocar con ellos.

    Cdigo fuenteLa conducta de cada objeto se define en su clase. Para especificar esta conducta, debemos escribircdigo fuente en el lenguaje de programacin Java. El cdigo fuente de una clase especifica todos losdetalles sobre la clase y sus objetos. Para ver el cdigo fuente de una clase, selecciona la opcinAbrir el editor del men de la clase, que te mostrar la ventana de edicin (Figura 1.9) con el cdigofuente de la clase.

    El cdigo fuente de esta clase es relativamente complejo, y no necesitamos entenderlo por ahora. Sinembargo, si estudias el resto de este libro y programas tus propios juegos o simulaciones, aprenderscmo programarlo.

    En este momento, slo es importante que entiendas que podemos cambiar la conducta de los objetoscambiando el cdigo fuente de las clases. Vamos a intentarlo.

    Hemos visto antes que la velocidad de disparo del cohete por defecto era bastante lenta. Podramoscambiarla individualmente para cada cohete, invocando un mtodo en cada nuevo cohete, pero ten-dramos que repetir esta operacin una y otra vez, cada vez que empezamos a jugar. En vez de esto,

    12 | Captulo 1 Comenzando a conocer Greenfoot

    Ejercicio 1.10 Si has jugado al juego durante un rato, habrs notado que no puedes dispararmuy rpido. Vamos a ajustar nuestro software de disparo de la nave para que podamos dispararun poco ms rpido. (Esto debe facilitar que nos libremos de los asteroides ms fcilmente!).Coloca un cohete en el mundo e invoca su mtodo setGunReloadTime (a travs del men deobjeto), y fija el tiempo de recarga del arma (gun reload time) a 5. Juega de nuevo (con al menosdos asteroides) y prubalo.

    Ejercicio 1.11 Una vez que has conseguido eliminar todos los asteroides (o en otro puntodel juego), para la ejecucin (pulsa Pausa) y averigua cuntos disparos has disparado. Puedessaberlo usando un mtodo del men de objeto cohete. (Intenta destruir dos asteroides con elmenor nmero de balas posible.)

    Ejercicio 1.12 Habrs notado que el cohete se mueve un poco en cuanto lo colocas en elmundo. Cul es su velocidad inicial?

    Ejercicio 1.13 Los asteroides tienen una estabilidad intrnseca. Cada vez que disparamos,su estabilidad decrece. Cuando llega a cero, explotan. Cul es su estabilidad inicial despusde crearlos? En cunto decrece la estabilidad si reciben un disparo?

    (Pista: Dispara a un asteroide slo una vez, y mira cunto vale la estabilidad antes y despusdel disparo. Otra pista: para disparar a un asteroide, debes ejecutar el juego. Para usar el mende un objeto, debes pausar antes el juego.)

    Ejercicio 1.14 Crea un asteroide muy grande.

    Concepto:

    En cada clase sedefine en sucdigo fuente.Este cdigo definequ pueden hacerlos objetos de estaclase. Podemosver el cdigofuente abriendo el editor de clases.

    1.10

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 12

    www.detodoprogramacion.com

  • podemos cambiar el cdigo del cohete para que cambie su velocidad inicial (digamos a 5), de formaque todos los cohetes comiencen a partir de ahora con una conducta mejor.

    Abre el editor de la clase Rocket. Si bajas unas 25 lneas, debers encontrar una lnea que pone

    gunReloadTime = 20;

    Aqu es donde se fija el tiempo inicial de recarga del arma. Cambia esta lnea para que ponga

    gunReloadTime = 5;

    No cambies nada ms. Vers muy pronto que hay que ser muy meticuloso al programar sistemas. Unsimple carcter errneo o que falte un carcter producir errores. Por ejemplo, si borras el punto ycoma del final de la lnea, se producira un error ms adelante.

    Cierra la ventana del editor (hemos terminado el cambio) y vuelve a mirar el diagrama de clases.Ahora ha cambiado: varias clases aparecen con rayas (Figura 1.10). Las rayas indican que una claseha sido editada y debe ser compilada. La compilacin es un proceso de traduccin: el cdigo fuentede la clase se traduce en un cdigo mquina que tu ordenador puede ejecutar.

    Las clases deben compilarse siempre despus de que el cdigo fuente haya cambiado, antes de quenuevos objetos de esa clase puedan ser creados. (Habrs notado que varias clases necesitan ser recom-piladas aunque slo hemos cambiado una clase. Esto sucede a menudo porque unas clases dependende otras. Cuando una cambia, varias necesitan ser traducidas de nuevo.)

    1.10 Cdigo fuente | 13

    Figura 1.9La ventana

    de edicin

    de la clase Rocket

    Pista:

    Puedes editar una clasepinchando dosveces en la claseen el diagrama de clases.

    Concepto:

    Los ordenadoresno entiendencdigo fuente.Debetransformarseantes en cdigomquina para quese pueda ejecutar.Este proceso sedenominacompilacin.

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 13

    www.detodoprogramacion.com

  • Podemos compilar las clases pinchando en el botn Compilar Todo en la esquina inferior derecha dela venta principal de Greenfoot. Una vez que las clases han sido compiladas, las rayas desaparecen,y podemos crear los objetos otra vez.

    Volveremos al juego de los asteroides en el Captulo 7, donde veremos cmo programar este juego.

    ResumenEn este captulo, hemos visto cmo son los escenarios de Greenfoot y cmo interactuar con ellos.Hemos visto cmo crear objetos y cmo comunicarnos con estos objetos invocando sus mtodos.Algunos mtodos son rdenes al objeto, mientras que otros objetos devuelven informacin sobre elobjeto. Los parmetros son usados para proporcionar informacin adicional a los mtodos, mientrasque los tipos de vuelta devuelven informacin al llamante.

    Los objetos se crean desde sus clases, y el cdigo fuente controla la definicin de la clase (y conesto, la conducta y caractersticas de todos los objetos de la clase).

    Hemos visto que podemos cambiar el cdigo fuente usando un editor. Despus de editar el cdigofuente, las clases necesitan ser recompiladas.

    Pasaremos la mayor parte del resto del libro aprendiendo cmo escribir cdigo fuente en Java paracrear escenarios que hagan cosas interesantes.

    14 | Captulo 1 Comenzando a conocer Greenfoot

    Ejercicio 1.15 Haz los cambios descritos anteriormente en la clase Rocket. Cierra el editory compila las clases. Prubalo: los cohetes deberan ahora ser capaces de disparar ms rpidodesde el principio.

    Figura 1.10Las clases despus

    de editar

    1.11

    Resumen de conceptos

    Los escenarios de Greenfoot consisten en un conjunto de clases.

    Se pueden crear muchos objetos de una misma clase.

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 14

    www.detodoprogramacion.com

  • Trminos en ingls

    Ingls Espaol

    object objetoclass claseclass diagram diagrama de clasescompilation compilacincompile compilehelper class clase de apoyoinvoke a method invocar un mtodoinstance instancia, ejemplarmethod mtodomethod call llamada a un mtodoparameter parmetro, argumentosignature signaturasource code cdigo fuentesubclass subclasereturn type tipo de vuelta

    1.11 Resumen | 15

    Los objetos tienen mtodos. Al invocarlos, realizan una accin.

    El tipo de vuelta de un mtodo especifica lo que la llamada a un mtodo devolver.

    Un mtodo con un tipo de vuelta void no devuelve ningn valor.

    Los mtodos con tipos de vuelta void representan rdenes; los mtodos con tipos de vuelta diferentesde void representan preguntas.

    Un parmetro es un mecanismo para pasar datos adicionales a un mtodo.

    Los parmetros y los tipos de vuelta tienen tipos. Algunos ejemplos de tipos son int para nmerosy boolean para valores cierto/falso.

    La especificacin de un mtodo, que muestra su tipo de vuelta, nombre, y parmetros se llama sig-natura.

    Los objetos que pueden ser colocados en el mundo se conoce como actores.

    Una subclase es una clase que representa una especializacin de otra. En Greenfoot, esto se muestracon una flecha en el diagrama de clases.

    Cada clase se define por su cdigo fuente. Este cdigo define lo que los objetos de esta clase pue-den hacer. Podemos ver el cdigo fuente abriendo el editor de la clase.

    Los ordenadores no entienden cdigo fuente. Necesita ser traducido a cdigo mquina antes deejecutarlo. Esto se denomina compilacin.

    Cap.1:Maquetacin 1 1/2/11 21:48 Pgina 15

    www.detodoprogramacion.com

  • 00-Primeras:Maquetacin 1 15/2/11 11:17 Pgina VIII

    www.detodoprogramacion.com

  • En el capitulo anterior, presentamos cmo usar los escenarios que vienen con Greenfoot. Hemoscreado objetos, invocado mtodos, y jugado un juego.

    Ahora, comenzaremos a hacer nuestro propio juego.

    El escenario del cangrejitoEl escenarios que usaremos en este captulo se llama little-crab. Encontrars este escenario en los pro-yectos de este libro.

    El escenario debe ser similar al mostrado en la Figura 2.1.

    A la derecha, ves las clases del escenario (Figura 2.2). Fjate que tenemos como siempre la claseActor de Greenfot, una clase llamada Animal, y la clase Crab (cangrejo).

    La jerarqua (denotada por flechas) indica una relacin es-un (tambin denominada de herencia): uncangrejo es un animal, y un animal es un actor. (Se deduce entonces, que un cangrejo es tambin unactor.)

    Inicialmente, trabajaremos slo con la clase Crab. Hablaremos ms adelante sobre las clases Actory Animal.

    Si has hecho el ejercicio anterior, sabrs que la respuesta a la pregunta Qu observas? es nada.

    El cangrejo no hace nada cuando ejecutas Greenfoot. Esto se debe a que la clase Crab tiene el cdigofuente sin rellenar, y no se especifica, por tanto, qu debe hacer el cangrejo.

    En este captulo, trabajaremos para cambiar esto. La primera cosa que haremos ser conseguir queel cangrejo se mueva.

    temas: programacin: movimiento, girar, reaccionar a las esquinas de la pan-talla

    conceptos: cdigo fuente, llamada a mtodo, parmetro, secuencia, sentencia if

    CAPTULO

    2 El primer programa:el cangrejito

    2.1

    Ejercicio 2.1 Lanza Greenfoot y abre el escenario little-crab. Coloca un cangrejo en el mundoy ejecuta el programa (pincha en el botn Ejecutar). Qu observas? (Recuerda: si los iconosde las clases aparecen rayados, debes compilar el proyecto antes.)

    Cap.2:Maquetacin 1 1/2/11 21:52 Pgina 17

    www.detodoprogramacion.com

  • Haciendo que el cangrejo se muevaEchemos un vistazo al cdigo fuente de la clase Crab. Abre el editor y muestra el cdigo fuente deCrab. (Puedes hacer esto seleccionando la opcin Abrir Editor del men emergente de la clase, o sim-plemente puedes pinchar dos veces en la clase.)

    El cdigo fuente que ves se muestra en el cuadro de Cdigo 2.1.

    18 | Captulo 2 El primer programa: el cangrejito

    2.2

    Figura 2.1El escenario

    Cangrejito

    Figura 2.2Las clases actor

    del Cangrejito

    Cap.2:Maquetacin 1 1/2/11 21:52 Pgina 18

    www.detodoprogramacion.com

  • import greenfoot.*; // (World, Actor, GreenfootImage, y Greenfoot)

    /*** Esta clase define un cangrejo. Los cangrejos viven en la playa.*/public class Crab extends Animal{

    public void act(){

    //Aade aqu tu cdigo para hacer acciones.}

    }

    sta es una definicin estndar de una clase Java. Esto es, este texto define lo que el cangrejo puedehacer. Lo veremos con ms detalle un poco ms adelante. Por ahora, nos concentraremos en conseguirque el cangrejo se mueva.

    Dentro de esta definicin de clase, podemos ver el denominado mtodo act. Sigue este esquema:

    public void act(){

    // Aade tu cdigo de accin aqu.}

    La primera lnea es la signatura del mtodo. Las tres ltimas lneas las dos llaves y nada entre ellases denominado el cuerpo del mtodo. Aqu, podemos aadir el cdigo que determine las acciones delcangrejo. Podemos reemplazar el texto gris de en medio con una orden. Una posible orden es:

    move();

    Fjate que hay que escribirlo exactamente como est puesto, incluyendo los parntesis y el punto ycoma. El mtodo act debera estar ahora as:

    public void act(){

    move();}

    Vers que el cangrejo se puede mover ahora por la pantalla. La instruccin move() hace que el can-grejo se mueva un poco a la derecha. Cuando pinchamos en el botn Actuar en la ventana principalde Greenfoot, el mtodo act se ejecuta una vez. Esto es, la instruccin que hemos escrito dentro delmtodo act (move()) se ejecuta.

    2.2 Haciendo que el cangrejo se mueva | 19

    Cdigo 2.1La versin inicial

    de la clase Crab

    Ejercicio 2.2 Cambia el mtodo act en tu clase cangrejo para incluir la instruccin move()(muvete) como se ha mostrado antes. Compila el escenario (pincha en el botn Compila Todo)y coloca un cangrejo en el mundo. Prueba a pinchar los botones Actuar y Ejecutar.

    Ejercicio 2.3 Coloca varios cangrejos en el mundo. Ejecuta el escenario. Qu observas?

    Cap.2:Maquetacin 1 1/2/11 21:52 Pgina 19

    www.detodoprogramacion.com

  • Pinchar en el botn Ejecutar es como pinchar en el botn Accionar varias veces, muy rpidamente.Por tanto, el mtodo act se ejecuta una y otra vez hasta que pinchamos en Pausa.

    GirandoVeamos qu otras instrucciones podemos usar. El cangrejo tambin entiende la instruccin turn(gira). A continuacin se muestra un ejemplo de uso:

    turn(5);

    El nmero 5 en la instruccin especifica cuntos grados debe girar el cangrejo. Se denomina par-metro. Tambin podemos usar otros nmeros, por ejemplo

    turn(23);

    El nmero de grados es 360, por lo que podemos dar un valor entre 0 y 359. (Girar 360 grados sig-nifica dar una vuelta entera, al igual que girar 0 grados significa no girar nada.)

    Si quisiramos girar en vez de movernos, podemos reemplazar la instruccin move() con una ins-truccin turn(5). El mtodo act ser como sigue:

    public void act(){

    turn(5);}

    La siguiente cosa que vamos a intentar es que se mueva y gire. El mtodo act puede contener msde una instruccin podemos simplemente escribir varias instrucciones seguidas.

    El Cdigo 2.2 muestra la clase completa Crab, como debe estar si queremos que se mueva y gire acontinuacin. En este caso, en cada paso, el cangrejo se mover y girar despus (pero estas accionessucedern tan rpidamente una tras otra que parece que suceden a la vez).

    20 | Captulo 2 El primer programa: el cangrejito

    2.3

    Terminologa

    La instruccin move() se denomina una llamada a un mtodo. Un mtodo es una accin que unobjeto sabe cmo realizar (aqu el objeto es el cangrejo) y una llamada a un mtodo es una instruc-cin que le dice al cangrejo lo que debe hacer. Los parntesis son parte de la llamada a un mtodo.Las instrucciones terminan con un punto y coma.

    Concepto:

    Cuando hay variasinstrucciones, seejecutan ensecuencia, unatras otra, en elorden en que hansido escritas.

    Concepto:

    Podemos pasarinformacinadicionala algunosmtodos entre los parntesis. Los valores quepasamos sedenominanparmetros.

    Ejercicio 2.4 Reemplaza move() con turn(5) en tu escenario. Prubalo. Prueba tambincon valores diferentes de 5, y mira qu pasa. Recuerda: cada vez que cambias el cdigo, debesvolver a compilar.

    Ejercicio 2.5 Cmo puedes hacer que el cangrejo gire a la izquierda?

    Cap.2:Maquetacin 1 1/2/11 21:52 Pgina 20

    www.detodoprogramacion.com

  • import greenfoot.*; // (World, Actor, GreenfootImage, y Greenfoot)/*** Esta clase define un cangrejo. Los cangrejos viven en la playa.*/public class Crab extends Animal{

    public void act(){

    move();turn(5);

    }}

    Nota al margen: ErroresCuando escribimos cdigo fuente, tenemos que ser muy cuidadosos cada carcter cuenta. Si te-nemos un pequeo fallo, nuestro programa no funcionar. Normalmente, no compilar.

    Esto nos pasar a menudo. Cuando escribimos programas, inevitablemente cometemos errores, y te-nemos que corregirlos. Probemos esto ahora.

    Si, por ejemplo, olvidamos escribir un punto y coma despus de la instruccin move(), nos advertircuando intentemos compilarlo.

    2.3 Girando | 21

    Cdigo 2.2Haciendo que el

    cangrejo se mueva

    y gire

    Ejercicio 2.6 Usa las instrucciones move() y turn(N) en el mtodo act de tu cangrejo.Prueba con varios valores de N.

    Terminologa

    El nmero que va entre parntesis en la instruccin turnesto es, el 5 en turn(5) se denominaparmetro. Un parmetro es una informacin adicional que tenemos que proporcionar cuando lla-mamos a algunos mtodos.

    Algunos mtodos, como move, no esperan ningn parmetro. Pueden ejecutarse sin problemascuando escribimos la instruccin move(). Otros mtodos, como turn, necesitan ms informacin:Cunto debera girar? En este caso, tenemos que proporcionar esta informacin mediante el valorde un parmetro entre los parntesis, por ejemplo, turn(17).

    Concepto:

    Cuando secompila una clase,el compiladorcomprueba si hayalgn error. Siencuentra alguno,muestra unmensaje de error.

    Ejercicio 2.7 Abre tu editor para mostrar el cdigo fuente del cangrejo, y borra el punto ycoma despus de move(). Compila a continuacin. Puedes probar tambin con otros errores,como una errata al escribir move o hacer algn cambio aleatorio al cdigo. Comprueba bien quedeshaces todos estos cambios despus de terminar el ejercicio.

    Ejercicio 2.8 Haz cambios diferentes para causar mensajes de error diferentes. Encuentraal menos cinco mensajes de error. Escribe cada mensaje de error y qu cambio produjo el error.

    Cap.2:Maquetacin 1 1/2/11 21:52 Pgina 21

    www.detodoprogramacion.com

  • Como podemos ver en este ejercicio, si cometemos un pequeo error, Greenfoot abrir el editor, des-tacar la lnea, y mostrar un mensaje en la parte inferior de la ventana del editor. Este mensaje in-tenta explicar el error. Los mensajes, sin embargo, varan considerablemente en su precisin yutilidad. Algunas veces nos dicen con mucha precisin cul es el problema, pero otras veces son algocrpticos y difciles de entender. La lnea que se resalta es a menudo la lnea donde hay un problema,pero otras veces es una lnea posterior al problema. Cuando ves, por ejemplo, un mensaje del tipo; expected, es posible que lo que pase sea que falta el punto y coma de la lnea anterior a lalnea destacada.

    Aprenders a entender estos mensajes con el tiempo. Por ahora, si obtienes un mensaje, y no entiendesmuy bien qu significa, revisa cuidadosamente tu cdigo, y comprueba que has escrito todo correc-tamente.

    Tratando los bordes de la pantallaCuando hicimos que los cangrejos se movieran y giraran en las secciones previas, se quedaban blo-queados cuando alcanzaban el borde de la pantalla. (Greenfoot est diseado para que los actores nopuedan salir del mundo y caerse en el borde.)

    Ahora vamos a mejorar esta conducta de forma que el cangrejo detecte que ha alcanzado el final delmundo, y se gire. La pregunta es, cmo hacemos esto?

    Anteriormente hemos usado los mtodos move y turn, as que puede que haya otro mtodo que nosayude con este nuevo objetivo. (De hecho, lo hay.) Pero, cmo averiguamos qu mtodos hay dis-ponibles?

    Los mtodos move y turn que hemos usado hasta ahora vienen de la clase Animal. Un cangrejo esun animal (esto est indicado por la flecha que va de Crab a Animal en el diagrama de clases), portanto, puede hacer todo lo que los animales pueden hacer. Nuestra clase Animal sabe cmo moversey girar esta es la razn por la que el cangrejo tambin sabe cmo hacerlo. Esto se denomina he-rencia: la clase Crab hereda todas las habilidades (mtodos) de la clase Animal.

    La pregunta ahora es, qu ms cosas pueden hacer los animales?

    Para investigar esto, podemos abrir el editor de la clase Animal. El editor puede mostrar dos vistasdiferentes: puede mostrar el cdigo fuente (como hemos visto para la clase Crab) o puede mostrarla documentacin. La vista puede ser cambiada seleccionando un men de seleccin en la esquinasuperior derecha de la ventana del editor. Ahora queremos ver la clase Animal en la Vista de docu-mentacin (Figura 2.3).

    Si miramos el resumen de mtodos, podemos ver todos los mtodos que proporciona la clase Animal.Hay tres mtodos que nos son especialmente interesantes en este momento:

    boolean atWorldEdge()Comprueba si estamos cerca de uno de los bordes del mundo.

    22 | Captulo 2 El primer programa: el cangrejito

    Pista:

    Cuando un mensajede error aparece enla parte inferior dela ventana deedicin, un botncon unainterrogacinaparece a laderecha. Si pinchasen el botn,muestrainformacinadicional delmensaje de error.

    2.4

    Concepto:

    Una subclasehereda todos losmtodos de susuperclase. Estosignifica que tieney puede usartodos los mtodosque su superclasedefina.

    Ejercicio 2.9 Abre el editor de la clase Animal. Cambia a la vista de documentacin. Buscala lista de mtodos de esta clase (el resumen de mtodos). Cuntos mtodos tiene estaclase?

    Cap.2:Maquetacin 1 1/2/11 21:52 Pgina 22

    www.detodoprogramacion.com

  • void move()Moverse hacia delante en la direccin actual.

    void turn(int angulos)Girar los grados angulos hacia la derecha (sentido horario).

    Aqu podemos ver las signaturas de los tres mtodos, que ya vimos en el Captulo 1. La signatura decada mtodo comienza con el tipo de vuelta, seguido por el nombre del mtodo y la lista de parme-tros. Antes de nombres de los tres mtodos son atWorldEdge, move, y turn.

    Los mtodos move y turn son los que usamos en secciones previas. Si miramos a sus listas de pa-rmetros, podemos ver lo que observamos antes: move no tiene parmetros (los parntesis estn va-cos), y turn espera un parmetro de tipo int (un nmero entero) para el ngulo. (Lee la seccin1.5 de nuevo si no recuerdas las listas de parmetros.)

    Podemos ver tambin que los mtodos move y turn tienen void como tipo de vuelta. Esto significaque no devuelven ningn valor. Estamos ordenando al objeto que se mueva o gire. El animal slo tieneque obedecer la orden, pero no nos tiene que dar ninguna respuesta.

    La signatura de atWorldEdge es un poco diferente. Es

    boolean atWorldEdge()

    Este mtodo no tiene parmetros (no hay nada entre los parntesis), pero especifica un tipo de vuelta:boolean. Nos hemos encontrado antes con el tipo boolean type en la seccin 1.4 es un tipo quepuede tener dos valores: true o false.

    Cuando llamamos a mtodos que tienen valores de vuelta (en el caso de que el tipo de vuelta no sea void)no es como realizar una orden, sino como hacer una pregunta. Si usamos el mtodo atWorldEdge(),

    2.4 Tratando los bordes de la pantalla | 23

    Figura 2.3Vista de

    documentacin

    (con resumen

    de mtodos) de la

    clase Animal.Resumen

    de mtodos Cambiar

    de vista

    Concepto:

    Cuando llamamosa un mtodo contipo de vueltavoid realiza unaorden. Sinembargo, cuandollamamos a unmtodo con tipode vuelta que noes void realizauna pregunta.

    Cap.2:Maquetacin 1 1/2/11 21:52 Pgina 23

    www.detodoprogramacion.com

  • el mtodo deber responder o bien true (S!) o false (No!). Por tanto, podemos usar este mtodopara comprobar si estamos en un borde del mundo.

    Podemos ahora combinar este mtodo con una sentencia-if para escribir el cdigo mostrado en C-digo 2.3.

    import greenfoot.*; // (World, Actor, GreenfootImage, y Greenfoot)/*** Esta clase define un cangrejo. Los cangrejos viven en la playa.*/

    public class Crab extends Animal{

    public void act(){

    if ( atWorldEdge() ){

    turn(17);}move();

    }}

    La sentencia if es una parte del lenguaje Java que permite ejecutar rdenes slo si se cumple unacondicin. Por ejemplo, aqu queremos girar slo si estamos cerca del borde del mundo. El cdigoque tenemos que escribir es:

    if ( atWorldEdge() ){

    turn(17);}move();

    La forma general de una sentencia if es sta:

    if ( condicin ){

    instruccin;instruccin;

    ...}

    24 | Captulo 2 El primer programa: el cangrejito

    Ejercicio 2.10 Crea un cangrejo. Pincha con el botn derecho en l, y busca el mtodoboolean atWorldEdge() (est en el submen heredado de Animal, dado que el cangrejo he-reda este mtodo de la clase Animal). Invoca este mtodo. Qu devuelve?

    Ejercicio 2.11 Deja que el cangrejo corra hasta el borde de la pantalla (o muvelo all ma-nualmente), y llama entonces otra vez al mtodo atWorldEdge(). Qu devuelve ahora?

    Cdigo 2.3Girando alrededor

    del borde del mundo

    Concepto:

    Una sentencia ifpuede ser usadapara escribirinstrucciones queson ejecutadasslo si se cumpleuna condicin.

    Cap.2:Maquetacin 1 1/2/11 21:52 Pgina 24

    www.detodoprogramacion.com

  • Donde pone condicin se puede poner cualquier expresin que sea cierta o falsa (tales como nuestrallamada al mtodo atWorldEdge()), y las instrucciones se ejecutarn slo si la condicin es cierta.Puede haber una o ms instrucciones.

    Si la condicin es falsa, se salta las instrucciones, y la ejecucin contina despus de la llave que cie-rra la sentencia if.

    Observa que nuestra llamada al mtodo move() est fuera de la sentencia if, por lo que ser ejecutadosiempre. En otras palabras, si estamos en el borde del mundo, giramos y nos movemos a continuacin;si no estamos en el borde del mundo, slo nos movemos.

    Resumen de tcnicas de programacinEn este libro, estamos aprendiendo a programar con un enfoque guiado por ejemplos. Introducimoslas tcnicas generales de programacin a medida que las necesitamos para mejorar nuestros esce-narios. Resumiremos las tcnicas de programacin ms importantes a final de cada captulo, paraque quede claro lo que necesitas saber del desarrollo de los ejercicios para progresar adecuada-mente.

    En este captulo, hemos visto cmo invocar mtodos (tales como move()), con y sin parmetros. Estoser la base de la programacin en Java. Tambin hemos aprendido cmo identificar el cuerpo del m-todo act aqu es donde comenzamos a escribir instrucciones.

    2.5. Resumen de tcnicas de programacin | 25

    Pista:

    En el editor deGreenfoot, cuandocolocas el cursordespus de unallave que se abre o se cierra,Greenfoot muestrala llavecorrespondienteque estamoscerrando o abriendo. Estose puede usarpara comprobar si tus llaves estncorrectas, o falta o sobra alguna.

    Ejercicio 2.12 Prubalo! Escribe el cdigo discutido anteriormente y observa si tus cangre-jos giran en el borde de la pantalla. Presta atencin a los smbolos de abrir y cerrar llave esfcil olvidar uno o poner demasiados.

    Ejercicio 2.13 Experimenta con varios valores para el parmetro del mtodo turn. Encuentrauno que te parezca adecuado.

    Ejercicio 2.14 Coloca la sentencia move() dentro de la sentencia if, en vez de despusde ella. Averigua cul es el efecto y explica la conducta que observas. (Luego, arrglalo volvin-dolo a dejar como estaba.)

    Nota: Sangrado

    En todos los ejemplos de cdigo que hemos visto hasta ahora (por ejemplo, Cdigo 2.3), puedeshaber notado que hemos usado un sangrado cuidadoso. Cada vez que se abre una llave, las lneassiguientes estn sangrada un nivel ms que las anteriores. Cuando se cierra una llave, el sangradoretrocede un nivel, de forma que la llave que cierra est justo debajo de la llave correspondiente queabre. Esto facilita encontrar qu llave estamos cerrando.

    Usamos cuatro espacios por nivel de sangrado. La tecla Tab inserta espacios en tu editor para unnivel de sangrado.

    Es muy importante tener cuidado con el sangrado en tu cdigo. Si no sangras con cuidado, algunoserrores (en especial, que falten o sobren llaves) son difciles de localizar. Un buen sangrado hace elcdigo ms legible, y evita por tanto errores potenciales.

    2.5

    Cap.2:Maquetacin 1 1/2/11 21:52 Pgina 25

    www.detodoprogramacion.com

  • Resumen de conceptos

    Una llamada a un mtodo es una instruccin que le dice a un objeto que realice una accin. La ac-cin se define por el mtodo del objeto.

    Se puede pasar informacin adicional a algunos mtodos entre los parntesis. Los valores pasadosse denominan parmetros.

    Se pueden ejecutar mltiples instrucciones en secuencia, una tras otra, en el orden en que son es-critas.

    Cuando una clase se compila, el compilador comprueba si hay errores. Si encuentra un error, muestraun mensaje de error.

    Una subclase hereda todos los mtodos de su superclase. Esto significa que tiene, y puede usar,todos los mtodos que su superclase defina.

    Si llamamos a un mtodo con un tipo de vuelta void, estamos ordenando algo. Si llamamos a un m-todo con un tipo de vuelta distinto de void, estamos preguntando algo.

    Una sentencia if puede ser usada para escribir instrucciones que son ejecutadas slo cuando secumple una condicin.

    Trminos en ingls

    Ingls Espaol

    body cuerpoindentation sangradoinheritance herenciamethod mtodomethod call llamada a mtodorun ejecutarstatement sentencia

    26 | Captulo 2 El primer programa: el cangrejito

    Te has encontrado algunos mensajes de error. Esto ser algo continuo durante todas tus tareas de pro-gramacin. Todos cometemos errores y todos encontramos mensajes de error. Esto no es un signo deser un programador malo es una parte normal de la programacin

    Hemos comenzado a ver qu es la herencia: las clases heredan los mtodos de sus superclases. Lavista de documentacin de una clase nos da un resumen de los mtodos disponibles.

    Y, muy importante, hemos visto cmo tomar decisiones. Hemos usado la sentencia if para la ejecucincondicional. Esto ha ido de la mano con la aparicin del tipo boolean, cuyo valor puede ser true ofalse.

    Cap.2:Maquetacin 1 1/2/11 21:52 Pgina 26

    www.detodoprogramacion.com

  • En el captulo anterior, vimos lo bsico para comenzar a programar nuestro primer juego. Hubo muchascosas nuevas que tuvimos que ver. Ahora, aadiremos conductas ms interesantes. Nos resultar msfcil aadir cdigo a partir de ahora, ya que hemos visto muchos de los conceptos fundamentales.

    La primera cosa que miraremos es cmo aadir conducta aleatoria.

    Aadiendo conducta aleatoriaEn nuestra implementacin, el cangrejo se puede mover por la pantalla, y puede girar en el borde denuestro mundo. Pero cuando anda, anda siempre hacia delante en lnea recta. Esto es lo que queremoscambiar ahora. Los cangrejos no andan siempre en lnea recta, vamos a aadir un poco de conductaaleatoria: el cangrejo debera ir ms o menos en lnea recta, pero debera girar un poco alrededor deesa lnea.

    Podemos conseguir esto en Greenfoot usando nmeros aleatorios. El entorno de Greenfoot tienen unmtodo que nos da un nmero aleatorio. Este mtodo, denominado getRandomNumber (obtnNme-roAleatorio), espera un parmetro que especifica el lmite del nmero. Devolver un nmero entre 0(cero) y ese lmite. Por ejemplo,

    Greenfoot.getRandomNumber(20)

    nos dar un nmero aleatorio entre 0 y 20. El lmite 20 se excluye, por lo que el nmero estaren el rango 0-19.

    La notacin usada aqu se denomina notacin punto. Cuando llamamos a mtodos que han sidodefinidos en nuestra clase o heredados, basta con escribir el nombre del mtodo y la lista de par-metros. Cuando el mtodo se ha definido en otra clase, es necesario especificar la clase u objetoque tiene el mtodo, seguido de un punto, y seguido del nombre del mtodo y la lista de parmetros.Como el mtodo getRandomNumber no es de las clases Crab ni Animal, sino que se define enuna clase denominada Greenfoot, tenemos que escribir Greenfoot. delante de la llamada almtodo.

    Supongamos que queremos programar nuestro cangrejo de forma que haya un 10 por ciento deprobabilidades de que en cada paso el cangrejo gire un poco de su curso. Podemos programar elesquema de esto con una sentencia if:

    temas: conducta aleatoria, control del teclado, sonido

    conceptos: notacin punto, nmeros aleatorios, comentarios

    CAPTULO

    3 Mejorando el cangrejoprogramacin ms sofisticada

    3.1

    Concepto:

    Cuando queremosllamar a un mtodoque no es denuestra clase niheredado,tenemos queespecificar laclase u objeto quedefine el mtodoantes del nombredel mtodo,seguido de unpunto. Esto seconoce como lanotacin punto.

    Cap.3:Maquetacin 1 1/2/11 21:55 Pgina 27

    www.detodoprogramacion.com

  • if ( algo-es-cierto){

    turn(5);}

    Ahora tenemos que encontrar una expresin en lugar de algo-es-cierto que devuelva exactamente el10 por ciento de los casos.

    Podemos hacer esto usando un nmero aleatorio (usando el mtodo Greenfoot.getRandomNumber) y un operador menor-que. El operador menor-que compara dos nmeros y devuelve true si elprimero es menor que el segundo. Menor que se escribe usando el smbolo

  • Si queremos expresar una oportunidad en porcentajes, lo ms fcil es escoger nmeros aleatorios conlmite 100. Una expresin que es cierta el 10 por ciento de las veces, por ejemplo, podra ser

    Greenfoot.getRandomNumber(100) < 10

    Como la llamada a Greenfoot.getRandomNumber(100) nos da un nuevo nmero aleatorio entre0 y 99 cada vez que lo llamamos, y como estos nmeros estn uniformemente distribuidos, sermenor que 10 en el 10 por ciento de todos los casos.

    Podemos usar esto ahora para hacer que nuestro cangrejo gire un poco en el 10 por ciento de suspasos (Cdigo 3.1).

    import greenfoot.*; // (World, Actor, GreenfootImage, y Greenfoot)/*** Esta clase define un cangrejo. Los cangrejos viven en la playa.*/

    public class Crab extends Animal{

    public void act(){

    if ( atWorldEdge() ){

    turn(17);}if ( Greenfoot.getRandomNumber(100) < 10 ){

    turn(5);}move();

    }}

    ste es un buen comienzo, pero no va bien todava. En primer lugar, si el cangrejo gira, siempre girala misma cantidad (5 grados), y, en segundo lugar, siempre gira a la derecha, nunca a la izquierda. Loque realmente nos gustara ver es que girara una cantidad pequea pero aleatoria a la izquierda o a laderecha. (Veremos esto ahora, si te sientes capaz, intenta implementar esto t primero antes de seguirleyendo.)

    3.1 Aadiendo conducta aleatoria | 29

    Nota

    Java tiene varios operadores para comparar dos valores:

    < menor que >= mayor o igual que

    > mayor que = = igual que

  • La forma ms fcil de resolver el primer problema girar siempre con la misma cantidad, en nuestrocaso, 5 grados es reemplazar el nmero 5 fijo de nuestro cdigo con uno aleatorio, como sigue:

    if ( Greenfoot.getRandomNumber(100) < 10 ){

    turn( Greenfoot.getRandomNumber(45) );}

    En este ejemplo, el cangrejo an girara en el 10 por ciento de sus pasos. Y cuando gire, girar una can-tidad aleatoria, entre 0 y 44 grados.

    El proyecto little-crab-2 (incluido en los escenarios del libro) muestra una implementacin de lo quehemos hecho hasta ahora, incluyendo los ltimos ejercicios.

    Aadiendo gusanosVamos a hacer nuestro mundo un poco ms interesante aadiendo un nuevo tipo de animal.

    A los cangrejos les gusta comer gusanos. (Bueno, esto no es cierto para todos los tipos de cangrejosdel mundo real, pero a algunos les gusta. Supongamos que nuestro cangrejo es uno de los que les gustacomer gusanos.) Por tanto, aadamos ahora una clase para los gusanos.

    Podemos aadir nuevas clases actor en un escenario Greenfoot seleccionando Nueva subclase de unade las clases actor existentes (Figure 3.1). En este caso, nuestra nueva subclase Worm (gusano) es untipo especfico de animal. Por tanto, debera ser una subclase de la clase Animal. (Recuerda, ser unasubclase es una relacin es-un: Un gusano es un animal.)

    Cuando creamos una nueva subclase, se nos pide que introduzcamos el nombre de la clase, y queseleccionemos una imagen (Figura 3.2).

    En nuestro caso, llamamos a la clase Worm. Por convencin, los nombres de la clase en Java debensiempre comenzar con una letra mayscula. El nombre debe describir qu tipo de objeto representa laclase, por tanto, el nombre Worm es el adecuado para nuestro propsito.

    A continuacin, debemos asignar una imagen a la clase. Hay algunas imgenes asociadas con el esce-nario, y una librera1 entera de imgenes genricas entre las que escoger. En este caso hemos preparadouna imagen de un gusano y est disponible en las imgenes del escenario, por lo que puede bastar conque selecciones la imagen llamada worm.png.

    30 | Captulo 3 Mejorando el cangrejo programacin ms sofisticada

    Ejercicio 3.4 Prueba el cdigo mostrado arriba. Qu observas? Gira en diferentes ngulosahora el cangrejo cuando gira?

    Ejercicio 3.5 Tenemos an el problema de que el cangrejo slo gira a la derecha. sta no esla conducta normal de un cangrejo, as que vamos a intentar arreglarlo. Modifica tu cdigo deforma que el cangrejo gire a la izquierda o a la derecha hasta 45 grados cuando gira.

    Ejercicio 3.6 Prueba a ejecutar tu escenario con muchos cangrejos en el mundo. Giran todosa la vez o de forma independiente? Por qu?

    3.2

    1 N. del T. Se traduce library por librera, y no por biblioteca que sera su traduccin correcta, dado que se hapopularizado esta traduccin en informtica y es la que proporciona la interfaz de Greenfoot.

    Cap.3:Maquetacin 1 1/2/11 21:55 Pgina 30

    www.detodoprogramacion.com

  • 3.2 Aadiendo gusanos | 31

    Figura 3.1Creando nuevas

    subclases

    Figura 3.2Creando una nueva

    clase

    Cap.3:Maquetacin 1 1/2/11 21:55 Pgina 31

    www.detodoprogramacion.com

  • Una vez hecho, podemos pinchar en Ok. La clase se ha aadido ahora a nuestro escenario, y podemoscompilarla y aadir luego gusanos a nuestro mundo.

    Ahora sabemos cmo aadir nuevas clases a nuestro escenario. La siguiente tarea consiste en conseguirque las clases interacten: cuando un cangrejo encuentra un gusano, debera comrselo.

    Comiendo gusanosQueremos ahora aadir una nueva conducta al cangrejo. Cuando el cangrejo se encuentra un gusano,se lo come. De nuevo, tenemos que comprobar primero qu mtodos hemos heredado de la clase Ani-mal. Cuando abrimos de nuevo el editor de la clase Animal, y cambiamos a la vista de documentacin,podemos ver los dos mtodos siguientes:

    boolean canSee (java.lang.Class clss)Devuelve true si podemos ver un objeto de la clase clss justo desde donde estamos. Se traducecomo puedeVer().

    void eat (java.lang.Class clss)Intenta comer un objeto de la clase clss. Se traduce como come()

    Usando estos mtodos, vamos a implementar esta conducta. El primer mtodo comprueba si el can-grejo puede comerse un gusano. (Slo puede verlo cuando est justo delante de l nuestros animalestienen un alcance de visin muy corto.) Este mtodo devuelve un booleano true o false, as quepodemos usarlo en una sentencia if.

    El segundo mtodo se come un gusano. Ambos mtodos esperan un parmetro de tipojava.lang.Class. Esto significa que esperamos que se especifique una de las clases de nuestroescenario. Aqu se muestra un ejemplo de cdigo:

    if ( canSee(Worm.class) ){

    eat(Worm.class);}

    En este caso, especificamos Worm.class como el parmetro para ambas llamadas a mtodos (elmtodo canSee y el mtodo eat). Esto declara qu tipo de objeto estamos buscando, y qu tipo deobjeto queremos comer. Nuestro mtodo act completo en este momento se muestra en el cuadro deCdigo 3.2.

    Prueba esto ahora. Coloca varios gusanos en el mundo (recuerda, puedes utilizar el atajo de pincharmientras mantienes la tecla maysculas para colocar rpidamente varios actores), coloca unos pocoscangrejos, ejecuta el escenario, y mira qu pasa.

    32 | Captulo 3 Mejorando el cangrejo programacin ms sofisticada

    Ejercicio 3.7 Aade algunos gusanos a nuestro mundo. Aade tambin algunos cangrejos.Ejecuta el escenario. Qu observas? Qu hacen los gusanos? Qu ocurre si un cangrejoencuentra un gusano?

    3.3

    Cap.3:Maquetacin 1 1/2/11 21:55 Pgina 32

    www.detodoprogramacion.com

  • public void act()

    {if ( atWorldEdge() ){

    turn(17);}if ( Greenfoot.getRandomNumber(100) < 10 ){

    turn(Greenfoot.getRandomNumber(90)-45);}move();

    if ( canSee(Worm.class) ){

    eat(Worm.class);}

    }

    Creando nuevos mtodos

    En las secciones anteriores, hemos aadido una nueva conducta al cangrejo girar en el borde delmundo, girar de forma aleatoria, y comer gusanos. Si continuamos haciendo esto como lo hemos hechohasta ahora, el mtodo act se hara cada vez ms largo y, en algn caso, difcil de entender. Podemosmejorar esto dividindolo en piezas ms pequeas.

    Podemos crear nuestros propios mtodos adicionales en la clase Crab para nuestros propios prop-sitos. Por ejemplo, en vez de escribir simplemente algn cdigo para buscar un gusano y comrnosloen el mtodo act, podemos aadir un nuevo mtodo con este fin. Para hacer esto, primero tenemosque decidir un nombre para este mtodo. Digamos que lo llamamos lookForWorm (buscaGusano).A continuacin podemos crear un nuevo mtodo aadiendo el siguiente cdigo:

    3.4 Creando nuevos mtodos | 33

    Cdigo 3.2Primera versin

    de cmo comer

    un gusano

    Nota avanzada Paquetes (Packages)

    (Las notas etiquetadas como avanzadas se insertan para proporcionar informacin ms detalladaa los lectores realmente interesados en los detalles. No son cruciales para entender el resto del texto,y pueden ser saltadas sin problemas.)

    En la definicin de los mtodos canSee y eat hemos visto un tipo de parmetro con el nombrejava.lang.Class. Qu es esto?

    Muchos tipos se definen con clases. Muchas de estas clases estn en la librera estndar de clasesJava. Puedes ver la documentacin de la librera de clases Java seleccionando Documentacin deLibreras Java en el men Ayuda de Greenfoot.

    La librera de clases Java contiene miles de clases. Para que sea un poco ms fcil trabajar con ellas,han sido agrupadas en paquetes (grupos de clases relacionadas lgicamente). Cuando el nombrede una clase incluye puntos, tal como en java.lang.Class, el nombre de la clase es slo la ltimaparte, y las partes anteriores son el nombre del paquete. Por tanto, estamos mirando en la clase lla-mada Class del paquete java.lang.

    Intenta encontrar la documentacin de esta clase en la documentacin de la librera de Java.

    3.4

    Cap.3:Maquetacin 1 1/2/11 21:55 Pgina 33

    www.detodoprogramacion.com

  • /*** Comprueba si descubrimos un gusano.* Si lo vemos, nos lo comemos. Si no, no hacemos nada.*/

    public void lookForWorm(){

    if ( canSee(Worm.class) ){

    eat(Worm.class);}

    }

    Las primeras cuatro lneas son un comentario. Un comentario es ignorado por el ordenador estescrito para los lectores humanos. Usamos comentarios para explicar a los lectores humanos el pro-psito de este mtodo.

    Cuando definimos este mtodo, el cdigo no se ejecuta de forma inmediata. De hecho, slo con defi-nirlo no se ejecuta en absoluto. Slo hemos definido una nueva accin posible (buscar un gusano)que puede ser ejecutada ms tarde. Slo ser ejecutada cuando este mtodo sea llamado. Podemosaadir una llamada a este mtodo dentro del mtodo act:

    lookForWorm();

    Observa que la llamada tiene los parntesis para la lista (vaca) de parmetros. El cdigo fuente com-pleto tras esta reestructuracin se muestra en el Cdigo 3.3.

    public void act(){

    if ( atWorldEdge() ){

    turn(17);}if ( Greenfoot.getRandomNumber(100) < 10 ){

    turn(5);}move();lookForWorm();

    }

    /**

    * Comprueba si hemos encontrado un gusano.

    * Si lo hemos visto, nos lo comemos. Si no, no hacemos nada.

    */

    public void lookForWorm()

    {if ( canSee(Worm.class) ){

    34 | Captulo 3 Mejorando el cangrejo programacin ms sofisticada

    Concepto:

    Una definicin deun mtodo defineuna nueva accinpara los objetos de esta clase. La accin no seejecuta de formainmediata, sinoque el mtodopuede ser llamadomediante unallamada a estemtodo ms tardepara ejecutarlo.

    Concepto:

    Los comentariosse escriben en el cdigo fuentecomo explicacinpara los lectoreshumanos. Sonignorados por el ordenador.

    Cdigo 3.3Dividiendo el cdigo

    en varios mtodos

    Cap.3:Maquetacin 1 1/2/11 21:55 Pgina 34

    www.detodoprogramacion.com

  • eat(Worm.class);}

    }

    Observa que cambiando as el cdigo no hemos cambiado en absoluto la conducta del cangrejo. Sim-plemente hemos hecho que el cdigo sea ms fcil de leer. Cuando aadimos ms cdigo a una clase,los mtodos tienden a ser cada vez ms largos. Cuanto ms largos son los mtodos, ms difciles sonde entender. Al separar nuestro cdigo en mtodos ms cortos, conseguimos que el cdigo sea ms fcilde entender.

    public void act(){

    turnAtEdge();randomTurn();move();lookForWorm();

    }

    Por convencin, los nombres de los mtodos en Java siempre comienzan con una letra minscula. Losnombres de los mtodos no pueden tener espacios (ni muchos otros caracteres de puntuacin). Si elnombre de un mtodo est formado por varias palabras, usa maysculas en medio del nombre delmtodo para indicar el comienzo de cada palabra.

    Aadiendo una langostaEstamos ahora en un punto en que tenemos un cangrejo que anda ms o menos de forma aleatoria ennuestro mundo, y come gusanos si los encuentra.

    Para hacerlo un poco ms interesante, vamos a aadir una nueva criatura: una langosta (lobster). A laslangostas les gusta perseguir a los cangrejos.

    3.5 Aadiendo una langosta | 35

    Ejercicio 3.8 Crea otro mtodo nuevo llamado randomTurn (giraAletoriamente(), este mtodono tiene parmetros y no devuelve nada). Selecciona el cdigo que realiza el giro aleatorio, ymuvelo del mtodo act al mtodo randomTurn. A continuacin, llama a este nuevo mtodorandomTurn desde tu mtodo act. No olvides escribir un comentario para este mtodo.

    Ejercicio 3.9 Crea otro mtodo llamado turnAtEdge (giraEnElBorde(), tampoco tiene par-metros ni devuelve nada). Mueve el cdigo que comprueba si estamos al final del mundo (y querealiza el giro si estamos) al mtodo turnAtEdge. Llama al mtodo turnAtEdge desde tumtodo act. Tu mtodo act debera ser como la versin mostrada en el Cdigo 3.4.

    Cdigo 3.4El nuevo mtodo act

    despus d