Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - julianbesso1

#1
Tu sugerencia me ayudó a resolver el problema. Gracias!!!
#2
Volviendo al tema del post anterior, estoy a punto de terminar el ejercicio planteado (Insaniquarium).

El único problema es el siguiente:

Hay un método llamado Sentido_Pescado que es el que determina el rebote con los bordes y la conformación del cuerpo de los pescados para su posterior dibujo en pantalla. El método recibe un int como parametro que es la orientación (1=mira hacia la izq/2=mira hacia la derecha)

Lo correcto sería tener un método escrito de esta manera:


Código (cpp) [Seleccionar]
void Pescado::Sentido_Pescado(){

if(sentido==1) sentido=2;
if(sentido==2) sentido=1;

}


Pero al implementarlo, no lleva a cabo el cambio de sentido. Desconozco el motivo.

Este es el código completo:


Código (cpp) [Seleccionar]
#include <iostream>
#include <cstdlib>
#include <conio2.h>
#include <ctime>

using namespace std;

const int bizq=6;
const int bder=75;
const int bsup=6;
const int binf=19;

class Pescado{

protected:
int velocidad;
int color;
int sentido;

int pos_x;
int pos_y;

int prev_x;
int prev_y;

int dir_x;
int dir_y;

int mov_vertical;

clock_t t_inicial;              
clock_t t_final;

char array_b[6][12];
char array_s[10][4];

public:

void Mover_Pescado();
void Sentido_Pescado(int x);

};
class Pescado1 : public Pescado{

public:

Pescado1(int x, int y);
void Borrar_Pescado1();
void Cuerpo_Pescado1();
void Dibujar_Pescado1();

};

class Pescado2 : public Pescado{

public:

Pescado2(int x, int y);
void Borrar_Pescado2();
void Cuerpo_Pescado2();
void Dibujar_Pescado2();
void Color_Pescado2();

};

void Pescado::Mover_Pescado(){

prev_x = pos_x;
prev_y = pos_y;

t_final = clock();

if((velocidad + t_inicial) < t_final){

int mov_vertical = rand()%2+1;  // 1-arriba 2-abajo

if(sentido==1) pos_x-=dir_x;
if(sentido==2) pos_x+=dir_x;
if(mov_vertical==1) pos_y-=dir_y;
if(mov_vertical==2) pos_y+=dir_y;

if(pos_x < bizq){
Pescado::Sentido_Pescado(2);
dir_x = -dir_x;
pos_x = bizq;

}
if(pos_x > bder-12){
Pescado::Sentido_Pescado(1);
dir_x = -dir_x;
pos_x = bder-12;
}
if(pos_y < bsup){
dir_y = -dir_y;
pos_y = bsup;
}
if(pos_y > binf){
dir_y = -dir_y;
pos_y = binf;
}

t_inicial = t_final;

}
}

void Pescado::Sentido_Pescado(int x){

if(x==1) sentido=1;
if(x==2) sentido=2;

}

Pescado1::Pescado1(int x, int y){

velocidad=x;
color=y;

dir_x=1;
dir_y=1;

pos_x = rand()%61+10;
pos_y = rand()%6+10;

sentido = rand() % 2+1;  //  mira izq/ mira der   

t_inicial = clock();

}

void Pescado1::Borrar_Pescado1(){

for(int k=0;k<6;k++){
for(int p=0;p<12;p++){
putchxy(prev_x+p,prev_y+k,' ');
}
}

}

