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.
¿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!