DOMANDA Sudoku in C, modifica colori inseriti dal giocatore

Pubblicità

sandro berdini

Nuovo Utente
Messaggi
4
Reazioni
0
Punteggio
1
salve a tutti, vorrei chiedere se qualcuno conosce un modo per cambiare il colore in un singolo elemento di una tabella in c fatta con le matrici…
ad esempio in un sudoku come posso colorare in un modo i numeri iniziali e in un altro modo quelli inseriti dal giocatore?
 
Ciao e benvenuto!

Bhe, mi sembrano un pò poche le informazioni per poterti rispondere... dovresti dirci qualcosa di più, non sappiamo nemmeno se usi una GUI e quale libreria stai utilizzando.

Pubblica il codice, così possiamo vedere ciò che hai fatto, utilizzando il tag CODE. Qui c'è anche il regolamento della sezione.


EDIT: ho anche modificato il titolo.
 
questo è ciò che ho fatto per ora ma è ancora incompleto

C:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<stdbool.h>
#include<windows.h>
#include<conio.h>
#include <unistd.h>
void SetColor (unsigned short color)
    {
        HANDLE hCon=GetStdHandle (STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(hCon, color);
    }
    
    void COMPARE(int m[9][9],int CON[9][9])
{ int i,j;
    for(i=0;i<9;i++)
    {
        for(j=0;j<9;j++)
        {
            if(m[i][j]!=CON[i][j])
            {
                SetColor(4);
                printf("\nr: %i ; c: %i ERROR\n");
                SetColor(15);
            }
        }
            
    }
}

void cursoroff () 
    {
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO CCI;
    GetConsoleCursorInfo(hOut, &CCI);
    CCI.bVisible = false;
    SetConsoleCursorInfo(hOut, &CCI);
    }
void gotoxy( int column, int line ){
  COORD coord;
  coord.X = column;
  coord.Y = line;
  SetConsoleCursorPosition(
    GetStdHandle( STD_OUTPUT_HANDLE ),
    coord);
    }
void TITOLO();
int scelta();
void FACILE();
void MEDIO();
void EXTREME();
void CONTROLLO(int c[9][9],int N);
void CARICA(int m[9][9],int numeri);
void COPIATABELLA(int m[9][9],int copia[9][9]);
void SUDOKU(int m[9][9],int numeri,int copia [9][9],int CON[9][9] );
void TABELLA(int m[9][9],int copia[9][9]);
void COMPARE(int m[9][9],int CON[9][9]);

int main()
{    int i,j,n,difficolta;
    gotoxy(52,8);
    printf("BENVENUTI NEL : ");
    TITOLO();
    difficolta=scelta();
    if(difficolta==1)
    {
        FACILE();
    }
    else if(difficolta==2)
    {
        MEDIO();
        
    }
    else if (difficolta==3)
    {
        EXTREME();
    }
    
}
void FACILE()
{    int M[9][9],NUM,C[9][9],n,COPIA[9][9],controllo[9][9];
    CARICA(M,NUM);
    CONTROLLO(C,n);
    TABELLA(M,COPIA);
    COPIATABELLA(M, COPIA);
    SUDOKU(M,NUM,COPIA,controllo);        
}
void MEDIO()
{
    
}
void EXTREME()
{
    
}
void CARICA(int m[9][9],int numeri)
{    int i,j,N;

    numeri=0;
    FILE *fr;
    srand(time(NULL));
    N=1;
       if (N==0)
   {
         fr=fopen("input0.txt","r");
   }
   else
    if (N==1)
    {
          fr=fopen("input1.txt","r");
    }
    else
    if (N==2)
    {
          fr=fopen("input2.txt","r");
    }
    else
    if (N==3)
    {
          fr=fopen("input3.txt","r");
    }
    else
    if (N==4)
    {
          fr=fopen("input4.txt","r");
    }
    else
    if (N==5)
    {
          fr=fopen("input5.txt","r");
    }
    else
    if (N==6)
    {
          fr=fopen("input6.txt","r");
    }
    else
    if (N==7)
    {
          fr=fopen("input7.txt","r");
    }
    else
    if (N==8)
    {
          fr=fopen("input8.txt","r");
    }
    else
    if (N==9)
    {
          fr=fopen("input9.txt","r");
    }
    else
    if (N==10)
    {
          fr=fopen("input10.txt","r");
    }
    if (N==11)
   {
         fr=fopen("input11.txt","r");
   }
   else
    if (N==12)
    {
          fr=fopen("input12.txt","r");
    }
    else
    if (N==13)
    {
          fr=fopen("input13.txt","r");
    }
    else
    if (N==14)
    {
          fr=fopen("input14.txt","r");
    }
    else
    if (N==15)
    {
          fr=fopen("input15.txt","r");
    }
    else
    if (N==16)
    {
          fr=fopen("input16.txt","r");
    }
    else
    if (N==17)
    {
          fr=fopen("input17.txt","r");
    }
    else
    if (N==18)
    {
          fr=fopen("input18.txt","r");
    }
    else
    if (N==19)
    {
          fr=fopen("input19.txt","r");
    }
    else
    if (N==20)
    {
          fr=fopen("input20.txt","r");
    }
    else
    if (N==21)
    {
          fr=fopen("input21.txt","r");
    }
    if (N==22)
   {
         fr=fopen("input22.txt","r");
   }
   else
    if (N==23)
    {
          fr=fopen("input23.txt","r");
    }
    else
    if (N==24)
    {
          fr=fopen("input24.txt","r");
    }
    else
    if (N==25)
    {
          fr=fopen("input25.txt","r");
    }
    else
    if (N==26)
    {
          fr=fopen("input26.txt","r");
    }
    else
    if (N==27)
    {
          fr=fopen("input27.txt","r");
    }
    else
    if (N==28)
    {
          fr=fopen("input28.txt","r");
    }
    else
    if (N==29)
    {
          fr=fopen("input29.txt","r");
    }
    else
    if (N==30)
    {
          fr=fopen("input30.txt","r");
    }
    else
    if (N==31)
    {
          fr=fopen("input31.txt","r");
    }
    else
    if (N==32)
    {
          fr=fopen("input32.txt","r");
    }
   for(i=0;i<9;i++)
   {
           for(j=0;j<9;j++)
           {
           fscanf(fr,"%i",&m[i][j]);
           numeri++;
       }
   }

    
}
void CONTROLLO(int CON[9][9], int N)
 {
     int i,j;
    FILE *fr;
    N==1;
   if (N==0)
   {
         fr=fopen("control0.txt","r");
   }
   else
    if (N==1)
    {
          fr=fopen("control1.txt","r");
    }
    else
    if (N==2)
    {
          fr=fopen("control2.txt","r");
    }
    else
    if (N==3)
    {
          fr=fopen("control3.txt","r");
    }
    else
    if (N==4)
    {
          fr=fopen("control4.txt","r");
    }
    else
    if (N==5)
    {
          fr=fopen("control5.txt","r");
    }
    else
    if (N==6)
    {
          fr=fopen("control6.txt","r");
    }
    else
    if (N==7)
    {
          fr=fopen("control7.txt","r");
    }
    else
    if (N==8)
    {
          fr=fopen("control8.txt","r");
    }
    else
    if (N==9)
    {
          fr=fopen("control9.txt","r");
    }
    else
    if (N==10)
    {
          fr=fopen("control10.txt","r");
    }
    else
    if (N==11)
   {
         fr=fopen("control11.txt","r");
   }
   else
    if (N==12)
    {
          fr=fopen("control12.txt","r");
    }
    else
    if (N==13)
    {
          fr=fopen("control13.txt","r");
    }
    else
    if (N==14)
    {
          fr=fopen("control14.txt","r");
    }
    else
    if (N==15)
    {
          fr=fopen("control15.txt","r");
    }
    else
    if (N==16)
    {
          fr=fopen("control16.txt","r");
    }
    else
    if (N==17)
    {
          fr=fopen("control17.txt","r");
    }
    else
    if (N==18)
    {
          fr=fopen("control18.txt","r");
    }
    else
    if (N==19)
    {
          fr=fopen("control19.txt","r");
    }
    else
    if (N==20)
    {
          fr=fopen("control20.txt","r");
    }
    else
    if (N==21)
    {
          fr=fopen("control21.txt","r");
    }
    else
    if (N==22)
   {
         fr=fopen("control22.txt","r");
   }
   else
    if (N==23)
    {
          fr=fopen("control23.txt","r");
    }
    else
    if (N==24)
    {
          fr=fopen("control24.txt","r");
    }
    else
    if (N==25)
    {
          fr=fopen("control25.txt","r");
    }
    else
    if (N==26)
    {
          fr=fopen("control26.txt","r");
    }
    else
    if (N==27)
    {
          fr=fopen("control27.txt","r");
    }
    else
    if (N==28)
    {
          fr=fopen("control28.txt","r");
    }
    else
    if (N==29)
    {
          fr=fopen("control29.txt","r");
    }
    else
    if (N==30)
    {
          fr=fopen("control30.txt","r");
    }
    else
    if (N==31)
    {
          fr=fopen("control31.txt","r");
    }
    else
    if (N==32)
    {
          fr=fopen("control32.txt","r");
    }
   for(i=0;i<9;i++)
   {
           for(j=0;j<9;j++)
           {
           fscanf(fr,"%i",&CON[i][j]);
       }
   }
 }
void TABELLA(int m[9][9],int copia[9][9])
{ int i,j,x=0;
    printf("   0   1   2   3   4   5   6   7   8 ");
    for(i=0;i<9;i++)
    {if(i%3)
    {
    printf ("\n +---+---+---|---+---+---|---+---+---+\n |");    
    }
    else
    printf ("\n *===========|===========|===========*\n |");
          for(j=0;j<9;j++)
          {
        if(m[i][j]==0)
              { printf("   ");
              }
              else
              {  
                     printf(" %i ",m[i][j]);
              }
            
                
              if(j==2 || j==5)
              {
            printf("|");    
        }
        else
        printf("|");  
       }  
    }
    printf("\n *===========|===========|===========*");

}

void COPIATABELLA(int m[9][9],int copia[9][9])
{    int i,j;
    for(i=0;i<9;i++)
    {
        for(j=0;j<9;j++)
        {
            copia[i][j]=m[i][j];
        }
    }
}
 
void SUDOKU(int m[9][9],int numeri,int copia[9][9],int CON[9][9])
{int i,j,r,c,n; 
    do
    {
    numeri=0;
    printf("\nInserisci la riga:");
    scanf("%i",&r);
    printf("Inserisci la colonna:");
    scanf("%i",&c);
    printf("Quale numero vorresti mettere?");
    scanf("%i",&n);
    system("CLS");
    
    if(copia[r][c]==0)
    {
    m[r][c]=n;    
    m[i][j]=m[r][c];
    }
    for(i=0;i<9;i++)
    {
        for(j=0;j<9;j++)
        {
            if(m[i][j]!=0)
            numeri++;
        }
    }
    TABELLA(m, copia);
    }while(numeri!=81);
    COMPARE( m, CON);
}

int scelta()
{    char controllo;
    int selezione=1;
    int scelta=0;
    do{
    system("CLS");
    gotoxy(49,28+selezione);  //selezione c la variabile che segue le frecce su e giu
    printf("%c",(char)26);
    gotoxy(52,8);
    printf("BENVENUTO NEL:\n ");
    TITOLO();
    gotoxy(50,25);
    printf("MENU' DI SCELTA");
     gotoxy(50,29);
    printf("FACILE");
    gotoxy(50,31);
    printf("MEDIO");
    gotoxy(50,33);
    printf("EXTREME");
    controllo=getch();  
    if ((int)controllo==80 && selezione!=5) selezione=selezione+2; //mi muovo con i tasti freccia giu (80) saltando una riga
    if ((int)controllo==72 && selezione!=1) selezione=selezione-2; //o freccia su (72) saltando una riga
    if ((int)controllo==13) scelta=1; //quando clicco invio significa che ho scelto
    }while (scelta!=1);
    system("CLS");
    if (selezione==1) return 1;
    if (selezione==3) return 2;
    if (selezione==5) return 3;
    
}
void TITOLO()
{
    
gotoxy(21,10);
SetColor(170);
printf("000000");
gotoxy(21,11);
printf("00");
gotoxy(21,12);
printf("00");
gotoxy(21,13);
printf("00");
gotoxy(21,14);
printf("00");
gotoxy(21,15);
printf("000000");
gotoxy(25,16);
printf("00");
gotoxy(25,17);
printf("00");
gotoxy(25,18);
printf("00");
gotoxy(25,19);
printf("00");
gotoxy(21,20);
printf("000000");
    
    
gotoxy(29,10);
printf("00");
gotoxy(29,11);
printf("00");
gotoxy(29,12);
printf("00");
gotoxy(29,13);
printf("00");
gotoxy(29,14);
printf("00");
gotoxy(29,15);
printf("00");
gotoxy(29,16);
printf("00");
gotoxy(29,17);
printf("00");
gotoxy(29,18);
printf("00");
gotoxy(29,19);
printf("00");
gotoxy(31,20);
printf("0000000");
gotoxy(38,19);
printf("00");
gotoxy(38,18);
printf("00");
gotoxy(38,17);
printf("00");
gotoxy(38,16);
printf("00");
gotoxy(38,15);
printf("00");
gotoxy(38,14);
printf("00");
gotoxy(38,13);
printf("00");
gotoxy(38,12);
printf("00");
gotoxy(38,11);
printf("00");
gotoxy(38,10);
printf("00");

gotoxy(42,10);
printf("0000000");
gotoxy(42,11);
printf("00");
gotoxy(42,12);
printf("00");
gotoxy(42,13);
printf("00");
gotoxy(42,14);
printf("00");
gotoxy(42,15);
printf("00");
gotoxy(42,16);
printf("00");
gotoxy(42,17);
printf("00");
gotoxy(42,18);
printf("00");
gotoxy(42,19);
printf("00");
gotoxy(42,20);
printf("000000000");
gotoxy(49,11);
printf("00");
gotoxy(50,12);
printf("00");
gotoxy(51,13);
printf("00");
gotoxy(52,14);
printf("00");
gotoxy(53,15);
printf("00");
gotoxy(53,16);
printf("00");
gotoxy(52,17);
printf("00");
gotoxy(51,18);
printf("00");
gotoxy(50,19);
printf("00");
gotoxy(49,20);
printf("00");

gotoxy(59,10);
printf("000000");
gotoxy(57,11);
printf("00");
gotoxy(57,12);
printf("00");
gotoxy(57,13);
printf("00");
gotoxy(57,14);
printf("00");
gotoxy(57,15);
printf("00");
gotoxy(57,16);
printf("00");
gotoxy(57,17);
printf("00");
gotoxy(57,18);
printf("00");
gotoxy(57,19);
printf("00");
gotoxy(59,20);
printf("000000");
gotoxy(65,19);
printf("00");
gotoxy(65,18);
printf("00");
gotoxy(65,17);
printf("00");
gotoxy(65,16);
printf("00");
gotoxy(65,15);
printf("00");
gotoxy(65,14);
printf("00");
gotoxy(65,13);
printf("00");
gotoxy(65,12);
printf("00");
gotoxy(65,11);
printf("00");
gotoxy(69,10);
printf("00");
gotoxy(69,11);
printf("00");
gotoxy(69,12);
printf("00");
gotoxy(69,13);
printf("00");
gotoxy(69,14);
printf("00");
gotoxy(69,15);
printf("00");
gotoxy(69,16);
printf("00");
gotoxy(69,17);
printf("00");
gotoxy(69,18);
printf("00");
gotoxy(69,19);
printf("00");
gotoxy(69,20);
printf("00");
gotoxy(70,15);
printf("00");
gotoxy(71,14);
printf("00");
gotoxy(72,13);
printf("00");
gotoxy(73,12);
printf("00");
gotoxy(74,11);
printf("00");
gotoxy(75,10);
printf("00");
gotoxy(70,15);
printf("00");
gotoxy(71,16);
printf("00");
gotoxy(72,17);
printf("00");
gotoxy(73,18);
printf("00");
gotoxy(74,19);
printf("00");
gotoxy(75,20);
printf("00");


gotoxy(79,10);
printf("00");
gotoxy(79,11);
printf("00");
gotoxy(79,12);
printf("00");
gotoxy(79,13);
printf("00");
gotoxy(79,14);
printf("00");
gotoxy(79,15);
printf("00");
gotoxy(79,16);
printf("00");
gotoxy(79,17);
printf("00");
gotoxy(79,18);
printf("00");
gotoxy(79,19);
printf("00");
gotoxy(81,20);
printf("0000000");
gotoxy(88,19);
printf("00");
gotoxy(88,18);
printf("00");
gotoxy(88,17);
printf("00");
gotoxy(88,16);
printf("00");
gotoxy(88,15);
printf("00");
gotoxy(88,14);
printf("00");
gotoxy(88,13);
printf("00");
gotoxy(88,12);
printf("00");
gotoxy(88,11);
printf("00");
gotoxy(88,10);
printf("00");
SetColor(7);
}
 
Ultima modifica da un moderatore:
Per il colore puoi fare come stai già facendo, richiamando la funzione che setta il colore prima della stampa a video. Hai provato in questo modo?

Comunque le funzioni non andrebbero scritte in maiuscolo, così come le variabili. Ho visto a colpo d'occhio qualche errore, un pò troppi per un codice così lungo... ho il sospetto non sia mai stato compilato, o che se lo è stato ci sono poi errori in seguito.

Per dire, a CONTROLLO() passi la variabile 'n', che non è stata inizializzata, quindi non verranno eseguiti gli IF di quella funzione e "fr" sarà non inizializzato (non avrai un handle, quindi dovresti avere errore in lettura).
In questa stessa funzione stai bypassando, penso per test, il valore di N (che ripeto, non andrebbe in maiuscolo) ma appunto, non essendo stata inizializzata la variabile da parte del chiamante non entrerai in nessuno degli IF. Il bypass a cui mi riferisco è N==1;, che è sbagliato in quanto non stai assegnando ma facendo una comparazione (quindi appunto, il valore di N non cambia).

Anche la selezione dei file potresti rivederla, rimuovendo tutti quegli if. ?
 
Se uso la funzione SetColor il programma colora tutta la tabella e non solo i numeri che mi interessano.
Il programma è fatto un po' male perché ora mi sto concentrando sul testare se funzionano la tabella e l'inserimento dei numeri.
N dovrebbe avere valore 1 perché sto prendendo in esempio un solo file, più avanti assegnerò un numero random da 0 a 32
 
Ciao, ma il programma di preciso in cosa consiste? E' un risolutore oppure consente semplicemente all'utente di giocare sfruttando uno schema la cui soluzione è da considerarsi nota?
 
É un programma che permette all’utilizzatore di giocare a sudoku con schede e soluzioni pre impostate
--- i due messaggi sono stati uniti ---
avrei anche un’altra domanda, dato che vorrei sfoltire un po’ il programma togliendo tutti gli if: c’è un modo che mi permetta di leggere una cosa del tipo “input.n” in cui n è una variabile? Non so se mi spiego, vorrei associare una stringa ad una variabile numerica
 
Ultima modifica:
Se uso la funzione SetColor il programma colora tutta la tabella e non solo i numeri che mi interessano.
Il programma è fatto un po' male perché ora mi sto concentrando sul testare se funzionano la tabella e l'inserimento dei numeri.
N dovrebbe avere valore 1 perché sto prendendo in esempio un solo file, più avanti assegnerò un numero random da 0 a 32

L'unica soluzione che mi viene in mente è usare ASCII escape codes . Non tutti i terminali li supportano, verifica bene su wiki e in rete.

Per avere N=1 devi solo correggere togliendo la N. Ma bada bene che quando userai il parametro della funzione dovrai correggere il codice però.
 
Pubblicità
Pubblicità
Indietro
Top