void Pescado1::Cuerpo_Pescado1(){

if(sentido==1){  //pescado mirando izquierda

array_b[0][0]=32;array_b[0][1]=32;array_b[0][2]=32;array_b[0][3]=32;array_b[0][4]=32;array_b[0][5]=32;array_b[0][6]=95;array_b[0][7]=44;array_b[0][8]=32;array_b[0][9]=32;array_b[0][10]=32;array_b[0][11]=32;
array_b[1][0]=32;array_b[1][1]=32;array_b[1][2]=32;array_b[1][3]=32;array_b[1][4]=95;array_b[1][5]=47;array_b[1][6]=123;array_b[1][7]=95;array_b[1][8]=32;array_b[1][9]=32;array_b[1][10]=32;array_b[1][11]=32;
array_b[2][0]=32;array_b[2][1]=46;array_b[2][2]=39;array_b[2][3]=32;array_b[2][4]=32;array_b[2][5]=32;array_b[2][6]=32;array_b[2][7]=39;array_b[2][8]=46;array_b[2][9]=47;array_b[2][10]=180;array_b[2][11]=62;
array_b[3][0]=47;array_b[3][1]=32;array_b[3][2]=101;array_b[3][3]=32;array_b[3][4]=40;array_b[3][5]=40;array_b[3][6]=32;array_b[3][7]=32;array_b[3][8]=32;array_b[3][9]=61;array_b[3][10]=60;array_b[3][11]=32;
array_b[4][0]=32;array_b[4][1]=39;array_b[4][2]=46;array_b[4][3]=44;array_b[4][4]=95;array_b[4][5]=95;array_b[4][6]=44;array_b[4][7]=46;array_b[4][8]=39;array_b[4][9]=92;array_b[4][10]=95;array_b[4][11]=62;
array_b[5][0]=32;array_b[5][1]=32;array_b[5][2]=32;array_b[5][3]=32;array_b[5][4]=32;array_b[5][5]=32;array_b[5][6]=92;array_b[5][7]=41;array_b[5][8]=32;array_b[5][9]=32;array_b[5][10]=32;array_b[5][11]=32;

}
if(sentido==2){  //pescado mirando derecha

array_b[0][0]=32;array_b[0][1]=32;array_b[0][2]=32;array_b[0][3]=32;array_b[0][4]=44;array_b[0][5]=95;array_b[0][6]=32;array_b[0][7]=32;array_b[0][8]=32;array_b[0][9]=32;array_b[0][10]=32;array_b[0][11]=32;
array_b[1][0]=32;array_b[1][1]=32;array_b[1][2]=32;array_b[1][3]=32;array_b[1][4]=95;array_b[1][5]=125;array_b[1][6]=92;array_b[1][7]=95;array_b[1][8]=32;array_b[1][9]=32;array_b[1][10]=32;array_b[1][11]=32;
array_b[2][0]=60;array_b[2][1]=96;array_b[2][2]=92;array_b[2][3]=46;array_b[2][4]=39;array_b[2][5]=32;array_b[2][6]=32;array_b[2][7]=32;array_b[2][8]=32;array_b[2][9]=39;array_b[2][10]=46;array_b[2][11]=32;
array_b[3][0]=32;array_b[3][1]=62;array_b[3][2]=61;array_b[3][3]=32;array_b[3][4]=32;array_b[3][5]=32;array_b[3][6]=41;array_b[3][7]=41;array_b[3][8]=32;array_b[3][9]=101;array_b[3][10]=32;array_b[3][11]=92;
array_b[4][0]=60;array_b[4][1]=95;array_b[4][2]=47;array_b[4][3]=39;array_b[4][4]=46;array_b[4][5]=44;array_b[4][6]=95;array_b[4][7]=95;array_b[4][8]=44;array_b[4][9]=46;array_b[4][10]=39;array_b[4][11]=32;
array_b[5][0]=32;array_b[5][1]=32;array_b[5][2]=32;array_b[5][3]=32;array_b[5][4]=40;array_b[5][5]=47;array_b[5][6]=32;array_b[5][7]=32;array_b[5][8]=32;array_b[5][9]=32;array_b[5][10]=32;array_b[5][11]=32;

}

}

void Pescado1::Dibujar_Pescado1(){

Pescado1::Borrar_Pescado1();
Pescado1::Cuerpo_Pescado1();

for(int i=0; i<6; i++){
for(int j=0; j<12; j++){
textcolor(color);
putchxy(pos_x+j,pos_y+i,array_b[i][j]);
}
}

}

Pescado2::Pescado2(int x, int y){

velocidad=x;
color=y;

dir_x=1;
dir_y=1;

pos_x = rand()%61+10;
pos_y = rand()%6+10;

sentido = rand() % 2+1;  //  mira izq/ mira der   

t_inicial = clock();

}

void Pescado2::Borrar_Pescado2(){

for(int k=0;k<10;k++){
for(int p=0;p<4;p++){
putchxy(prev_x+k,prev_y+p,' ');
}
}

}

