#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define COSTANTE 20
#define RIGHE 8
#define COLONNE 8
struct gioc{
char giocatore[COSTANTE];
int flagCasa;
int turnoCasa;
int tiri;
} giocatori[4];
void inizioGioco();
void compilaVariabili();
void fase2();
void domanda();
void lancioDado();
void speciali();
void casa();
void pozzo();
void prigione();
void oca();
void ponte();
void labirinto();
void superato();
void vittoria();
void nuovaPartita();
char risposta;
int turno;
int numeroGiocatori;
int dado;
int i;
int j;
int r;
int c;
int flagVittoria;
main()
{
printf("Gioco Dell\'Oca\n");
// Cilo per rendere il gioco infinito
while (1){
inizioGioco();
// Controllo vittoria
while(giocatori[i].tiri < 63){
if(flagVittoria == 0){
fase2();
// Ciclo for per far giocare i vari giocatori
for (i=0; i<numeroGiocatori; i++){
domanda();
// Controllo che il flag che controlla le caselle speciali sia attivo o meno
if (giocatori[i].flagCasa == 1){
speciali();
}
else{//Se il flag casa è positivo
lancioDado();
speciali();
// Stampa posizione
printf("%s si trova nella casella %d\n\n",giocatori[i].giocatore,giocatori[i].tiri);
}
if (giocatori[i].tiri == 63){// Controllo vittoria
vittoria();
}
}
}
else{
break;
}
}
nuovaPartita();
}
system("pause");
return 0;
}
/*inizioGioco()
funzione che svolge le fasi preliminari del gioco, facendo scegliere il numero dei giocatori, compreso tra un minimo di 2 giocatori
e un massimo variabile in base ad una costante precedentemente dichiarata.
in caso di numero di giocatori non immesso, oppure minore o maggiore del dovuto, fa ripetere l'operazione, in caso di pressione del
tasto - fa uscire dal gioco*/
void inizioGioco()
{
char numeroGiocatori1;
turno = 1;
flagVittoria = 0;
do{
printf("Inserire il numero di giocatori e premere INVIO (Min 2, Max %d): ", COSTANTE);
fflush(stdin);
scanf("%c", &numeroGiocatori1);
if(numeroGiocatori1 != '-'){
numeroGiocatori = numeroGiocatori1-48;
if (numeroGiocatori > COSTANTE){
printf("Si prega di inserire un numero di giocatori minore di %d\n", COSTANTE);
}
else if(numeroGiocatori<2){
printf("Si prega di inserire almeno 2 giocatori\n");
}
}
else{
exit(0);
}
}while(numeroGiocatori<2 || numeroGiocatori>COSTANTE);
// Compilazione delle variabili
compilaVariabili();
}
/*compilaVariabili
funzione che si occupa di compilare tutte le variabili relative ai vari giocatori, per quanto riguarda il nome dei giocatori,
in caso di nome non immesso, o uguale a quello di un'altro giocatore, fa ripetere l'immissione*/
void compilaVariabili()
{
char ch;
for (i=0; i<numeroGiocatori; i++){
printf("\nInserisci un nome per il Giocatore %d (massimo %d caratteri),\npremi INVIO per confermare o - per uscire:\n", i+1, COSTANTE);
c=0;
do{
while((ch=getche()) != '\n' && ch != '\r' && c<COSTANTE){
if (ch == '-'){
exit(0);
system("pause");
}
giocatori[i].giocatore[c++] = ch;
}
if(c==0){
printf("Non hai inserito alcun nome per il giocatore %d\n", i+1);
}
for(j=i-1;j>=0;j--){
if(strcmp(giocatori[i].giocatore,giocatori[j].giocatore)==0){
printf("Hai inserito lo stesso nome di un altro giocatore, riprova!\n");
j=-1;
c=0;
}
}
}while(c==0);
giocatori[i].giocatore[c] = '\0';
giocatori[i].flagCasa = 0;
giocatori[i].tiri = 0;
giocatori[i].turnoCasa = 0;
}
}
/*fase2()
funzione entro la quale viene svolta la stampa del turno e del campo di gioco con la posizione dei giocatori*/
void fase2()
{
printf("Turno %d\n", turno);
turno++;
//Stampa campo
int flagCiclo=0;
int numero = 0;
int campo[RIGHE][COLONNE];
//Creazione campo
for (r=0; r<RIGHE; r++){
for (c=0; c<COLONNE; c++){
campo[r][c] = numero;
++numero;
}
}
//Stampa Campo
for (r=0; r<RIGHE; r++){
printf("\n");
for (c=0; c<COLONNE; c++){
for (i=0; i<numeroGiocatori; i++){
if (giocatori[i].tiri == campo[r][c]){
printf("%7s", giocatori[i].giocatore);
flagCiclo=1;
}
else if(i==numeroGiocatori-1&&flagCiclo==0){
printf("%7d", campo[r][c]);
}
}
flagCiclo=0;
}
}
}
/*domanda
funzione che chiede ogni turno se il giocatore vuole continuare il gioco o uscire*/
void domanda()
{
do{
printf("\n");
printf("Tocca a %s\nCominciare il turno o uscire? (C/E)\n", giocatori[i].giocatore);
fflush(stdin);
scanf("%c", &risposta);
if(risposta == 'C' || risposta == 'c'){
printf("%s inizia!\n", giocatori[i].giocatore);
return;
}
else if(risposta == 'E' || risposta == 'e'){
exit(1);
}
else{
printf("Il carattere inserito e' diverso sia da C che da E, si prega di riprovare\n");
}
}while(risposta != 'E' || risposta != 'e' || risposta != 'C' || risposta != 'c');
}
/*lancioDado
funzione che viene utilizzata per ricreare il lancio di un dado*/
void lancioDado()
{
dado = 0;
srand(time(NULL));
dado = rand() % 6;
dado++;
printf("Il lancio del dado ha prodotto la faccia %d\n",dado);
// Spostamento giocatore
giocatori[i].tiri = giocatori[i].tiri + dado;
}
/*speciali
Funzione che controlla se un giocatore sia finito o meno in una casella speciale e lo reindirizza alla funzione corrispondente alla casella*/
void speciali()
{
//Controllo casella Casa
if (giocatori[i].tiri == 19){
casa();
}
else if(giocatori[i].tiri == 39){//Controllo casella pozzo
pozzo();
}
else if (giocatori[i].tiri == 52){//Controllo casella prigione
prigione();
}
//Controllo caselle oca
for(r=5; r<63; r=r+9){
for(c=9; c<63; c=c+9){
if(giocatori[i].tiri == r || giocatori[i].tiri ==c){
oca();
}
}
}
if (giocatori[i].tiri == 6){//Controllo casella Il Ponte
ponte();
}
else if (giocatori[i].tiri == 42){// Controllo casella Labirinto
labirinto();
}
else if (giocatori[i].tiri > 63){// Controllo eccedenza
superato();
}
}
/*casa
funzione che, in caso si finisca nella casella casa attiva un contatore di turni da passare dentro la casella, e finiti questi
libera il giocatore prigioniero*/
void casa()
{
giocatori[i].flagCasa = 1;
printf("Casella %d\nCasella speciale La Casa\nCi rimani 3 turni!\n", giocatori[i].tiri);
++giocatori[i].turnoCasa;
if (giocatori[i].turnoCasa == 4){
printf("Al prossimo turno sei libero dalla casa!\n");
giocatori[i].turnoCasa = 0;
giocatori[i].flagCasa = 0;
}
else{
printf("Hai ancora %d turni nella Casa!\n", 4-giocatori[i].turnoCasa);
}
}
/*pozzo
funzione che controllo i giocatori finiti nella casella pozzo, nel caso ci finisca un giocatore lo tiene dentro la casella
fino a quando qualcuno non prende il suo posto*/
void pozzo()
{
giocatori[i].flagCasa = 1;
printf("Casella %d\nCasella speciale Il Pozzo!\nCi rimani fino a quando un altro giocatore non prende il tuo posto!\n", giocatori[i].tiri);
for (r=0; r<numeroGiocatori && r!=i; r++){
for (c=numeroGiocatori && c!=i; c>0; c--){
if (giocatori[i].tiri == giocatori[r].tiri || giocatori[i].tiri == giocatori[c].tiri){
printf("Sei libero dal pozzo!\n");
giocatori[i].flagCasa = 0;
}
else{
printf("Sei ancora nel pozzo, ci rimani fino a quando qualcuno non prende il tuo posto!\n");
}
}
}
}
/*prigione
funzione che controllo i giocatori finiti nella casella prigione, nel caso ci finisca un giocatore lo tiene dentro la casella
fino a quando qualcuno non prende il suo posto*/
void prigione()
{
giocatori[i].flagCasa = 1;
printf("Casella %d\nCasella speciale Prigione!\n", giocatori[i].tiri);
for (r=0; r<numeroGiocatori && r!=i; r++){
for (c=numeroGiocatori && c!=i; c>0; c--){
if (giocatori[i].tiri == giocatori[r].tiri || giocatori[i].tiri == giocatori[c].tiri){
printf("Sei fuori dalla prigione!\n");
giocatori[i].flagCasa = 0;
}
else{
printf("Ci rimani fino a quando qualcuno non prende il tuo posto!\n");
}
}
}
}
/*oca
funzione che gestisce le caselle oca facendo avanzare il giocatore finito su una di queste caselle del numero precedentemente fatto
con il lancio dei dadi*/
void oca()
{
printf("Casella %d\nCasella speciale Oca!\n%s si muove nuovamente del tiro prima effettuato!\n",giocatori[i].tiri, giocatori[i].giocatore);
giocatori[i].tiri = giocatori[i].tiri + dado;
if (giocatori[i].tiri == 39 || giocatori[i].tiri == 19 || giocatori[i].tiri == 52){
giocatori[i].flagCasa = 1;
}
//printf("%s si trova nella casella numero %d\n",giocatori[i].giocatore, giocatori[i].tiri);
}
/*ponte
funzione che gestisce la caselle ponte facendo avanzare il giocatore finito su quesae caselle del numero precedentemente fatto
con il lancio dei dadi*/
void ponte()
{
printf("Casella %d\nCasella speciale Il Ponte!\n%s si muove nuovamente del tiro prima effettuato!\n",giocatori[i].tiri, giocatori[i].giocatore);
giocatori[i].tiri = giocatori[i].tiri + dado;
if (giocatori[i].tiri == 39 || giocatori[i].tiri == 19 || giocatori[i].tiri == 52){
giocatori[i].flagCasa = 1;
}
//printf("%s si trova nella casella numero %d\n", giocatori[i].giocatore, giocatori[i].tiri);
}
/*labirinto
funzione che gestisce la casella labirinto, portando il giocatore che ci finisce sopra nuovamente nella casella 1*/
void labirinto()
{
printf("Casella %d\nCasella speciale Labirinto!\n%s ritorna alla casella 39, Il Pozzo!\nRimanici fino a quando qualcuno non prende il tuo posto!\n", giocatori[i].tiri, giocatori[i].giocatore);
giocatori[i].tiri = 39;
giocatori[i].flagCasa = 1;
}
/*superato
funzione che gestisce i lanci del dado che farebero superare la casella 63, facendo tornare indietro un giocatore che con un lancio
supera la casella 63*/
void superato()
{
int eccedenza;
eccedenza = giocatori[i].tiri-63;
giocatori[i].tiri=63-eccedenza;
printf("La casella 63 va raggiunta con un tiro esatto\n%s si trova ora nella casella %d\n", giocatori[i].giocatore, giocatori[i].tiri);
}
/*vittoria
funzione che si attiva in caso di vittoria da parte di un giocatore, e ne dichiara appunto la vittoria, interrompendo così il ciclo
degli altri giocatori*/
void vittoria()
{
printf("Complimenti %s hai vinto!!\n", giocatori[i].giocatore);
flagVittoria = 1;
}
/*nuovaPartita
funzione che permette, una volta finita una partita, di cominciarne una nuova senza dover uscire dal gioco,
o eventualmente, se i giocatori lo desiderano, uscire*/
void nuovaPartita()
{
do{
printf("Giocare una nuova partita? (S/N)\n");
fflush(stdin);
scanf("%c", &risposta);
if (risposta == 'S' || risposta == 's'){
printf("Si ricomincia\n");
return;
}
else if (risposta == 'N' || risposta == 'n'){
exit(1);
}
else{
printf("Il carattere inserito e' diverso sia da S che da N, si prega di riprovare\n");
}
}while (risposta != 'N' || risposta != 'n' || risposta != 'S' || risposta != 's');
}