Ciao a tutti, avendo tempo da perdere ho fatto un programmino in C che simula il gioco di forza 4.
Il programma è funzionante e se volete darci un occhiata giusto per curiosità ve lo allego:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <time.h>
#include <conio.h>
#include <unistd.h>
#define TIME 10000 /* 0.1 secondi */
#define N 7
#define UT 1
#define PC 2
typedef struct{
int flag;
int row[N];
int tab[N][N];
}Wrap;
int prof;
Wrap pack;
void Init(){
int i,j;
pack.flag=-1;
for(i=0;i<N;i++)
pack.row[i]=N-1;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
pack.tab[i][j]=0;
}
void Remove(int c){
pack.tab[++pack.row[c]][c]=0;
}
int Insert(int c,int val){
if(c<0||c>=N||pack.row[c]<0)
return 1;
pack.tab[pack.row[c]--][c]=val;
return 0;
}
void StampaTab(){
int q=25,i,j;
char legenda[3]={' ','O','X'};
printf("\n\n Forza 4\n"
" %c %c %c %c %c %c %c\n"
" +---+---+---+---+---+---+---+\n",q,q,q,q,q,q,q);
for(i=0;i<N;i++){
printf(" ");
for(j=0;j<N;j++)
printf("| %c ",legenda[pack.tab[i][j]]);
printf("|\n +---+---+---+---+---+---+---+\n");
}
printf(" 1 2 3 4 5 6 7\n");
}
void StampaTabGiocata(int c,int flag){
int i=0,T=8,j;
Remove(c);
while(i<N-1&&pack.tab[i+1][c]==0){
pack.tab[i][c]=flag;
system("cls");
StampaTab();
for(j=0;j<T;j++)
usleep(TIME);
pack.tab[i++][c]=0;
system("cls");
StampaTab();
}
Insert(c,flag);
}
void Check(int c){
int i,j,r=pack.row[c]+1,flag;
for(i=0,flag=0;i<N;i++){
if(pack.tab[r][i]==pack.tab[r][c])
flag++;
else
flag=0;
if(flag==4){
pack.flag=pack.tab[r][c];
return;
}
}
for(i=0,flag=0;i<N;i++){
if(pack.tab[i][c]==pack.tab[r][c])
flag++;
else
flag=0;
if(flag==4){
pack.flag=pack.tab[r][c];
return;
}
}
for(i=r-3,j=c-3,flag=0;i<N&&j<N;i++,j++)
if(i>=0&&j>=0){
if(pack.tab[i][j]==pack.tab[r][c])
flag++;
else
flag=0;
if(flag==4){
pack.flag=pack.tab[r][c];
return;
}
}
for(i=r-3,j=c+3,flag=0;i<N&&j>=0;i++,j--)
if(i>=0&&j<N){
if(pack.tab[i][j]==pack.tab[r][c])
flag++;
else
flag=0;
if(flag==4){
pack.flag=pack.tab[r][c];
return;
}
}
for(i=0;i<N;i++)
if(pack.row[i]!=-1)
return;
pack.flag=0;
}
void Esplora(int lv,int value,long long int *contUt,long long int *contPc){
int flag,i;
if(lv>=prof)
return;
if(value==UT)
flag=PC;
else
flag=UT;
for(i=0;i<N;i++){
if(!Insert(i,value)){
Check(i);
if(pack.flag==UT){
(*contUt)+=pow(7,prof-lv);
pack.flag=-1;
Remove(i);
}
else if(pack.flag==-1){
Esplora(lv+1,flag,contUt,contPc);
Remove(i);
}
else{
(*contPc)+=pow(7,prof-lv);
pack.flag=-1;
Remove(i);
return;
}
}
}
}
int Intel(int flag){
int i,c=0,aflag;
long long int contUt,contPc,meglioUt,meglioPc;
if(flag==UT){
aflag=PC;
meglioPc=LONG_LONG_MAX;
meglioUt=LONG_LONG_MIN;
}
else{
aflag=UT;
meglioUt=LONG_LONG_MAX;
meglioPc=LONG_LONG_MIN;
}
for(i=0;i<N;i++)
if(!Insert(i,flag)){
contUt=0;
contPc=0;
Check(i);
if(pack.flag==flag){
Remove(i);
pack.flag=-1;
return i;
}
pack.flag=-1;
Esplora(0,aflag,&contUt,&contPc);
if((flag==PC&&(contUt<meglioUt||(contUt==meglioUt&&contPc>meglioPc)))||(flag==UT&&(contPc<meglioPc||(contPc==meglioPc&&contUt>meglioUt)))){
meglioUt=contUt;
meglioPc=contPc;
c=i;
}
Remove(i);
}
return c;
}
int StampaSchermataPrincipale(){
char a[10];
int i;
do{
system("cls");
printf(" By Nanni \n\n"
" Benvenuto!! A Forza 4\n"
" +-----------------------------------+\n"
" | |\n"
" | |\n"
" | 1. Nuova Partita |\n"
" | |\n"
" | |\n"
" | 2. Modalita' gioco |\n"
" | |\n"
" | |\n"
" | 3. Istruzioni |\n"
" | |\n"
" | |\n"
" | 4. Esci |\n"
" | |\n"
" | |\n"
" +-----------------------------------+\n\n"
" Elemento scelto: ");
scanf("%s",a);
i=atoi(a);
}while(i<1||i>4);
return i;
}
void StampaIstruzioni(){
system("cls");
printf("\n Istruzioni!\n"
" +----------------------------------------------------+\n"
" | 1.Lo scopo del gioco e' riuscire ad allineare |\n"
" | |\n"
" | quattro pedine dello stessa forma O per l'utente |\n"
" | |\n"
" | e X per il calcolatore, nella scacchiera di gioco |\n"
" | |\n"
" | sia in verticale, orizzontale o obliquo. |\n"
" | |\n"
" | 2.Vince la partita chi allinea per primo in |\n"
" | |\n"
" | orizzontale, verticale o obliquo quattro pedine |\n"
" | |\n"
" | della stessa forma. |\n"
" | |\n"
" | 3.Nel caso nessuno dei due partecipanti al gioco |\n"
" | |\n"
" | riuscisse a fare (quattro) la partita finisce |\n"
" | |\n"
" | in parita' e se ne comincia un'altra. |\n"
" +----------------------------------------------------+\n\n"
"Per tornare al menu' principale premere un tasto qualsiasi !! ");
getch();
}
int ImpostaModalita(){
int i;
char a[10];
do{
system("cls");
printf("\n\n\n Impostazioni modalita' \n"
" +-----------------------------------+\n"
" | |\n"
" | 1. Utente VS Utente |\n"
" | |\n"
" | 2. Utente VS Pc |\n"
" | |\n"
" | 3. Pc VS Pc |\n"
" | |\n"
" +-----------------------------------+\n\n"
" Elemento scelto: ");
scanf("%s",a);
i=atoi(a);
}while(i<1||i>3);
return i;
}
int ImpostaDifficolta(){
char a[10];
int i;
do{
system("cls");
printf("\n\n\n Impostazione difficolta'\n"
" +-----------------------------------+\n"
" | |\n"
" | 1. Facile |\n"
" | |\n"
" | 2. Medio |\n"
" | |\n"
" | 3. Difficile |\n"
" | |\n"
" +-----------------------------------+\n\n"
" Elemento scelto: ");
scanf("%s",a);
i=atoi(a);
}while(i<1||i>3);
return i;
}
void ModeUtUt(){
char gioc[2][80],a[10];
int flag,c,aflag;
system("cls");
printf("Nome del primo giocatore: ");
scanf("%s",gioc[0]);
printf("Nome del secondo giocatore: ");
scanf("%s",gioc[1]);
flag=rand()%2;
if(flag)
aflag=0;
else
aflag=1;
while(1){
system("cls");
StampaTab();
do{
printf("%s inserisci colonna: ",gioc[flag]);
scanf("%s",a);
c=atoi(a)-1;
}while(Insert(c,UT));
StampaTabGiocata(c,UT);
Check(c);
if(pack.flag!=-1)
break;
system("cls");
StampaTab();
do{
printf("%s inserisci colonna: ",gioc[aflag]);
scanf("%s",a);
c=atoi(a)-1;
}while(Insert(c,PC));
StampaTabGiocata(c,PC);
Check(c);
if(pack.flag!=-1)
break;
}
system("cls");
StampaTab();
switch(pack.flag){
case 1:
printf("Il vincitore e': %s.\n\n",gioc[flag]);
break;
case 2:
printf("Il vincitore e': %s.\n\n",gioc[aflag]);
break;
default:
printf("Pareggio.\n\n");
break;
}
printf("Premere un tasto qualsiasi per tornare al menu' principale !!");
getch();
}
void ModeUtPc(int diff){
char gioc[80],a[10];
int flag,c;
prof=diff*2;
system("cls");
printf("Nome del giocatore: ");
scanf("%s",gioc);
flag=rand()%2+1;
while(1){
system("cls");
StampaTab();
if(flag==UT){
do{
printf("%s inserisci colonna: ",gioc);
scanf("%s",a);
c=atoi(a)-1;
}while(Insert(c,UT));
StampaTabGiocata(c,UT);
}
else {
if(Insert(c=Intel(PC),PC)){
printf("Errore fatale.\n");
system("PAUSE");
return;
}
StampaTabGiocata(c,PC);
}
Check(c);
if(pack.flag!=-1)
break;
system("cls");
StampaTab();
if(flag==PC){
do{
printf("%s inserisci colonna: ",gioc);
scanf("%s",a);
c=atoi(a)-1;
}while(Insert(c,UT));
StampaTabGiocata(c,UT);
}
else {
if(Insert(c=Intel(PC),PC)){
printf("Errore fatale.\n");
system("PAUSE");
return;
}
StampaTabGiocata(c,PC);
}
Check(c);
if(pack.flag!=-1)
break;
}
system("cls");
StampaTab();
switch(pack.flag){
case UT:
printf("Il vincitore e': %s.\n\n",gioc);
break;
case PC:
printf("Il vincitore e': Computer.\n\n");
break;
default:
printf("Pareggio.\n\n");
break;
}
printf("Premere un tasto qualsiasi per tornare al menu' principale !!");
getch();
}
void ModePcPc(int diff1,int diff2){
int c;
diff1=diff1*2;
diff2=diff2*2;
while(1){
system("cls");
StampaTab();
prof=diff1;
if(Insert(c=Intel(UT),UT)){
printf("Errore fatale.\n");
system("PAUSE");
return;
}
StampaTabGiocata(c,UT);
Check(c);
if(pack.flag!=-1)
break;
system("cls");
StampaTab();
prof=diff2;
if(Insert(c=Intel(PC),PC)){
printf("Errore fatale.\n");
system("PAUSE");
return;
}
StampaTabGiocata(c,PC);
Check(c);
if(pack.flag!=-1)
break;
}
system("cls");
StampaTab();
if(diff1==diff2){
switch(pack.flag){
case 1:
printf("Il vincitore e' il primo giocatore.\n\n");
break;
case 2:
printf("Il vincitore e'il secondo giocatore.\n\n");
break;
default:
printf("Pareggio.\n\n");
break;
}
}
else
switch(pack.flag){
case 1:
printf("Il vincitore e' difficolta' %d.\n\n",diff1/2);
break;
case 2:
printf("Il vincitore e': difficolta' %d.\n\n",diff2/2);
break;
default:
printf("Pareggio.\n\n");
break;
}
printf("Premere un tasto qualsiasi per tornare al menu' principale !!");
getch();
}
int main(){
int flag,mode=0;
srand(time(NULL));
while(1){
flag=StampaSchermataPrincipale();
switch(flag){
case 1:
if(!mode)
mode=ImpostaModalita();
Init();
switch(mode){
case 1:
ModeUtUt();
break;
case 2:
ModeUtPc(ImpostaDifficolta());
break;
case 3:
ModePcPc(ImpostaDifficolta(),ImpostaDifficolta());
break;
}
mode=0;
break;
case 2:
mode=ImpostaModalita();
break;
case 3:
StampaIstruzioni();
break;
case 4:
return 0;
}
}
return 0;
}
La mia domanda è: per poterlo rendere più comprensibile e carino sarebbe possibile cambiale il colore dei caratteri ('O','X') ? "che sarebbero le pedine del gioco".
Utilizzo codeblocks e sistema operativo windows.... non so magari con qualche libreria windows ?? non ho necessità di portabilità.
Grazie