void Pescado2::Cuerpo_Pescado2(){

if(sentido==1){  //pescado mirando izquierda

array_s[0][0]=0;array_s[0][1]=0;array_s[0][2]=47;array_s[0][3]=39;
array_s[1][0]=0;array_s[1][1]=46;array_s[1][2]=111;array_s[1][3]=45;
array_s[2][0]=0;array_s[2][1]=45;array_s[2][2]=0;array_s[2][3]=45;
array_s[3][0]=47;array_s[3][1]=0;array_s[3][2]=41;array_s[3][3]=39;
array_s[4][0]=124;array_s[4][1]=0;array_s[4][2]=41;array_s[4][3]=39;
array_s[5][0]=0;array_s[5][1]=45;array_s[5][2]=0;array_s[5][3]=39;
array_s[6][0]=0;array_s[6][1]=46;array_s[6][2]=0;array_s[6][3]=39;
array_s[7][0]=0;array_s[7][1]=0;array_s[7][2]=92;array_s[7][3]=39;
array_s[8][0]=0;array_s[8][1]=0;array_s[8][2]=47;array_s[8][3]=92;
array_s[9][0]=0;array_s[9][1]=0;array_s[9][2]=40;array_s[9][3]=40;

}
if(sentido==2){  //pescado mirando derecha

array_s[0][0]=0;array_s[0][1]=0;array_s[0][2]=41;array_s[0][3]=41;
array_s[1][0]=0;array_s[1][1]=0;array_s[1][2]=92;array_s[1][3]=47;
array_s[2][0]=0;array_s[2][1]=0;array_s[2][2]=47;array_s[2][3]=39;
array_s[3][0]=0;array_s[3][1]=46;array_s[3][2]=0;array_s[3][3]=39;
array_s[4][0]=0;array_s[4][1]=45;array_s[4][2]=0;array_s[4][3]=39;
array_s[5][0]=124;array_s[5][1]=0;array_s[5][2]=40;array_s[5][3]=39;
array_s[6][0]=92;array_s[6][1]=0;array_s[6][2]=40;array_s[6][3]=39;
array_s[7][0]=0;array_s[7][1]=45;array_s[7][2]=0;array_s[7][3]=45;
array_s[8][0]=0;array_s[8][1]=46;array_s[8][2]=111;array_s[8][3]=45;
array_s[9][0]=0;array_s[9][1]=0;array_s[9][2]=92;array_s[9][3]=39;

}



}

void Pescado2::Dibujar_Pescado2(){

Pescado2::Borrar_Pescado2();
Pescado2::Cuerpo_Pescado2();

for(int i=0; i<10; i++){
for(int j=0; j<4; j++){
textcolor(color);
putchxy(pos_x+i,pos_y+j,array_s[i][j]);
}
}


}

void Pescado2::Color_Pescado2(){

if(color==15) color=1;
else color+=1;

}

int main(int argc, char *argv[]){

_setcursortype(_NOCURSOR);

srand(time(NULL));

Pescado1 Rojo(50,12);
Pescado1 Verde(80,10);

Pescado2 Amarillo(60,14);
Pescado2 Cyan(125,11);

while(true){

if(kbhit()) {
int tecla=getch();
switch(tecla)
{

case 49:
Rojo.Sentido_Pescado(1);
Verde.Sentido_Pescado(1);
break;
case 50:
Rojo.Sentido_Pescado(2);
Verde.Sentido_Pescado(2);
break;
case 51:
Amarillo.Color_Pescado2();
Cyan.Color_Pescado2();
break;


}
}

Rojo.Mover_Pescado();
Rojo.Dibujar_Pescado1();
Verde.Mover_Pescado();
Verde.Dibujar_Pescado1();
Amarillo.Mover_Pescado();
Amarillo.Dibujar_Pescado2();
Cyan.Mover_Pescado();
Cyan.Dibujar_Pescado2();

}

return 0;

}


Son mis primeras clases acerca de Clases, Herencia y otros, así que tendré en cuenta cualquier tipo de sugerencias. Gracias!
#3
Programación C/C++ / Re: Dibujar con putchxy
24 Agosto 2014, 01:57 AM
Muchas gracias por tu respuesta. Decidí representarlo de esa manera porque es lo que estamos utilizando en las primeras clases de un curso que estoy haciendo acerca de videojuegos. Es muy básico.

