Ciao a tutti, da poco ho fatto un gioco forza_4 in C, avevo già aperto un altra discussione per dei chiarimenti.
Ora però volevo chiedervi se ci fosse un modo alternativo per poter rendere più fluido lo scorrimento delle pedine nella tabella.
Vi spiego la logica che ho utilizzato: stampare la tabella con la pedina alla prima riga, attendere un pò, poi cancellare e ristamparla alla riga successiva, e cosi via...
Vi allego il codice cosi se volete lo fate girare e capite di cosa sto parlando.
Non so magari ottimizzando la stampa della tabella o qualcos'altro non saprei proprio come fare... perchè l'intera tabella lampeggia ed è bruttissimo
PS: io cancello tutto tramite una system("cls"), magari ce un modo alternativo per cancellare dalla schermata solo la pedina e metterla sotto ma ne dubito fortemente.
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <time.h>
#include <conio.h>
#include <unistd.h>
#include <windows.h>
#include <string.h>
#define TIME 90000
#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;
HANDLE hConsole;
CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
WORD saved_attributes;
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 tab[][N]){
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("| ");
if(tab[i][j]==1)
SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
else if(tab[i][j]==2)
SetConsoleTextAttribute(hConsole, FOREGROUND_GREEN);
printf("%c ",legenda[tab[i][j]]);
SetConsoleTextAttribute(hConsole, saved_attributes);
}
printf("|\n +---+---+---+---+---+---+---+\n");
}
printf(" 1 2 3 4 5 6 7\n");
}
void StampaTabGiocata(int c,int flag){
int i=0,v[N][N][N],x,y;
Remove(c);
while(i<N-1&&pack.tab[i+1][c]==0){
pack.tab[i][c]=flag;
for(x=0;x<N;x++)
for(y=0;y<N;y++)
v[i][x][y]=pack.tab[x][y];
pack.tab[i++][c]=0;
}
for(x=0;x<i;x++){
system("cls");
StampaTab(v[x]);
usleep(TIME);
}
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"
" | 4. Estremo |\n"
" | |\n"
" +-----------------------------------+\n\n"
" Elemento scelto: ");
scanf("%s",a);
i=atoi(a);
}while(i<1||i>4);
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(pack.tab);
do{
printf("%s inserisci colonna: ",gioc[flag]);
scanf("%s",a);
if(strcmp(a,"exit")==0)
return;
c=atoi(a)-1;
}while(Insert(c,UT));
StampaTabGiocata(c,UT);
Check(c);
if(pack.flag!=-1)
break;
system("cls");
StampaTab(pack.tab);
do{
printf("%s inserisci colonna: ",gioc[aflag]);
scanf("%s",a);
if(strcmp(a,"exit")==0)
return;
c=atoi(a)-1;
}while(Insert(c,PC));
StampaTabGiocata(c,PC);
Check(c);
if(pack.flag!=-1)
break;
}
system("cls");
StampaTab(pack.tab);
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(pack.tab);
if(flag==UT){
do{
printf("%s inserisci colonna: ",gioc);
scanf("%s",a);
if(strcmp(a,"exit")==0)
return;
c=atoi(a)-1;
}while(Insert(c,UT));
StampaTabGiocata(c,UT);
}
else {
printf("Loading...");
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(pack.tab);
if(flag==PC){
do{
printf("%s inserisci colonna: ",gioc);
scanf("%s",a);
if(strcmp(a,"exit")==0)
return;
c=atoi(a)-1;
}while(Insert(c,UT));
StampaTabGiocata(c,UT);
}
else{
printf("Loading...");
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(pack.tab);
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(pack.tab);
prof=diff1;
printf("Loading...");
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(pack.tab);
prof=diff2;
printf("Loading...");
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(pack.tab);
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));
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
/*Salva attributi correnti*/
GetConsoleScreenBufferInfo(hConsole, &consoleInfo);
saved_attributes = consoleInfo.wAttributes;
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;
}