giovedì 23 ottobre 2008

La PIRAMIDE ROVESCIATA

Buonasera (o meglio, buonanotte) a tutti i frequenti visitatori del mio blog.

Molto probabilmente, caro lettore, sei entrato nel blog per sgraffignare l'algoritmo del programma che ci è stato assegnato, ma credo che sia un po' tardi per mettersi a comprendere questo sorgente.
Comunque, mentre scrivo queste righe il mio orologio segna le 15:38...cioè l'intervento lo preparo, ma che sò così fesso da pubblicarlo subito, così tutti copiano? E no...

Questa volta, il sorgente che tra poco vi presenterò è inerente un giochino sconosciuto al 99% di noi giovani, che io ho chiamato "LA PIRAMIDE ROVESCIATA". Questo consiste in una piramide rivolta verso il basso (appunto), formata da simboli "". Lo scopo del gioco è barrare uno o più "" presenti su una riga, con lo scopo di lasciare l'avversario (in questo caso il pc) con un solo "" da barrare. Perde il giocatore che si ritrova da barrare l'ultimo "" residuo.

In questo caso, il pc risponde con una mossa semplicissima: barra soltanto la prima casella che ancora non è stata barrata.

Il gioco presenta la seguente interfaccia:







Ed ora, ecco il tanto atteso sorgente (come al solito farcito e stracondito di commenti) :

/*GIOCHINO SCONOSCIUTO, in linguaggio C

written by Doctor Vel, 20/10/2008, 17:50

finito alle 22:10 del 21/10/2008

Tutti i diritti riservati*/



#include <stdio.h>

char board[16]; /*tavola da gioco contenente i "" oppure i "+". L'array è da 16 elementi perchè sarà la funzione di stampa a provvedere all'allineamento centrale delle 4 righe, evitando così di utilizzare un array da ben 28 caselle*/

char symbol[2]= {'','+'}; /*contiene i due simboli di gioco*/

int i=0;

int gioco_finito=
0; /*quando assume valore 1, il gioco è finito*/

int gioca_ancora=1; /*permette di loopare l'esecuzione del gioco, quando questo finisce*/



/*funzione di stampa*/

void stampa() { /*non vi sono parametri di input, dato che la board è una variabile globale*/

int j;

for(j=
0;j<7;j++) {

printf(
"%c",board[j]); /*le prime 7 caselle le stampo tutte in fila*/

}

printf(
"\n "); /*dopo le prime 7 caselle, vado a capo e lascio uno spazio, perchè la seconda fila di caselle è sfalsata di una posizione rispetto alla prima*/

for(j=7;j<12;j++) {

printf(
"%c",board[j]); /*seconda riga di caselle, tutte in fila*/

}

printf(
"\n "); /*vado a capo e lascio 2 spazi*/

for(j=12;j<15;j++) {

printf(
"%c",board[j]); /*terza riga di caselle, tutte in fila*/

}

printf(
"\n %c",board[15]); /*vado a capo e lascio 3 spazi, quindi stampo l'ultima casella*/

}



/*funzione di azzeramento della board*/

void azzera() {

int y;

for(y=
0;y<16;y++) {

board[y]=symbol[
0]; /*ad ogni casella assegno il simbolo di gioco ""*/

}

}



/*funzione per raccogliere la mossa del giocatore*/

void mossaGiocatore() { /*non restituisce niente perchè utilizza come output un array dichiarato come variabile globale*/

int b;

int casella_inizio=
0; /*inizio dell'intervallo*/

int casella_fine=0; /*fine dell'intervallo*/

int sw=1; /*permette di agevolare la fase di verifica dell'esattezza dell'intervallo di caselle. Quando sw=0, l'intervalloè giusto e si va avanti*/

while(sw==1) {

printf(
"\nImmetti il numero di casella da cui vuoi iniziare a barrare e premi INVIO : ");

scanf(
"%d",&casella_inizio);

printf(
"\nImmetti il numero dell'ultima casella da barrare e premi INVIO : ");

scanf(
"%d",&casella_fine);

if( (casella_inizio>
0)&&(casella_inizio<17) && /*controllo che le caselle facciano davvero parte della board*/

(casella_fine>0)&&(casella_fine<17) &&

(
/*inizio serie di OR*/

( (casella_inizio>0)&&(casella_inizio<8)&&(casella_fine<8) ) /*se la casella di inizio appartiene alla prima riga, anche la casella di fine deve appartenere alla prima riga, cioè deve essere minore di 8*/

( (casella_inizio>7)&&(casella_inizio<13)&&(casella_fine>7)&&(casella_fine<13) ) /*se la casella di inizio appartiene alla seconda riga, anche la casella di fine deve appartenere alla seconda riga, cioè deve essere maggiore di 7 e minore di 13*/

( (casella_inizio>12)&&(casella_inizio<16)&&(casella_fine>12)&&(casella_fine<16) ) /*se la casella di inizio appartiene alla terza riga, anche la casella di fine deve appartenere alla terza riga, cioè deve essere maggiore di 12 e minore di 16*/

( (casella_inizio==16)&&(casella_fine==16) ) /*se seleziono l'ultima casella per barrarla, la casella di inizio deve coincidere con quella della fine*/

) /*fine serie di OR*/

) {

sw=
0; /*parte di controllo della validità*/

}

}

for( b=(casella_inizio-
1);b<casella_fine;b++ ) {

board[b]=symbol[
1]; /*nell'intervallo selezionato, sostituisco il simbolo con il "+"*/

}

}