La idea es que resulte algo como esto:


     
             _,
   _/{_  
        .'    './´>  
       / e ((   =<
        '.,__,.'\_>  
             \)  



No creo que esté mal la matriz, porque probé lo mismo con cout y sale perfecto.
Respecto a los elementos '10' los reemplazé por '32' pero ocurre lo mismo. Es raro..
Estoy utilizando windows por si sirve de algo.

Gracias de nuevo!!!





Ya lo solucioné. Tenías toda la razón acerca de los saltos de línea. Pasa que para obtener los equivalentes en ASCII, pasé el dibujo completo a un conversor online. Seguramente me devolvió algunos valores que no correspondían (como los saltos), pero que cout interpretaba.

Gracias por la buena predisposición! Saludos
#4
Programación C/C++ / Dibujar con putchxy
23 Agosto 2014, 23:26 PM
Hola gente. Vengo con 2 dudas que surgieron en un ejercicio.
Tenía que hacer algo parecido al insaniquarium (solo las animaciones de los pescaditos)

Ya tengo el código correspondiente al movimiento, pero a la hora de mostrarlo en pantalla, obtengo un resultado extraño.

Este es el cuerpo del pescado mirando hacia la izquierda: (por mostar un caso)


Código (cpp) [Seleccionar]

array_b[0][0]=32;array_b[0][1]=32;array_b[0][2]=32;array_b[0][3]=32;array_b[0][4]=32;array_b[0][5]=32;array_b[0][6]=95;array_b[0][7]=44;array_b[0][8]=13;array_b[0][9]=10;array_b[0][10]=32;array_b[0][11]=32;
array_b[1][0]=32;array_b[1][1]=32;array_b[1][2]=95;array_b[1][3]=47;array_b[1][4]=123;array_b[1][5]=95;array_b[1][6]=32;array_b[1][7]=32;array_b[1][8]=13;array_b[1][9]=10;array_b[1][10]=32;array_b[1][11]=46;
array_b[2][0]=96;array_b[2][1]=32;array_b[2][2]=32;array_b[2][3]=32;array_b[2][4]=32;array_b[2][5]=96;array_b[2][6]=46;array_b[2][7]=47;array_b[2][8]=39;array_b[2][9]=62;array_b[2][10]=32;array_b[2][11]=32;
array_b[3][0]=32;array_b[3][1]=13;array_b[3][2]=10;array_b[3][3]=47;array_b[3][4]=32;array_b[3][5]=101;array_b[3][6]=32;array_b[3][7]=40;array_b[3][8]=40;array_b[3][9]=32;array_b[3][10]=32;array_b[3][11]=32;
array_b[4][0]=61;array_b[4][1]=60;array_b[4][2]=32;array_b[4][3]=13;array_b[4][4]=10;array_b[4][5]=32;array_b[4][6]=96;array_b[4][7]=46;array_b[4][8]=44;array_b[4][9]=95;array_b[4][10]=95;array_b[4][11]=44;
array_b[5][0]=46;array_b[5][1]=39;array_b[5][2]=92;array_b[5][3]=95;array_b[5][4]=62;array_b[5][5]=32;array_b[5][6]=32;array_b[5][7]=13;array_b[5][8]=10;array_b[5][9]=32;array_b[5][10]=32;array_b[5][11]=32;
array_b[6][0]=32;array_b[6][1]=32;array_b[6][2]=32;array_b[6][3]=92;array_b[6][4]=41;array_b[6][5]=32;array_b[6][6]=32;array_b[6][7]=32;array_b[6][8]=32;array_b[6][9]=32;array_b[6][10]=32;array_b[6][11]=32;
array_b[7][0]=32;array_b[7][1]=32;array_b[7][2]=32;array_b[7][3]=32;array_b[7][4]=32;array_b[7][5]=32;array_b[7][6]=32;array_b[7][7]=32;array_b[7][8]=32;array_b[7][9]=32;array_b[7][10]=32;array_b[7][11]=32;


Y lo dibujo de esta manera:

Código (cpp) [Seleccionar]
void Pescado1::Dibujar_Pescado1(){

Pescado1::Borrar_Pescado1();
Pescado1::Cuerpo_Pescado1();

for(int i=0; i<8; i++){
for(int j=0; j<12; j++){
putchxy(pos_x+j,pos_y+i,array_b[i][j]);
}
}

}


Creo que el código está bien, pero el pescado sale desfigurado. Pareciera como que se corren algunos elementos o no se imprime la cantidad correcta de espacios.

La otra pregunta que tenía era si existía alguna manera de evitar tanto parpadeo al borrar y dibujar el pescado en la nueva posición.

Este es el método que utilizo para borrar:

Código (cpp) [Seleccionar]
void Pescado1::Borrar_Pescado1(){

for(int k=0;k<8;k++){
for(int p=0;p<12;p++){
putchxy(prev_x+p,prev_y+k,' ');
}
}

}


Se agradece de antemano. Saludos!
#5
Todavía estoy con problemas. Eferion, respecto a tus respuestas:

1)
Código (cpp) [Seleccionar]
arch.read(sopa, sizeof(sopa));
2)
Código (cpp) [Seleccionar]
arch.read(sopa, 20*20*sizeof(char));

Ambas devuelven el mismo error:

no matching function for call to 'std::basic_fstream<char>::read(char[20][20], unsigned int)'

Intenté agregar (char *) de modo que quede de la siguiente manera:

Código (cpp) [Seleccionar]
arch.read((char *)sopa, sizeof(sopa));
Código (cpp) [Seleccionar]
arch.read((char *)sopa, 20*20*sizeof(char));

Lo cual "funciona", pero cuando quiero acceder al binario, me imprime en pantalla caracteres extraños...

Voy a seguir probando. Gracias!








Lo conseguí agregando la bandera ios::in y ios::out respectivamente. No sabía que eran cruciales para que pudiera escribirse o leerse un archivo.

Quedó de la siguiente manera:

