Buongiorno.... ho inizializzato i contenuti delle celle di una matrice in una funzione , ho fatto un'altra funzione che se richiamata mi stampa i contenuti di tali celle ma se la richiamo mi dà segm.fault core dumped ,mentre se quel pezzo di codice lo metto dove ho inizializzato le celle mi va e mi stampa ....da cosa può dipendere secondo voi ????
vi metto il codice composto da 3 file..........in ordine gamelib.h, main.c, gamelib.c...........
vi metto il codice composto da 3 file..........in ordine gamelib.h, main.c, gamelib.c...........
C:
#ifndef GAMELIB_H
#define GAMELIB_H
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <math.h>
void gioca();
void crea_mappa();
void termina_gioco();
enum Tipo_pericolo{
nessun_pericolo,
trappola,
alieno
};
enum Stato_giocatore{
vulnerabile,
scudo_vita,
solo_vita,
solo_scudo
};
enum Tipo_oggetto{
nessun_oggetto,
medikit,
pozione,
materiale,
colpi_lanciarazzi
};
struct Giocatore {
enum Stato_giocatore stato;
int posizionex;
int posizioney;
unsigned short int zaino[4];
unsigned int short uccisioni_alieni;
};
struct Cella{
enum Tipo_pericolo pericolo;
enum Tipo_oggetto oggetto ;
};
#endif
C:
#include <stdlib.h>
#include <stdio.h>
#include "gamelib.h"
int main(){
int scegli;
do{
printf("Inserisci l'operazione da effettuare \n");
printf(" 1. Crea mappa.\n 2. Gioca. \n 3. termina gioco.\n");
printf("Attenzione, prima di giocare devi creare la mappa! \n " );
scanf("%d",&scegli);
if (scegli<1||scegli>3) {
printf("Hai inserito un valore non valido\n" );
}
switch(scegli){
case 1:
crea_mappa();
break;
case 2:
gioca();
break;
case 3:
termina_gioco();
break;
}
}while(scegli!=3);
}
C:
#include "gamelib.h"
static struct Cella *scacchiera = NULL ;
static struct Giocatore Ciccio;
static struct Giocatore Ninja ;
int lato ;
void crea_scacchiera();
void stampa_scacchiera();
void termina_creazione();
void muovi();
void usa_oggetto();
static short int vittoriaNinja=0,vittoriaCiccio=0;
static unsigned int turni_passati=0;
static short int mosse_a_disposizione_Ninja=1;
static short int mosse_a_disposizione_Ciccio=1;
static void turnoNinja();
static void turnoCiccio();
short int turno_c,turno_n;
///la funzione termina_creazione permette di ritonrare al menu iniziale del gioco
void termina_creazione() {
printf("da fare\n" );
}
void termina_gioco(){
printf("Ecco le statistiche delle partite:" );
printf("Vittorie di Ninja : %d\n Vittorie di Ciccio: %d \n ",vittoriaNinja,vittoriaCiccio );
}
void crea_mappa(){
int opzione;
do {
printf("\t Premi '1' per CREARE LA SCACCHIERA \n" );
printf("\t \n" );
printf("\t Premi '2' per STAMPARE LA SCACCHIERA \n" );
printf("\t \n" );
printf("\t Premi '3' per TORNARE INDIETRO \n" );
scanf("%d", &opzione );
switch (opzione) {
case 1:
crea_scacchiera();
break;
case 2:
stampa_scacchiera();
break;
case 3:
termina_creazione();
break;
default:
printf("Opzione non valida..\n" );
break;
}
} while(opzione!=3);
}
void crea_scacchiera () {
int mappa,i,j,righe,colonne,ness_per,alie,trapp,no_obj ,medik,pozio,mater,colpilancia,w;
printf("Immettere la lunghezza n di un lato della scacchiera: " );
scanf("%d", &lato );
mappa=lato*lato ;
righe=lato;
colonne=lato;
printf("Grandezza Mappa => %d (%dX%d)\n\n",mappa,lato,lato);
struct Cella* scacchiera=malloc(righe*colonne*sizeof(struct Cella));
w=struct Cella scacchiera;
//allocazione della matrice
/*
for ( i = 0; i < lato; ++i) {
for ( j= 0; j <lato; ++j) {
scacchiera[i*colonne+j].oggetto=rand()%3
scacchiera[i*righe+j].pericolo=3+rand()%5;
}
}
*/
printf("Ai fini della difficoltà del gioco dovrai inserire 3 probabilità la cui somma dovrà fare 100..... \n\n" );
do {
printf("\t Probabilità di trovare in una data cella una'TRAPPOLA':" );
scanf("%d", &trapp);
printf("\t Probabilità di trovare in una data cella un 'ALIENO' :" );
scanf("%d", &alie );
printf("\t Probabilità di trovare in una data cella 'NESSUN PERICOLO':");
scanf("%d", &ness_per );
if (ness_per +trapp+alie !=100) {
printf(" \n Ricorda la somma delle probabilità deve essere 100 \n " );
}
}
while( ness_per +trapp+alie !=100);
printf("\t \n Ora dovrai inserire 5 probabilità legate al ritrovamento o meno degli oggetti....." );
do {
printf("\n\n\t Probabilità di trovare in una data cella 'POZIONE':" );
scanf("%d", &pozio);
printf("\t Probabilità di trovare in una data cella un 'MEDIKIT' :" );
scanf("%d", &medik );
printf("\t Probabilità di trovare in una data cella 'MATERIALE':" );
scanf("%d", &mater);
printf("\t Probabilità di trovare in una data cella un 'COLPI LANCIARAZZI' :" );
scanf("%d", &colpilancia );
printf("\t Probabilità di trovare in una data cella 'NESSUN OGGETTO':" );
scanf("%d", &no_obj );
if (no_obj+pozio+medik+colpilancia+mater !=100) {
printf("Ricorda la somma delle probabilità deve essere 100" );
}
} while(no_obj+pozio+medik+colpilancia+mater !=100);
//inizializzo Tipo_pericolo
for ( i = 0; i < lato; i++) {
for ( j= 0; j <lato; j++) {
int t[lato];
t[i]= rand()%101;
if (t[lato]<ness_per) {
scacchiera[i*lato+j].pericolo=nessun_pericolo;
} else if (ness_per<=t[lato]&&t[lato]<=ness_per+trapp) {
scacchiera[i*lato+j].pericolo=trappola;
} else if (t[lato]>ness_per+trapp)
scacchiera[i*lato+j].pericolo=alieno;
}
}
//inizializzo Tipo_oggetto
for ( i = 0; i < lato; i++) {
for ( j= 0; j <lato; j++) {
int y[lato];
y[i]=rand()%101;
if (y[i]<no_obj) {
scacchiera[i*lato+j].oggetto=nessun_oggetto;
} else if (no_obj<=y[i]&&y[i]<no_obj+medik) {
scacchiera[i*lato+j].oggetto=medikit;
} else if (no_obj+medik<=y[i]&&y[i]<no_obj+medik +pozio)
scacchiera[i*lato+j].oggetto=pozione;
else if (no_obj+trapp+pozio<=y[i]&&y[i]<no_obj +medik+pozio+mater)
scacchiera[i*lato+j].oggetto=materiale;
else if (no_obj+trapp+pozio+mater<=y[i]&&y[i]< no_obj+medik+pozio+mater+colpilancia)
scacchiera[i*lato+j].oggetto=colpi_lanciarazzi;
}
}
//prova stampa
// struct cella * Ciccio = (scacchiera+ rand()%lato * rand()%lato) ;
//
/*
//static void gieson(struct Giocatore *player){
time_t t;
srand((unsigned) time(&t));
int apparizione = 1 + (rand() % 100);
} */
/*
Ninja.zaino[nessun_oggetto]=0;
Ciccio.zaino[nessun_oggetto]=0;
Ninja.zaino[medikit]=0;
Ciccio.zaino[medikit]=0;
Ninja.zaino[pozione]=0;
Ciccio.zaino[pozione]=0;
Ninja.zaino[materiale]=0;
Ciccio.zaino[materiale]=0;
Ninja.zaino[colpi_lanciarazzi]=0;
Ciccio.zaino[colpi_lanciarazzi]=0;
Ninja.stato=solo_vita;
Ciccio.stato=solo_vita;
*/
printf("\n\n\nOk......la mappa è stata creata\n\n\n");
}
void stampa_scacchiera(){
int l, p ;
for ( l = 0; l < lato ; l++) {
for (p=0; p<lato ; p++) {
if ((scacchiera+l+p)->pericolo==nessun_pericolo) {
printf(" 1" );
} else if ((scacchiera+l*p)->pericolo==alieno) {
printf(" 2" );
} else if((scacchiera+l*p)->pericolo==trappola) {
printf(" 3" );
}///////////////////////////////////////////////////
if((scacchiera+l*p)->oggetto==nessun_oggetto) {
printf(" 4" );
} else if ((scacchiera+l*p)->oggetto==medikit) {
printf(" 5" );
} else if((scacchiera+l*p)->oggetto==pozione) {
printf(" 6" );
}
else if ((scacchiera+l*p)->oggetto==materiale) {
printf(" 7" );
} else if((scacchiera+l*p)->oggetto==colpi_lanciarazzi) {
printf(" 8" );
}
}
printf("\n" );
}
printf("\t\t\t Legenda :\n\n");
printf("\nNessun pericolo=1\nAlieno=2\nTrappola=3\nNessun Oggetto=4\nMedikit=5\nPozione=6\nMateriale=7\nColpi lanciarazzi=8\n " );
}
/*time_t t;*/
/*srand((unsigned) time(&t));*/
void gioca(){
int inizio=0;
inizio=1+rand() % 101;
if (inizio<=50) {
turnoNinja();
} else {
turnoCiccio();
}
}
void turnoCiccio(){
/*
printf("Ciccio è il tuo turno ! \n Scegli cosa fare!\n");
int sm;
do{
printf("Premi:\n 1. Per muoverti \n 2. Per usare un oggetto" );
scanf("%d\n" , &sm );
switch(sm){
case 1:
muovi();
break;
case 2:
usa_oggetto();
break;
if (sm!=1||sm!=2) {
printf("Opzione non valida" );
}
}
}while(sm !=1 || sm !=2);
--mosse_a_disposizione_Ciccio;
if (Ciccio.stato==0) {
printf("Ciccio è morto........ha vinto Ninja ! " );
++vittoriaNinja;
int scelta1;
do{
printf("Cosa vuoi fare?\n " );
printf(" 1. Torna al menù principale.\n 2. Termina gioco ed accedi alle statistiche giocatori. \n ");
scanf("%d\n" , &scelta1 );
switch(scelta1){
case 1:
crea_mappa();
break;
case 2:
termina_gioco();
break;
if (scelta1!=1||scelta1!=2) {
printf("Opzione non valida" );
}
}while(scelta1 !=1 || scelta1 != 2);
}
if (mosse_a_disposizione==0) {
turnoNinja();
}
turni_passati=turni_passati + 0.5 ;
*/
}
void turnoNinja(){
/*
printf("Ninja è il tuo turno !\n Scegli cosa fare! \n");
int ms;
do{
printf("Premi:\n 1. Per muoverti \n 2. Per usare un oggetto" );
scanf("%d\n" , &ms );
switch(ms){
case 1:
muovi();
break;
case 2:
usa_oggetto();
break;
if (ms!=1||ms!=2) {
printf("Opzione non valida" );
}
}while(ms !=1 || ms !=2);
--mosse_a_disposizione_Ninja;
if (Ninja.stato==0) {
printf("Ninja è morto........ha vinto Ciccio ! " );
++vittoriaCiccio;
int scelta2;
do{
printf("Cosa vuoi fare?\n " );
printf(" 1. Torna al menù principale.\n 2. Termina gioco ed accedi alle statistiche giocatori. \n ");
scanf("%d\n" , &scelta2 );
switch(scelta2){
case 1:
crea_mappa();
break;
case 2:
termina_gioco();
break;
if (scelta2!=1||scelta2!=2) {
printf("Opzione non valida" );
}
}while(scelta2 !=1 || scelta2 !=2); }
if (mosse_a_disposizione==0) {
turnoCiccio();
}
turni_passati=turni_passati + 0.5 ;
*/
}
void usa_oggetto(){
/*
if (mosse_a_disposizione_Ninja==1) {
printf("Ninja, questo è cosa contiene il tuo zaino\n" );
printf("\n Il tuo stato è : %c " Ninja.stato );
printf("\t | MEDIKIT | x %d |\n",Ninja.zaino[medikit]);
printf("\t | POZIONE | x %d |\n",Ninja.zaino[pozione]);
printf("\t | MATERIALE | x %d |\n",Ninja.zaino[materiale]);
printf("\t | COLPI LANCIARAZZI | x %d |\n",Ninja.zaino[colpi_lanciarazzi]);
do {
printf("Scegli quale oggetto utilzzare ......\n" );
printf("\t Premi '1' per USARE IL MEDIKIT \n\t Premi '2' per EQUIPAGGIARE LO SCUDO \n\t Premi '3' per USARE IL MATERIALE\t Premi '4' per USARE COLPI RAZZO \n\t \n" );
scanf("%d", &scelta3 );
switch (scelta3) {
case 1: if (Ninja.zaino[medikit]>=1) {
if (Ninja.stato==vulnerabile) {
Ninja.stato==solo_vita
} else if (Ninja.stato==solo_scudo) {
Ninja.stato==scudo_vita
} else {
printf("I tuoi punti vita sono già al massimo!\n" );
return(usa_oggetto)
}
} else { printf("Non puoi usare questo oggetto....\n" );
return(usa_oggetto)
}
case 2: if (Ninja.zaino[medikit]>=1) {
if (Ninja.stato==vulnerabile) {
Ninja.stato==solo_scudo
} else if (Ninja.stato==solo_vita) {
Ninja.stato==solo_scudo
} else {
printf("Hai già lo scudo equipaggiato!\n", );
return(usa_oggetto)
}
}else printf("Non puoi usare questo oggetto....\n" );
return(usa_oggetto)
}
case 3:
case 4:
case 5:
// } while(/* condition */
/*
/////////////////
} else {
printf("Ciccio questo è cosa contiene il tuo zaino\n" );
printf("\t | MEDIKIT | x %d |\n",Ciccio.zaino[medikit]);
printf("\t | POZIONE | x %d |\n",Ciccio.zaino[pozione]);
printf("\t | MATERIALE | x %d |\n",Ciccio.zaino[materiale]);
printf("\t | COLPI LANCIARAZZI | x %d |\n",Ciccio.zaino[colpi_lanciarazzi]);
*/
}
void muovi(){
/* int direzione;
do {
printf("\nIn che direzione vuoi muoverti?\n 1.Per muoverti a nord \n 2.Per muoverti a sud \n 3.Per muoverti ad est \n 4.Per muoverti ad ovest \n " );
scanf("%d",&direzione );
switch (direzione) {
case 1:
case 2:
case 3:
case 4:
if (direzione!=1||direzione!=2||direzione!=3||direzione!=4) {
printf("Comando errato , riprova......\n" );
}
}
} while(direzione!=1||direzione!=2||direzione!=3||direzione!=4);
*/
}