miércoles, 5 de enero de 2011

Deitel_C++_4.23(Graficos de Tortuga, Lenguaje Logo)

Este es un problema bastante mas dificil de lo que parece a primera vista. Hay varios detalles que se tiene que tener en cuenta. Hay que evitar que la tortuga pueda "salir" del tablero, tambien es necesario que, si bien no avance cuando haya llegado al limite, si pueda girar y cambiar la orientación en que se encuentra. Decidí incluir más comandos que los que menciona Deitel para hacer el programa más agradable al usuario. Cada que la tortuga avanza se presenta en pantalla las coordenadas del cuadro en el que se encuentra, esto es un remanente de las muchas cosas que hice para resolver los problemas que surgieron; esas coordenadas se pueden quitar facilmente, puesto que solo sirvieron de andamios para construir.
Una versión más fácil de entender aparece en este mismo blog en el  lenguaje Java. Lenguaje Logo en Java 



#include <iostream>
 using namespace::std;


 const int Tamano_Alto = 20; //TAMANO PISO
 const int Tamano_Ancho = 60;
 int x = 1; //SE INICIA CON LA TORTUGA UBICADA EN (0,0)
 int y = 1;
 void Imprime_Comandos();
 void Avanza( int[][Tamano_Alto + 1], int, int, int, char, char);
 void Imprime( int[][Tamano_Alto +1], int, int);



////////////////////////////////////////////////////////////////////
// MAIN
///////////////////////////////////////////////////////////////////

 int main()

 {
 cout <<"\nEste programa emula el lenguaje logo."<<endl;

 Imprime_Comandos();

 int Piso[Tamano_Ancho + 1][Tamano_Alto + 1] = {{0}, {0,0}};
 int comando = 1; //SE RECIBEN LOS COMANDOS.
 int pluma1 = -1; //LA PLUMA SE INICIA HACIA ABAJO.
 char direccion = 'h'; //LA DIRECCION HACIA LA QUE VE LA TORTUGA ES HORIZONTAL
 char avanza_o_retrocede = 'a';

 while ( 0 != comando )

 { // ABRE WHILE
 cout <<"\nIntroduzca comando (0 para terminar, 7 para imprimir los comandos): " <<endl;
 cin >> comando;

 switch (comando)

 { //ABRE SWITCH

 case 1:
 pluma1 = 1;
 cout <<"\nLa pluma esta hacia arriba. " <<endl;
 break;

 case 2:
 pluma1 = -1;
 cout << "\nLa pluma esta hacia abajo. " << endl;
 break;

 case 3:

 if( 'v' == direccion )

 {

 if ( 'a' == avanza_o_retrocede )

 {

 direccion = 'h';
 avanza_o_retrocede = 'r';

 }

 else

 {

 direccion = 'h';
 avanza_o_retrocede = 'a';

 }

 }

 else

 {
 if('a' == avanza_o_retrocede)

 {

 direccion = 'v';
 avanza_o_retrocede = 'a';

 }

 else

 {
 direccion = 'v';
 avanza_o_retrocede = 'r';

 }

 }

 cout <<"\nSe gira a la derecha." <<endl;

 break;
 cout << "\nSe gira hacia la derecha. " <<endl;
 break;

 case 4:

 direccion == 'v'?

 ( avanza_o_retrocede == 'a'?
 ({ direccion = 'h'; avanza_o_retrocede = 'a';}):
 ({direccion = 'h'; avanza_o_retrocede = 'r';})):

 (avanza_o_retrocede == 'a'?
 ({ direccion = 'v'; avanza_o_retrocede = 'r';}):
 ( { direccion = 'v'; avanza_o_retrocede = 'a';}));


 cout <<"\nSe gira hacia la izquierda. " <<endl;
 break;

 case 5:
 cout <<"\nAvanza hacia adelante. " <<endl;
 Avanza(Piso, Tamano_Ancho, Tamano_Alto, pluma1, direccion, avanza_o_retrocede);
 break;

 case 6:
 cout <<"\nEste es el recorrido de la tortuga: " << endl;
 Imprime( Piso, Tamano_Ancho, Tamano_Alto);
 break;

 case 7:
 Imprime_Comandos();
 break;

 case 8:
 cout <<"\nLa tortuga esta en la posicion (" << x << "," << y << ") y";
 cout << ( 'a' == avanza_o_retrocede ? " avanza ": "retrocede");
 cout <<" en la direccion ";
 cout << ( 'h' == direccion ? "x": "y" ) <<endl;

 default:
 break;

 } //CIERRA SWITCH

 } //CIERRA WHILE

 return 0;

 } //CIERRA MAIN


 //************************************************************************
 // SE DEFINE LA FUNCION IMPRIME COMANDOS
 //************************************************************************