Código (cpp) [Seleccionar]
arch.open("sopa saved.dat", ios::binary | ios::out);

arch.write((char *)sopa, 20*20*sizeof(char));

arch.write((char *)found, 5*4*sizeof(int));

arch.write((char *)lista, 5*21*sizeof(char));

arch.write((char *)palabras_found,sizeof(int));

arch.close();


El guardado sale perfecto, pero cuando ejecuto la opción de guardar dentro del programa este se detiene y me tira el cuadro de diálogo "sopa.exe ha dejado de funcionar" y tengo que cerrar...

Alguna solución para eso? Ya casi estoy :)

Gracias!!!

#6
Hola a todos. Nuevamente con un problema. Me pidieron que realice una sopa de letras que brinde la posibilidad de guardar la partida para retomar en otro momento. Es aquí donde fallo. No estoy muy seguro del código correspondiente a write y read (líneas 203 y 251 respectivamente)

Código (cpp) [Seleccionar]
#include <iostream>
#include <fstream>
#include <string.h>
#include <stdio.h>
#include <conio2.h>
#include <ctime>
#include <stdlib.h>
#include <windows.h>
#include <ctype.h>

using namespace std;

void imprimir_sopa(char x[20][20]);
void imprimir_indices();
void imprimir_encontradas(int x[5][4], char y[5][21]);
void marcar_palabra(int x[5][4], char y[5][21]);
void victoria(char w[20][20], int x[5][4], char y[5][21]);

