Hola a todos, estoy tratando de hacer un programita en c, pero al ejecutarlo me tira error. Alguien me puede decir en lo que me equivoque¿?.
Se supone que es un tablero de ajedrez en el que el caballo se tiene que mover de manera aleatoria logrando el mayor recorrido posible, sin pasar por el mismo lugar. Tiene 100 intentos. Voy registrando en un vector la cantidad de movimientos de cada intento.
http://imageshack.us/a/img40/6745/x1nu.png
http://imageshack.us/a/img407/9054/p085.png
http://img580.imageshack.us/img580/4497/oqek.png
Pretendes que alguien se copie el código a partir de las capturas de imágenes y lo depure por ti?? si es así, suerte.
Esto no suele funcionar así... la cosa es que nos facilites un poco el trabajo. Nos pones la porción de código problemática (si es posible) y nos comentas de paso qué es lo que tendría que suceder... o qué sale mal.
Pero ya te digo yo que no veo muy probable que alguien se ponga a picar código sacado de 3 capturas de pantalla para darte una respuesta.
+1 a eferion.
Si quieres que alguien lo vea y compile (la forma más fácil de localizar errores), pon el código así:
int main(){
string a="etc etc";
}
bue ya que estamos con fotos la respuesta sera con fotos
http://subefotos.com/ver/?c9026e139b7c28b544d74e8b1344558eo.jpg (http://subefotos.com/ver/?c9026e139b7c28b544d74e8b1344558eo.jpg)
aprovecho y te enseño a ingresar el code y los errores en la pagina
http://subefotos.com/ver/?97996c051c410dd194522c7ca2cd013do.jpg (http://subefotos.com/ver/?97996c051c410dd194522c7ca2cd013do.jpg)
aclaro esta interesante el desafio
buscando en google...es largo para pensarlo
http://hitmontop-ejerciciosresueltos.blogspot.com.ar/2011/01/deitelc425ccircuito-del-caballo.html (http://hitmontop-ejerciciosresueltos.blogspot.com.ar/2011/01/deitelc425ccircuito-del-caballo.html)
Ante todo gracias por responder. Y NO, no sabía utilizar el código. Soy nuevo en el foro, y hace tiempo que no me registro en uno. Creí que la forma más fácil era mostrando esas capturas.
//caballoLoco//
#include <stdio.h>
#include <stdlib.h>
#define LIMITE 8
#define LONG 100
int ejex(int x);int ejey(int y);
int main()
{
int tablero[LIMITE][LIMITE]={{0},{0}};
int caminos[LONG];
int x, xx, yy, y;int direc= 0;int sepuede;int contador= 1;
int i, j;int elegido= 0;
int m, n;// para inicializar tablero//
scanf("%d",&xx);//elegiendo posicion de arranque//
scanf("%d",&yy);
tablero[x][y]= 1;
srand(time(NULL));
for (j=1; j <= LONG; j++){
for (m= 0; m < LIMITE-1; m++){ //inicializando tablero//
for (n= 0; n < LIMITE-1; n++)
tablero[m][n]= 0;
}
tablero[x][y]= 1;
sepuede= 0;
contador= 0;
xx= x;
yy= y;
while (sepuede != 1) {
elegido= rand()%7;
x+= ejex(elegido); //moviendose//
y+= ejey(elegido);
if ((x < 0) || (y > 7)){
printf("Se sale del tablero");
sepuede= 1;
}
else {
if (( x > 7) || ( y < 0)){
printf("Se sale del tablero");
sepuede= 1;
}
else {
if ( tablero[x][y]== 1){
printf("Ya se pasó por acá");
sepuede= 1;
}
else {
tablero[x][y]= 1;
contador+= 1;
printf("\n\n");
for (i=0; i < 8; i++) { //Viendo el tablero//
printf("%d%d%d%d%d%d%d%d\n", tablero[0][i], tablero[1][i], tablero[2][i], tablero[3][i],
tablero[4][i], tablero[5][i], tablero[6][i], tablero[7][i]); //graficando lo que pasa//
}
}
}
}
}
printf("\n\n");
printf("Casilleros: %d\n",contador);
caminos[j-1]= contador;
}
printf("INTENTO distancia\n");
for (j=0; j < LONG; j++) //Imprime caminos//
printf("%d----%d\n", j, caminos[j]);
system("PAUSE");
return 0;
}
int ejex(int x)
{
int fila[LIMITE]={2,1,-1,-2,-2,-1,1,2};
return fila[x];
}
int ejey(int y)
{
int columna[LIMITE]={-1,-2,-2,-1,1,2,2,1};
return columna[y];
}
Primero intente hacer el codigo para que el caballo haga un solo recorrido al azar y funciono bien, pero despues, para que haga 100 intentos seguidos utilice un for.
Citarfor (j=1; j <= LONG; j++){
No me tira errores de sintaxis, pero cuando lo ejecuto, ingreso la posicion de inicio y despues de un par de segundos me tira error.
¡Buenas!
Con semejante caos de código no se donde puede estar el error. Si tienes un error de ejecución lo mas posible es que en algún momento intentes acceder a una posición de memoria incorrecta (que te salgas de los límites de algún vector).
Tienes un montón de variables. Intenta hacer el código mas limpio utilizando funciones. Por ejemplo:
- Una función que dada la posición del caballo y el movimiento que quieres realizar, te diga si el movimiento es correcto o no.
- Una función que te inicialice el tablero.
- Una función que te imprima el tablero.
- Una función, lo mas sencillo es que sea recursiva, que partiendo de una posición inicial realice los movimientos de forma automática hasta que no haya mas posibilidades.
De esta forma tu código estará separado en tareas mas sencillas en las que encontrar errores te resultará mas fácil y será mucho mas facil de leer, ya que cada una de las funciones tendrá unas pocas líneas de código y sus acciones serán muy concretas.
¡Saludos!
ok intentare emprolijar el asunto haber si encuentro el error. Gracias por responder!!
1: El error es un Access violatión, al menos en mi máquina, con OllyDBG.
2: A base de
system("pause"), encontré el error en
tablero[x][y]= 1;
(Después de los
scanf())
Las variables "x" e "y" no están inicializadas. Quizás lo hayas confundido con "xx" e "yy". Eso ya es tu código, y no me paré mucho a entender cómo funciona.
Cita de: do-while en 7 Septiembre 2013, 10:04 AM
Tienes un montón de variables
Tiene toda la razón.
Suerte :D
muchas gracias ivancea96 , do-while!!. Esas variables estaban un poco alpedo. Ahora modularice un poco y me quedo esto:
#include <stdio.h>
#include <stdlib.h>
#define LIMITE 8
#define LONG 100
void mostrar(int matriz[][LIMITE]);
void inicializar(int matriz[][LIMITE]);
int ejex(int x);int ejey(int y);
int mover(int y, int x, int matriz[][LIMITE]);
int main()
{
int tablero[LIMITE][LIMITE];
int caminos[LONG]={0};
int x, y, i;
srand(time(NULL));
scanf("%d", &x);
scanf("%d", &y);
for (i= 1; i <= LONG; i++) {
inicializar(tablero);
tablero[y][x]= 1;
caminos[i-1]= mover(y, x, tablero);
}
printf("Intento distancia\n");
for (i=0; i < LONG; i++)
printf("%d\t\t%d\n", i+1, caminos[i]);
mostrar(tablero);
system("PAUSE");
return 0;
}
void inicializar(int matriz[][LIMITE])
{
int i, j;
for (i= 0; i < LIMITE; i++){
for (j= 0; j < LIMITE; j++)
matriz[i][j]= 0;
}
return;
}
int ejey(int y)
{
int fila[LIMITE]={2,1,-1,-2,-2,-1,1,2};
return fila[y];
}
int ejex(int x)
{
int columna[LIMITE]={-1,-2,-2,-1,1,2,2,1};
return columna[x];
}
int mover(int y, int x,int matriz[][LIMITE])
{
int sepuede= 1;
int elegido, fx, fy;
int contador= 0;
fy= y;
fx= x;
while (sepuede == 1) {
elegido= rand()% 7;
fx+= ejex(elegido);
fy+= ejey(elegido);
if ((fx < 0) || (fx > 7))
sepuede= 0;
else {
if ((fy < 0) || ( fy > 7))
sepuede= 0;
else {
matriz[fy][fx]= 1;
contador+= 1;
}
}
}
return contador;
}
void mostrar(int matriz[][LIMITE])
{
int i,j;
for (i= 0; i < LIMITE; i++){
for (j= 0; j < LIMITE; j++)
printf("%d ", matriz[i][j]);
printf("\n");
}
return;
}
Se ejecuta bien, pero me llama un poco la atención que ningun intento supere de los 15 o 17 movimientos.
No había modularizado antes por que no sabía pasar matrices a la función xD.