2017-10-07 3 views
0
int main() { 

    struct matrix m; 

    m.rows = 20; 
    m.columns = 20; 

    m.grid = create_grid(m.rows,m.columns,'&'); 

    /* Example animation */ 
    printf("\033[H\033[2J"); 
    for (int i = 0; i < m.columns; i++) { 
     update_matrix(m.grid,10,i,'x'); 

     if (i > 0) { 
      update_matrix(m.grid,10,i-1,'&'); 
     } 
     printf("\033[H\033[2J"); 
     sleep(1); 
     printMatrix(m.grid,m.rows,m.columns); 
    } 



    for (int i = 0; i < m.rows; i++) { 
     free(m.grid[i]); 
    } 
    free(m.grid); 

    return 0; 
} 


void update_matrix(char** grid, int row,int column,char symbol) { 
    grid[row][column] = symbol; 
} 

char** create_grid(int rows, int columns, char symbol) { 

    int i,j; 

    char **grid = malloc(rows * sizeof(char *)); 

    for (i = 0; i < rows; i++) { 
     grid[i] = malloc(columns * sizeof(char)); 
    } 

    for (i = 0; i < rows; i++) { 
     for(j = 0; j < columns; j++) { 
      grid[i][j] = symbol; 
     } 
    } 

    return grid; 
} 

void printMatrix(char** array, int rows, int columns) { 

    for (int i = 0; i < rows; i++) { 
     for (int j = 0; j < columns; j++) { 
      printf("%c",array[i][j]); 
     } 
     printf("\n"); 
    } 
} 

ma méthode d'animation est essentiellement ...mise à jour ascii grid imprimé à l'écran sans grille réimprimer

  • imprimer la matrice
  • mise à jour de la matrice
  • pause
  • clairement la écran
  • réimprimer la matrice

Le problème avec cette méthode d'animation est qu'elle crée un effet de scintillement et je suis sûr que c'est très inefficace. Que puis-je faire pour ne pas avoir à effacer l'écran et réimprimer la matrice entière à chaque fois.

Je cours linux.

Répondre

0

Outre l'utilisation de ncurses, vous pourriez faire

printf("\033%d;%df", row, column); 

pour placer le curseur sur la ligne requise et la colonne (notez que ici, la première ligne est 1 et pas0) au lieu de

printf("\033[H\033[2J"); 

Imprimez la matrice une fois après l'avoir configurée, puis modifiez la matrice affichée lorsque des modifications sont apportées.

Vous pouvez positionner le curseur sur la première ligne et la colonne avant d'imprimer la matrice initiale comme

printf("\033[%d;%df", 1, 1); 

m.grid = create_grid(m.rows,m.columns,'&'); 
printMatrix(m.grid, m.rows, m.columns); 
/* Example animation */ 
for (int i = 0; i < m.columns; i++) { 
    update_matrix(m.grid,10,i,'x'); 

    printf("%c[%d;%df", 0x1B, 10+1, i+1); 
    printf("%c", 'x'); 

    if (i > 0) { 
     update_matrix(m.grid,10,i-1,'&'); 
     printf("%c[%d;%df", 0x1B, 10+1, i-1+1); 
     printf("%c", '&'); 
    } 
    sleep(1); 
    fflush(stdout); 
} 

fflush(stdout); peut être nécessaire pour purger le flux de sortie. Sinon, les modifications écrites à stdout peuvent ne pas apparaître à l'écran au moment où elles sont modifiées.

Mais pour de telles utilisations, ncurses est meilleur.

Jetez un oeil here et au this page wikipedia aussi bien.

+0

mon code matriciel est obsolète. Je peux simplement utiliser 'printf (" \ 033% d;% df ", ligne, colonne);' sans la matrice –

+0

@cosine Si vous avez juste besoin de ce qui est imprimé sur l'écran, je suppose que vous n'aurez pas besoin de la matrice. –