int main(int argc, char *argv[]) {
   
   int cont=0;   
   char c;
   
   int lista_found=0;
   char lista[5][21];
   bool s;
   
   char sopa[20][20];  //declaración e inicialización los elementos de la sopa con '?'
   
   int sopa_found=0, posx, posy, dir1, registro[5][3];  //contador de palabras encontradas, posiciones X e Y de las iniciales, dir1=hor/ver/diag, 
   bool t;                                      //registro de TODAS las palabras de la lista
   
   char alphabet[27]={"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
   
   int found[5][4];  //declaración e inicialización del registro de las palabras que son encontradas (posx, posy, dir1, strlen)
   
   int d, dir2, palabras_found=0;
   int posx2, posy2;
   
   char g;   
   
   while(g!='3'){
     
      textcolor(LIGHTRED);
      cout<<"BIENVENIDO A LA SOPA DE LETRAS"<<endl<<endl;
      textcolor(WHITE);
      cout<<"Elija una opci\242n"<<endl<<endl;
      cout<<"1) Partida nueva"<<endl;
      cout<<"2) Continuar con la \243ltima partida guardada"<<endl;
      cout<<"3) Salir"<<endl<<endl;
     
      g=getch();
     
      if(g=='1'){         
         
         ifstream entrada("listado de palabras.txt", ios::in);
         
         while (entrada.good()){  //leer cantidad de veces que aparece '\n' en el txt     
            c = entrada.get();
            if (c=='\n')cont++;
         }     
         entrada.close(); //si se accede manualmente al archivo .txt se debe ingresar la última palabra de la lista acompañado de \n.
         //caso contrario el código detectará una palabra de menos
         char** q=new char*[cont];
         
         for(int f=0; f<cont; f++){
            q[f]=new char[21];     
         }
         
         entrada.open("listado de palabras.txt", ios::in);
         
         for(int g=0; g<cont; g++){
            entrada.getline(q[g], 20);
            strupr(q[g]);
         }
         
         entrada.close();         
         
         srand(time(NULL));
         
         while(lista_found<5){  //asignación de las palabras aleatorias (5)
            s=true;
            int a=rand()%cont;
            for(int j=0; j<5; j++){
               if(strcmp(q[a],lista[j])==0){
                  s=false;
                  break;
               }
            }     
            if(s==true){
               strcpy(lista[lista_found],q[a]);
               lista_found++;
            }
            Sleep(1000);
         }
         
         for(int r=0; r<cont; r++){
            delete[] q[r];   
         }
         
         delete[] q;         
         
         for(int k=0; k<20; k++){
            for(int l=0; l<20; l++){
               sopa[k][l]='?';
            }   
         }         
         
         while(sopa_found<5){  //inserción de palabras
           
            posx=rand()%20;
            posy=rand()%20;
            dir1=rand()%3+1;
           
            if(dir1==1){  //horizontal
               if(posy+strlen(lista[sopa_found])<=20){
                  t=true;
                  for(int m=posy; m<posy+strlen(lista[sopa_found]); m++){
                     if(sopa[posx][m]!='?'){
                        t=false;
                        break;
                     }               
                  }
                  if(t==true){
                     registro[sopa_found][0]=posy+1;
                     registro[sopa_found][1]=posx+1;
                     registro[sopa_found][2]=dir1;
                     for(int n=0; n<strlen(lista[sopa_found]); n++){
                        sopa[posx][posy]=lista[sopa_found][n];
                        posy++;
                     }           
                     sopa_found++;
                  }
               }
            }
            if(dir1==2){  //vertical
               if(posx+strlen(lista[sopa_found])<=20){
                  t=true;
                  for(int o=posx; o<posx+strlen(lista[sopa_found]); o++){
                     if(sopa

    [posy]!='?'){

                        t=false;
                        break;
                     }               
                  }
                  if(t==true){
                     registro[sopa_found][0]=posy+1;
                     registro[sopa_found][1]=posx+1;
                     registro[sopa_found][2]=dir1;
                     for(int p=0; p<strlen(lista[sopa_found]); p++){
                        sopa[posx][posy]=lista[sopa_found][p];
                        posx++;
                     }
                     sopa_found++;
                  }
               }         
            }
            if(dir1==3){  //diagonal
               if(posx+strlen(lista[sopa_found])<=20&&posy+strlen(lista[sopa_found])<=20){
                  t=true;
                  for(int q=posx, r=posy; q<posx+strlen(lista[sopa_found]); q++, r++){
                     if(sopa[q][r]!='?'){
                        t=false;
                        break;
                     }               
                  }
                  if(t==true){
                     registro[sopa_found][0]=posy+1;
                     registro[sopa_found][1]=posx+1;
                     registro[sopa_found][2]=dir1;
                     for(int s=posx, t=posy, u=0; s<posx+strlen(lista[sopa_found]); s++, t++, u++){
                        sopa[t]=lista[sopa_found];
                     }
                     sopa_found++;
                  }
               }
            }
         }         
         
         for(int v=0; v<20; v++){  //relleno de los elementos restantes
            for(int w=0; w<20; w++){
               if(sopa[v][w]=='?'){
                  int a=rand()%26;
                  sopa[v][w] = alphabet[a];
               }
            }
         }     
         
         for(int x=0; x<5; x++){
            for(int y=0; y<4; y++){
               if(y!=3)found

    [y]=100;

               else found

    [y]=strlen(lista
    );

            }
         }
         
      }
     
      if(g=='1'||g=='2'){
         
         fstream arch;
         
         if(g=='2'){
           
            arch.open("sopa saved.dat", ios::binary);
           
            arch.read(sopa[0], 20*20*sizeof(sopa));
           
            arch.read((char *)found[0], 5*4*sizeof(found));
           
            arch.read(lista[0], 5*21*sizeof(lista));
           
            arch.read((char *)palabras_found,sizeof(palabras_found));
           
            arch.close();
           
         }
         
         clrscr();   
         
         while(palabras_found<5){
           
            int w;
           
            clrscr();
           
            textcolor(LIGHTRED);
            gotoxy(6,1);
            cout<<"BIENVENIDO A LA SOPA DE LETRAS"<<endl<<endl;
           
            imprimir_sopa(sopa);
            imprimir_indices();
            imprimir_encontradas(found, lista);
            marcar_palabra(found, lista);
           
            gotoxy(1,26);
            cout<<"Tienes que encontrar las siguientes palabras:"<<endl<<endl;
           
            for(int i=0; i<5; i++){
               cout<<i+1<<" - ";
               puts(lista);
            }
           
            cout<<"\n(Nota: Las dimensiones de la sopa son 20x20)"<<endl<<endl;     
            cout<<"Buscar palabra No.: ";
            textcolor(YELLOW);
            cout<<"(Save

    Exit [6]) ";

            textcolor(WHITE);
            cin>>d;
           
            if(d==0){
               
               arch.open("sopa saved.dat", ios::binary);
               
               arch.write(sopa[0], 20*20*sizeof(sopa));
               
               arch.write((char *)found[0], 5*4*sizeof(found));
               
               arch.write(lista[0], 5*21*sizeof(lista));
               
               arch.write((char *)palabras_found,sizeof(palabras_found));
               
               arch.close();
               
               gotoxy(1,36);
               textcolor(LIGHTMAGENTA);
               cout<<"(Partida guardada)                       ";
               //textcolor(WHITE);
               Sleep(2000);
               clrscr();     
               
            }   
            if(d!=0){
               
               if(d==6){
                  clrscr();
                  break;
               }
               
               else{
                  cout<<endl;
                  cout<<"Coordenada 'X' de la inicial: ";
                  cin>>posx2;;
                  cout<<"Coordenada 'Y' de la inicial: ";
                  cin>>posy2;
                  cout<<"Horizontal [1] Vertical [2] Diagonal [3] ? ";
                  cin>>dir2;
                 
                  w=d-1;     
                 
                  if(posx2==registro[w][0]&&posy2==registro[w][1]&&dir2==registro[w][2]){
                     textcolor(LIGHTGREEN);
                     cout<<"\nExcelente! La has adivinado";
                     for(int i=0; i<3; i++){
                        found[w]=registro[w];
                     }
                     Sleep(2000);
                     marcar_palabra(found, lista);
                     palabras_found++;
                     textcolor(WHITE);
                  }
                  else {
                     textcolor(LIGHTRED);
                     cout<<"\nIncorrecto... Intenta otra vez!";
                     Sleep(2000);
                     textcolor(WHITE);
                  }
                 
               }
            }
         }
         
         if(palabras_found==4) victoria(sopa, found, lista);           
         
      }     
     
   }
   
   clrscr();
   cout<<"FIN";
   
   return 0;
   
   
}