/*funzione mossa computer*/

void mossaPc() {

int a;

for(a=
0;a<16;a++) {

if(board[a]==
'') {

board[a]=
'+';

break;

}
/*la prima casella che trova ancora non barrata, la barra. Poi esce*/

}

}



/*funzione per vedere quando il gioco è finito*/

int fine_gioco() {

int conta_segni=
0; /*contiene il numero di "" residui*/

int fine=0;

int x;

for(x=
0;x<16;x++) {

if(board[x]==
'') {

conta_segni++;

}

}

if(conta_segni<=
1) {

fine=
1; /*il gioco resta attivo fin quando ci sono rimasti minimo 2 caselle da barrare*/

}

return fine;

}



/*funzione che stampa chi è il vincitore*/

void stampa_vincitore(int vincitore) {

int c;

int conta_barrate=
0;

for(c=
0;c<16;c++) {

if(board[c]==
'+') {

conta_barrate++;

if(conta_barrate==
16) { /*se tutte le caselle sono barrate, il gioco è finito ma non c'è nessun vincitore*/

printf("\nNESSUN VINCITORE...\n");

}

}
/*chiudo la if*/

else { /*cioè se non tutte le 16 caselle sono barrate, ovvero c'è un vincitore*/

vincitore=vincitore-1;

if(vincitore%
2==0) { /*ora stampo chi è il vincitore. Se la mossa vincente ha indice pari, ha vinto il giocatore. Altrimenti, ha vinto il computer*/

printf("\nHAI VINTO !!! =)\n");

}

else {

printf(
"\nHAI PERSO... =(\n");

}

}

}
/*chiudo la for*/

} /*chiudo la funzione*/



/*funzione principale*/

main() {



printf(
"------------- A DOCTOR VEL 2008 PRODUCTION -------------\n\n----- La PIRAMIDE ROVESCIATA -----\n\nQuesto gioco consiste nel barrare il maggior numero di caselle consecutive, sulla stessa riga. Perde il giocatore che si ritrova con una sola casella residua da barrare.\nPer specificare quali caselle si vogliono barrare, bisogna inserire l'intervallo di caselle di tipo DA...A.\nBuon divertimento !!!\n\n");

system(
"PAUSE");

printf(
"\n-------------\n\n");

azzera();

stampa();

printf(
"\n\nQuesta e' la tavola da gioco. I corrispondenti numeri delle caselle sono :\n\n");

printf(
"1 2 3 4 5 6 7\n\n 8 9 10 11 12\n\n 13 14 15\n\n 16\n\n"); /*stampo il numero di ogni casella*/

printf("Ora ti verra' richiesto di inserire l'intervallo di caselle da barrare.\n!!! ATTENZIONE !!! Immetti intervalli di caselle comprendenti la stessa riga !!!\nSe ti viene richiesto di immettere nuovamente l'intervallo, e' perche' hai commesso un errore, quindi controlla meglio e digita nuovamente l'intervallo.\n");

while(gioca_ancora==
1) { /*prima while*/



while(gioco_finito==0) { /*si alternano le mosse finchè rimane soltanto una casella non barrata. A quel punto, il gioco è finito*/

if(i%2==0) { /*ogni 2 volte, tocca al giocatore, che è il primo ad iniziare*/

printf("\nMossa GIOCATORE\n");

mossaGiocatore();

gioco_finito=fine_gioco();

i++;

printf(
"\n");

stampa();

printf(
"\n\n-----------------\n");

}

else {

printf(
"\nMossa COMPUTER\n\n");

mossaPc();

gioco_finito=fine_gioco();

i++;

printf(
"\n");

stampa();

printf(
"\n\n-----------------\n");

}

}

stampa_vincitore(i);

printf(
"\n---------------------------\n\nVuoi giocare di nuovo? (SI=1, NO=2) ");

scanf(
"%d",&gioca_ancora);

if(gioca_ancora==
1) {

azzera();

i=
0;

gioco_finito=
0;

}
/*l'array va riazzerato!*/

} /*chiudo la prima while*/



printf("\n---------------------------\nEnJoY !!! =) (c) Doctor Vel 2008\n\n");

system(
"PAUSE");



}
/*fine main*/








Arvedecce e bonanotte a tutti!

1 commento:

didatticaNatalizi ha detto...

Complimenti. Sei veramente uno studente eccezionale.
Bravo!!!