void Imprime_Comandos()

 { // ABRE IMPRIME PARAMETROS

 cout <<"\nLos comandos para mover a la tortuga son: " <<endl;
 cout <<"1 La pluma esta hacia arriba. " <<endl;
 cout <<"2 pluma hacia abajo" << endl;
 cout <<"3 vuelta a la derecha" << endl;
 cout <<"4 vuelta a la izquierda" <<endl;
 cout <<"5 avanza hacia adelante" << endl;
 cout <<"6 despliega el piso de " << Tamano_Ancho <<" por " <<Tamano_Alto <<endl;
 cout <<"7 imprime los comandos" << endl;
 cout <<"8 imprime la posicion y direccion actual de la tortuga " <<endl;

 } // CIERRA IMPRIME PARAMETROS


 //************************************************************************
 // DEFINICION DE LA FUNCION AVANZA
 //************************************************************************


 void Avanza( int A[][Tamano_Alto + 1], int Ancho, int Alto, int pluma, char horizontal_o_vertical, char al_frente_o_atras)


 { //ABRE AVANZA

 int cuadros_avanza;
 char variable_a_mover;
 int i;
 int temporal;

 cout <<endl<<"Cuantos cuadros avanzara la tortuga? " << endl;
 cin >> cuadros_avanza;


 ('h' == horizontal_o_vertical) ?
 ({ variable_a_mover = 'x'; temporal = x;}):
 ({ variable_a_mover = 'y'; temporal = y;});


 for ( i = variable_a_mover == 'x'? x : y;
 (al_frente_o_atras == 'a') ?
 i <= (temporal + cuadros_avanza - 1):
 i >= (temporal - cuadros_avanza + 1);
 (al_frente_o_atras == 'a') ? i++ : i--)



 { //ABRE FOR

 if ( variable_a_mover == 'x' )

 { //ABRE IF variable_a_mover

 if (i <= Ancho && i > 0 )

 { //ABRE EL IF DE FOR

 A[i][y] = pluma == -1? 1: 0;
 cout << "(" << i <<"," << y<< ")" << endl;
 x = al_frente_o_atras == 'a'? (x + 1): (x - 1);

 } //CIERRA EL IF DE FOR


 else

 {

 if ( i > Ancho )

 { // ABRE IF

 A[Ancho][y] = pluma == -1? 1: 0;
 x = Ancho;

 } //CIERRA IF

 else

 { // ABRE ELSE DE IF

 A[1][y] = pluma == -1? 1: 0;
 x = 1;

 } // CIERRA ELSE DE IF
 } // CIERRA IF
 } //CIERRA IF variable_a_mover

 else

 { //ABRE ELSE variable_a_mover

 if (i <= Alto && i > 0) //ABRE IF

 {
 A[x ][i] = pluma == -1? 1: 0;
 cout << "(" << x << "," << i << ")" <<endl;
 y = al_frente_o_atras == 'a'? ( y + 1): (y -1);
 } //CIERRA IF

 else

 { //ABRE ELSE

 if ( Alto < i )
 {

 A[x ][Alto] = pluma == -1? 1: 0;

 y = Alto;

 }



 else

 { //ABRE ELSE INTERNO
 A[x ][1] = pluma == -1? 1: 0;
 y = 1;
 } //CIERRA ELSE INTERNO

 } //CIERRA ELSE

 } //CIERRA ELSE variable_a_mover

 } //CIERRA FOR


 return;

 } //CIERRA AVANZA


 //************************************************************************
 //FUNCION IMPRIME
 //************************************************************************

 void Imprime (int tablero[][Tamano_Alto + 1], int ancho, int alto)

 {

 int n, m;

 for ( n = 1; n <= alto; n++)

 { // ABRE FOR

 for ( m = 1; m <= ancho; m++)

 { //ABRE FOR ANIDADO

 if ( 1 == tablero[m][n])
 cout << "*";

 else
 cout << " ";

 } //CIERRA FOR ANIDADO

 cout << endl;

 } //CIERRA FOR

 return;

 }

 

No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...