void imprimir_sopa(char x[20][20]){
   
   textcolor(WHITE);
   
   for(int i=0; i<20; i++){
      for(int j=0; j<20; j++){
         cout<<" ";
         cout<<x[j];
         if(j==19) cout<<endl;
      }   
   }
}

void imprimir_indices(){
   
   textcolor(YELLOW);
   
   gotoxy(2,24);  //eje X
   for(int i=0; i<20; i++){
      cout<<i+1;
      if(i<9) cout<<" ";
   }
   gotoxy(43,3);  //eje Y (puede omitirse)
   int h=0;
   for(int j=0; j<20; j++){
      gotoxy(43,3+h);
      cout<<j+1;
      cout<<endl;     
      h++;
   }
   
   textcolor(WHITE);
   
}

void imprimir_encontradas(int x[5][4], char y[5][21]){
   
   textcolor(LIGHTMAGENTA);
   
   for(int i=0; i<5; i++){
     
      if(x

    !=100){

         
         gotoxy((x

    )*2,x[1]+2);

         
         if(x[2]==1){  //horizontal
            for(int t=0; t<x[3]; t++){
               cout<<y[t];
               cout<<" ";
            }     
         }
         if(x[2]==2){  //vertical
            int h=1;
            for(int t=0; t<x[3]; t++){
               cout<<y[t];
               gotoxy((x

    )*2,x[1]+2+h);

               h++;
            }     
         }
         if(x[2]==3){  //diagonal
            int h=1, k=2;
            for(int t=0; t<x[3]; t++){
               cout<<y[t];
               gotoxy((x

    )*2+k,x[1]+2+h);

               h++; k+=2;
               
            }     
         }
         
      }
   }
   
   textcolor(WHITE);
}

void marcar_palabra(int x[5][4], char y[5][21]){ 
   
   textcolor(LIGHTMAGENTA);
   
   for(int i=0; i<5; i++){
      if(x

    !=100){

         gotoxy(6+x[3],28+i);
         cout<<"X";
      }
   }
   
   textcolor(WHITE);
}

void victoria(char w[20][20], int x[5][4], char y[5][21]){
   
   clrscr();
   
   gotoxy(6,1);
   textcolor(LIGHTRED);
   cout<<"BIENVENIDO A LA SOPA DE LETRAS"<<endl<<endl;
   
   imprimir_sopa(w);
   imprimir_encontradas(x, y);
   
   gotoxy(3,24);
   textcolor(LIGHTGREEN);
   cout<<"Felicitaciones! Has adivinado todas!"<<endl;
   textcolor(WHITE);
   
}


No entiendo por qué aparecen lineas horizontales dentro del código... Qué debo hacer para hacerlo visible? Gracias de antemano. Saludos!




Ahora si :)
#7
Si. Me dí cuenta tarde. Igual ya había logrado que funcione reemplazando el bucle while por un for. Muchas gracias por su ayuda
#8
Lo conseguí. Me sugirieron agregar cin.ignore()

El código quedó así:

En este caso, almaceno las palabras en un único vector

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[]) {

int c, palabras=0, ac=0;
char pal[13], menor[13]="zzzzz";
char *p;
cout<<"Cantidad de palabras a ingresar: ";
cin>>c;
cout<<"(Recuerde que solo pueden contener hasta 12 caracteres) "<<endl<<endl;

p=new char[c*13];

for(int i=0; i<c*13; i++){
p[i]=' ';
}

cin.ignore();

while(palabras<c){
cin.getline(pal, 12);
strlwr(pal);  //  pasa pal a minusculas para luego comparar con 'mar'
strcpy(&p[ac], pal);
ac+=strlen(pal)+1;
palabras++;
if(strcmp(menor,pal)>0){
strcpy(menor,pal);
}
}
/* //comprobación del vector
for(int i=0; i<c*13; i++){
cout<<p[i];
}

cout<<endl;
*/
cout<<"\nLa palabra que aparece primero segun orden alfabetico es: ";
puts(menor);

cout<<endl<<endl;

cout<<"Los elementos de las posiciones pares son: "<<endl<<endl;

for(int j=2; j<c*13; j+=2){
puts(&p[j]);  //  si se utiliza 'cout' los resultados son distintos (debido a que las palabras se insertan en un único vector)
}

cout<<"Las palabras que contienen la cadena 'mar' son: "<<endl<<endl;

for(int k=0; k<c*13; k++){
if(strncmp(&p[k],"mar", 3)==0)
puts(&p[k]);  //  muestras todas las veces que aparece 'mar' (debido a que las palabras se insertan en un único vector)
}

delete p;

return 0;
}


