Alguien me dice porque cada vez que hago system("clear")
me pasa esto? :-\ (http://i.imgur.com/Ux7qBUK.png)
Sistema operativo Lubuntu y terminal LXTerminal...
Ya vi que es normal... Si la quiero limpiar como tal completamente debo usar reset, pero no hay alternativa?
He modificado un poco tu programa y en Mint con el MATE Terminal solo me da un problema: cuándo maximizo la ventana no muestra todo el tablero y el menú hasta que se pulsa una tecla, pero eso ya es del funcionamiento del propio terminal.
Ahí va el código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define alto 25
#define ancho 25
void escribir(int pasos);
void imprimir_tablero();
void imprimir_datos_lapiz();
void pintar_casilla();
typedef enum {
NORTE,
ESTE,
SUR,
OESTE
} direccion_t;
typedef enum {
LEVANTADO,
BAJADO
} estado_t;
struct {
unsigned x;
unsigned y;
direccion_t direccion;
estado_t estado;
} lapiz;
int plano[alto][ancho];
int main(void) {
int op = 0;
int pasos;
while (op != 9) {
system("clear");
imprimir_datos_lapiz();
imprimir_tablero();
puts("");
puts("Introduzca una opcion");
puts("1) Levantar lapiz");
puts("2) Bajar lapiz");
puts("3) Girar a la derecha");
puts("4) Girar a la izquierda");
puts("5) Desplazar lapiz");
puts("9) Salir");
printf("\n>>");
scanf("%d", &op);
while(getchar() != '\n');
switch (op) {
case 1:
lapiz.estado = LEVANTADO;
pintar_casilla();
break;
case 2:
lapiz.estado = BAJADO;
pintar_casilla();
break;
case 3:
if(lapiz.direccion == OESTE)
lapiz.direccion = NORTE;
else
lapiz.direccion++;
break;
case 4:
if(lapiz.direccion == NORTE)
lapiz.direccion = OESTE;
else
lapiz.direccion--;
break;
case 5:
printf("Introduzca la cantidad de pasos que desea dar: ");
scanf("%d", &pasos);
while(getchar() != '\n');
escribir(pasos);
break;
case 9:
printf("Gracias por usar el programa! \n");
break;
}
}
return 0;
}
void pintar_casilla() {
plano[lapiz.y][lapiz.x] = lapiz.estado;
}
void escribir(int pasos) {
switch(lapiz.direccion) {
case NORTE:
for(; pasos > 0; pasos--) {
if(lapiz.y > 0) {
lapiz.y--;
pintar_casilla();
}
}
break;
case ESTE:
for(; pasos > 0; pasos--) {
if(lapiz.x < (ancho - 1)) {
lapiz.x++;
pintar_casilla();
}
}
break;
case SUR:
for(; pasos > 0; pasos--) {
if(lapiz.y < (alto-1)) {
lapiz.y++;
pintar_casilla();
}
}
break;
case OESTE:
for(; pasos > 0; pasos--) {
if (lapiz.x > 0) {
lapiz.x--;
pintar_casilla();
}
}
break;
}
}
void imprimir_datos_lapiz() {
char direcc[6];
char est[10];
switch(lapiz.direccion) {
case 0:
strcpy(direcc, "NORTE");
break;
case 1:
strcpy(direcc, "ESTE");
break;
case 2:
strcpy(direcc, "SUR");
break;
case 3:
strcpy(direcc, "OESTE");
break;
}
if(!lapiz.estado)
strcpy(est, "LEVANTADO");
else
strcpy(est, "BAJADO");
printf("Lapiz: %9s | %5s | x = %i | y = %i\n", est, direcc, lapiz.x, lapiz.y);
}
void imprimir_tablero() {
int i, j;
for (i = 0; i < alto; i++) {
for (j = 0; j < ancho; j++) {
if(lapiz.y == i && lapiz.x == j )
printf("I");
else if(plano[i][j] == 0)
printf(" ");
else
printf("x");
}
puts("");
}
}
Genial! Aunque no consoco un par de cosas de ese código en esencia es el mismo creó, aunque mas intuitivo que el mio ;-)
el mío ya funciona bien o al menos se quitó el límite de 15... No se porque un libro mandaría a programar un array de 50x50 si no cabe en una terminal... :¬¬