Varios problemas con C#

Linkito93

Muy buenas! Estoy haciendo la práctica final para programación 1 (Que tengo que entregar mañana por la noche) y consta de 2 ejercicios, donde he empezado con el primero y ya tengo varias dudas.

spoiler

¿Alguien puede ayudarme a modular esto?

#include<stdio.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>

void matriz(void){
    int N=22,f=0,c=0,i=0,morir=0,L=4,fh=0,ch=0,win=0;
    char M[N][N], repetir;
    srand(time(NULL));
    
//Con este bucle podremos repetir todo el juego al acabar. do{ //Pedimos la dificultad a usuario printf("Introducza la dificultad <1-10>: "); scanf("%d",&L); //Inicializamos la Matriz for(f=0;f<=N;f++){ for(c=0;c<=N;c++){ M[f][c]=' '; } } //Delimitamos Horizontal y Verticalmente for(f=0;f<=N;f++)M[0][f]='X'; for(f=0;f<=N;f++)M[f][0]='X'; for(f=0;f<=N;f++)M[N][f]='X'; for(f=0;f<=N;f++)M[f][N]='X'; //Creamos aleatoriamente al Humano. do{ f=rand()%N; c=rand()%N; M[f][c]='@'; }while(M[f][c]=='X'); //Creamos las minas. for(i=0;i<N;i++){ //Este do while se encarga de no imprimir dos minas en el mismo sitio ni en bordes. do{ //Imprime minas aleatoriamente. f=rand()%N; c=rand()%N; }while((M[f][c]=='*')||M[f][c]=='X'||(M[f][c]=='@')); M[f][c]='*'; printf("%c",M[f][c]); } //Creamos los zombies. for(i=0;i<(N/4);i++){ //Este do while se encarga de no imprimir dos zombies en el mismo sitio ni en bordes. do{ //Imprime zombies aleatoriamente. f=rand()%N; c=rand()%N; }while((M[f][c]=='*')||M[f][c]=='X'||(M[f][c]=='@')||(M[f][c]=='Z')); M[f][c]='Z'; printf("%c",M[f][c]); } do{ system("cls"); printf(" - - - - - - - - - - - - - - -\n"); printf("| Apokalise Zombie para todos |\n"); printf(" - - - - - - - - - - - - - - -\n"); //Dibujamos la matriz final. for(f=0;f<=N;f++){ for(c=0;c<=N;c++){ printf("%c",M[f][c]); } printf("\n"); } //MOVIMIENTO DEL HUMANO //esperamos una tecla char tecla = getch(); //doble código en caso de que sea un cursor if(tecla==-32 || tecla==0) tecla=getch(); //en función de la tecla pulsada switch(tecla){ case 72: case '8': //ARRIBA for(f=0;f<=N;f++){ for(c=0;c<=N;c++){ //Detectamos si hay alguna mina. if((M[f][c]=='@') & (M[f-1][c]=='*')){ morir++; }else{ if((M[f][c]=='@') & (M[f][c]!=M[1][c])){ M[f-1][c]=M[f][c]; M[f][c]=' '; } } } }break; case 80: case '2': //ABAJO for(f=0;f<=N;f++){ for(c=0;c<=N;c++){ //Detectamos si hay alguna mina. if((M[f][c]=='@') & (M[f+1][c]=='*')){ morir++; }else{ if((M[f][c]=='@') & (M[f][c]!=M[N-1][c])){ M[f+1][c]=M[f][c]; M[f][c]=' '; c=N+1; f=N+1; } } } }break; case 75: case '4': //IZQUIERDA for(f=0;f<=N;f++){ for(c=0;c<=N;c++){ //Detectamos si hay alguna mina. if((M[f][c]=='@') & (M[f][c-1]=='*')){ morir++; }else{ if((M[f][c]=='@') & (M[f][c]!=M[f][1])){ M[f][c-1]=M[f][c]; M[f][c]=' '; } } } }break; case 77: case '6': //DERECHA for(f=0;f<=N;f++){ for(c=0;c<=N;c++){ //Detectamos si hay alguna mina. if((M[f][c]=='@') & (M[f][c+1]=='*')){ morir++; }else{ if((M[f][c]=='@') & (M[f][c]!=M[f][N-1])){ M[f][c+1]=M[f][c]; M[f][c]=' '; c=N+1; f=N+1; } } } }break; default: printf("\nIntroduce una tecla valida"); getche(); } //MOVIMIENTO DE LOS ZOMBIES //Tomamos la posición del humano. for(f=0;f<=N;f++){ for(c=0;c<=N;c++){ if(M[f][c]=='@'){ fh=f; ch=c; } } } //Buscamos la posición de los zombies. for(f=0;f<=N;f++){ for(c=0;c<=N;c++){ if(M[f][c]=='Z'){ if(rand()%100<(10*L)){ if(f>fh & c>ch){ //Si chocan con una mina se eliminan ambos. //Si el siguiente movimiento es el humano el juego termina. if(M[f-1][c-1]=='@') morir++; if(M[f-1][c-1]=='*'){ M[f][c]=' '; M[f-1][c-1]=' '; }else{ M[f-1][c-1]=M[f][c]; M[f][c]=' '; M[f-1][c-1]='C'; } } if(f>fh & c==ch){ if(M[f-1][c]=='@') morir++; if(M[f-1][c]=='*'){ M[f][c]=' '; M[f-1][c]=' '; }else{ M[f-1][c]=M[f][c]; M[f][c]=' '; M[f-1][c]='C'; } } if(f>fh & c<ch){ if(M[f-1][c+1]=='@') morir++; if(M[f-1][c+1]=='*'){ M[f][c]=' '; M[f-1][c+1]=' '; }else{ M[f-1][c+1]=M[f][c]; M[f][c]=' '; M[f-1][c+1]='C'; } } if(f<fh & c>ch){ if(M[f+1][c-1]=='@') morir++; if(M[f+1][c-1]=='*'){ M[f][c]=' '; M[f+1][c-1]=' '; }else{ M[f+1][c-1]=M[f][c]; M[f][c]=' '; M[f+1][c-1]='C'; } } if(f<fh & c==ch){ if(M[f+1][c]=='@') morir++; if(M[f+1][c]=='*'){ M[f][c]=' '; M[f+1][c]=' '; }else{ M[f+1][c]=M[f][c]; M[f][c]=' '; M[f+1][c]='C'; } } if(f<fh & c<ch){ if(M[f+1][c+1]=='@') morir++; if(M[f+1][c+1]=='*'){ M[f][c]=' '; M[f+1][c+1]=' '; }else{ M[f+1][c+1]=M[f][c]; M[f][c]=' '; M[f+1][c+1]='C'; } } if(f==fh & c>ch){ if(M[f][c-1]=='@') morir++; if(M[f][c-1]=='*'){ M[f][c]=' '; M[f][c-1]=' '; }else{ M[f][c-1]=M[f][c]; M[f][c]=' '; M[f][c-1]='C'; } } if(f==fh & c<ch){ if(M[f][c+1]=='@') morir++; if(M[f][c+1]=='*'){ M[f][c]=' '; M[f][c+1]=' '; }else{ M[f][c+1]=M[f][c]; M[f][c]=' '; M[f][c+1]='C'; } } } } } } //volvemos a transformar a los zombies. //Comprobamos que queden zombies vivos. win=0; for(f=0;f<=N;f++){ for(c=0;c<=N;c++){ if(M[f][c]=='C') M[f][c]='Z'; if(M[f][c]=='Z')win++; } } //Si no hay zombies vivos el juego acaba. if(win==0) morir=2; }while(morir==0); if(morir==1) printf("Has muerto!"); if(win==0) printf("Has ganado!"); printf("\nPulsa cualquier tecla para salir, pulsa R para volver a jugar: "); fflush(stdin); scanf("%c",&repetir); morir=0; }while(repetir=='R'); return; } int main (void){ matriz(); getche(); }

Gracias nuevamente!

Soltrac

Tío, esto no es c# ....

1 respuesta
Linkito93

#2 Ya, es C pero se me ha colado el # xD

1 respuesta
Soltrac

Edito q la he liado.


while (i < 10)
{
  if (i == posR)
    printf("R");
  else
    printf(" ");

  printf("|") ;
  for (j = 0; j < habit[i]; j++)
    printf("@");
  for (k = j; k < 10; k++)
    printf(" ");
  printf("|\n");
  i++;
}

Algo así #3, no lo tengo testeado pero seguro q puedes darle los retoques q hagan falta.

1 1 respuesta
Linkito93

#4 OMFG sí que funciona y perfectamente.

Mira que me he calentado la cabeza para lo simple que era, muchísimas gracias, iré comentando si encuentro más problemas.

EDIT: Lo he arreglado ya que al usar "j" en el bucle siguiente el While en ocasiones vuelve a imprimir una R y en ocasiones no imprimía ninguna. Por lo tanto había dos opciones, o bien crear un nuevo entero o bien usar un solo bucle con un if.

Linkito93

Tengo una nueva dudilla, a ver si podéis orientarme un poco.

EDIT: Vale, creo que tengo una idea, en el switch podría comprobar si el siguiente movimiento será una mina o zombie no? Ahora os cuento.

EDIT2: Ya detecta minas, ahora queda detectar zombies xD

EDIT3: He agregado algunas tonterias como bucles para repetir el juego cuando acabe.

Linkito93

AYUDAAA! Por favor. No pido que me resolvais el como mover a los zombies, simplemente ideas, estoy harto ya de este ejercicio xDDDDD

Soltrac

Pero explícate que es lo q quieres hacer, q es lo q tienes hecho, etc...

1 respuesta
Linkito93

#8 He intentado explicarlo arriba.

Por el momento tengo echo el panel, los zombies y las minas. Tengo echo que cuando el usuario pisa una mina, acabe el jugego, y ahora estoy intentando mover a los zombies.

Los zombies deben de moverse EN DIRECCIÓN al usuario (También en diagonal) pero el bucle que tengo, a pesar de detectarme los zombies los mueve sea cual sea la condición y no en dirección al usuario, además de destrozarme el panel.

En resumen: Necesito mover los zombies hacia el usuario.

EDIT: CONSEGUIDO!

He usado más variables pero los zombies ya se mueven, por lo tanto solo me queda eliminar zombies con minas y decir que si te coge un zombie estás muerto.

El código lo he dejado actualizado por si quieres echar un vistazo.

Linkito93

Podéis ayudarme a modular el código? Ya lo he conseguido terminar, pero a la hora de crear módulos no puedo hacer nada.

Intento crear un modulo para crear la matriz y me da errores como que N no está declarada y cosas por el estilo, me estoy volviendo loco ya que si creo constantes globales el programa falla (No sé porque tampoco) y si no las creo la matriz M[N][N] por ejemplo al pasarla a un modulo dice que N no existe (A pesar de pasarlo también)

¿A que se debe esto?

eXtreM3

Madre mía qué chorizaco de c puro xD

1 1 respuesta
Linkito93

#11 Ya, estoy hasta la pollens.

A ver si me ayudais, porque esque enserio no me deja modularlo. Si pongo N como variable global el programa funciona pero imprime mal por pantalla, en cambio, si lo dejo donde está ocurre lo siguiente:

void crearmatriz(char M[N][N]){
    int f,c;
    //Inicializamos la Matriz
    for(f=0;f<=N;f++){
        for(c=0;c<=N;c++){
            M[f][c]=' ';
        }
    }
    //Delimitamos Horizontal y Verticalmente
    for(f=0;f<=N;f++)M[0][f]='X';
    for(f=0;f<=N;f++)M[f][0]='X';
    for(f=0;f<=N;f++)M[N][f]='X';
    for(f=0;f<=N;f++)M[f][N]='X';
}

int matriz(void){
    int N=22,f=0,c=0,i=0,morir=0,L=4,fh=0,ch=0,win=0;
    char M[N][N], repetir;
    srand(time(NULL));

//Con este bucle podremos repetir todo el juego al acabar.
do{
    //Pedimos la dificultad a usuario
    printf("Introducza la dificultad <1-10>: ");
    scanf("%d",&L);

    crearmatriz(M);

Y los errores son:

'M' Was not declare in this scope
'N' was not declared in this scope.

En las líneas de la función crearmatriz.

1 respuesta
Lecherito

#12 No tienes que poner la dimensión del array como argumento de función.

Linkito93

Ya he entregado la práctica, de todas formas no he conseguido poner todos los valores por valor/referencia, me soltaba errores, aunque al final he conseguido meter la matriz con un #define N 22

No sé porque me daba tales errores, el año pasado bajo W7 con Qt hice problemas parecidos a este y no me dio problemas respecto a pasar valores, pero ahora con W8 no sé si soy yo o es cosa del SO.

Usuarios habituales

  • Linkito93
  • Lecherito
  • eXtreM3
  • Soltrac