Mi idea en este momento, es reescribirlo de tal manera que las palabras se almacenen en una matriz dinámica (1 palabra por fila).

Tengo esto:

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[]) {

int c, pal=0;
char menor[13]="zzzzz";
cout<<"Cantidad de palabras a ingresar: ";
cin>>c;
cout<<"(Recuerde que solo pueden contener hasta 12 caracteres) "<<endl<<endl;

char** p=new char*[c];

for(int h=0; h<c; h++){
p[h]=new char[13];
}
/*
for(int i=0; i<c; i++){
for(int j=0; j<13; j++){
p[i][j]=' ';
}
}
*/
cin.ignore();

while(pal<c){
cin.getline(p[pal], 12);
strlwr(p[pal]);  //  pasa pal a minusculas para luego comparar con 'mar'
pal++;
if(strcmp(menor,p[pal])>0){
strcpy(menor,p[pal]);
}
}
/* //comprobación del vector
for(int i=0; i<c*13; i++){
cout<<p[i];
}

cout<<endl;
*/
cout<<"\nLa palabra que aparece primero segun orden alfabetico es: ";
puts(menor);

cout<<endl<<endl;

cout<<"Los elementos de las posiciones pares son: "<<endl<<endl;

for(int j=0; j<c; j+=2){
puts(p[j]);  //  si se utiliza 'cout' los resultados son distintos (debido a que las palabras se insertan en un único vector)
}

cout<<"\nLas palabras que contienen la cadena 'mar' son: "<<endl<<endl;

for(int k=0; k<c; k++){
if(strncmp(p[k],"mar", 3)==0)
puts(p[k]);  //  muestras todas las veces que aparece 'mar' (debido a que las palabras se insertan en un único vector)
}

for(int l=0; l<c; l++){
delete[] p[l];
}

delete[] p;

return 0;
}


Compilé y resulto bien solo la primera vez. Cada vez que ingreso las palabras me aparece el mensaje: [nombre_del_archivo] dejó de funcionar. Por si es de utilidad, estoy trabajando con Windows 7 64b.

Me gustaría que se fijen bien el tema de asignación dinámica y doble punteros. Recién estoy aprendiendo, así que no estoy muy seguro del uso de new y delete.

Gracias de antemano!
#9
Primero quiero agradecer la buena predisposición que tienen para ayudarme a terminar :)

Lamentablemente, me sigue devolviendo lo mismo. Parece ser que dentro del bulce while ocurre algo que luego no me deja imprimir la cadena menor

while(palabras<c+1){
cin.getline(pal, 13);
strcpy(&p[ac], pal);
ac+=strlen(pal)+1;
palabras++;
if(strcmp(menor,pal)>0){
strcpy(menor,pal);
}
}


Aclaro que puse palabras<c+1 porque solo poniendo <c me deja ingresar una palabra menos (creo que se debe a getline)
Quedo a la espera de alguna solución.
Gracias!!!
#10
Está bien. No era mi intención que me den la solución. La idea era empezar de cero a ver la teoría de esos contenidos. Esto es lo que tengo hasta ahora del primer ejercicio:

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int main(int argc, char *argv[]) {

int c, palabras=0, ac=0;
char pal[13], menor[13]="zzzzz";
char *p;
cout<<"Cantidad de palabras a ingresar: ";
cin>>c;
cout<<"(Recuerde que solo pueden contener hasta 12 caracteres) "<<endl<<endl;
p=new char[c*13];

for(int i=0; i<c*13; i++){
p[i]=' ';
}

        while(palabras<c+1){
cin.getline(pal, 13);
strcpy(&p[ac], pal);
ac+=strlen(pal)+1;
palabras++;
if(strcmp(menor,pal)>0){
strcpy(menor,pal);
}
}

for(int i=0; i<c*13; i++){
cout<<p[i];
}

puts(menor);

return 0;
}


El problema es que puts no devuelve nada. No puedo deducir el motivo. Alguien?