Console en couleur sans caractères

Soyez le premier à donner votre avis sur cette source.

Vue 2 586 fois - Téléchargée 404 fois

Description

Bonjour,

Voici une adaptation (ou simplification) du code de l'article "Console: dimension et fonte".
Elle me servira pour le prochain article sur le triangle de Pascal.

En l'observant, on remarque qu'on n'écrit aucun caractère dans la console !
On définit seulement l'attribut des "cellules" réservées aux caractères.

La définition de la fonte (avec ConsoleFont) sert uniquement à définir la taille de ces cellules (ici 4x4):
#include <windows.h>
bool ConsoleSize(HANDLE hOut,short nCol,short nLin) { // nCol >= 80
  if (SetConsoleScreenBufferSize(hOut,{nCol,nLin})==0) return 0;
  SMALL_RECT r={0,0,nCol-1,nLin-1};
  return SetConsoleWindowInfo(hOut,1,&r);
}
bool ConsoleFont(HANDLE hOut,char *facename,short w,short h) {
  CONSOLE_FONT_INFOEX fid={sizeof(CONSOLE_FONT_INFOEX)};
  if (GetCurrentConsoleFontEx(hOut,FALSE,&fid)==0) return 0;
  fid.FontFamily=FF_DONTCARE;
  size_t n;
  mbstowcs_s(&n,fid.FaceName,facename,32);
  fid.dwFontSize={w,h};
  return SetCurrentConsoleFontEx(hOut,0,&fid);
}
void main() {
  unsigned short col=120,lin=150; // col >= 80, max col,lin selon screen
  HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
  SetConsoleTitle("Une console windows en animation");
  if (ConsoleFont(hOut,"Consolas",4,4)==0) MessageBox(0,"Font","Error",0);
  if (ConsoleSize(hOut,col,lin)==0) MessageBox(0,"Size: to big","Error",0);
  while (1) {unsigned long n;
    unsigned short att=0XF0&rand(); // bits 4 à 7
    WriteConsoleOutputAttribute(hOut,&att,1,{rand()%col,rand()%lin},&n);
  }
}
Dans l'attribut att, les 4 premiers bits définissent la couleur du texte, et les 4 suivants celle du fond (► CouleurFond.jpg).

Le code Console.cpp donne une animation de couleurs dans la console, dont une image instantanée se trouve dans Console.jpg.

Bonne lecture ...
 
 

Liens

CodeS-SoureS: Console: dimension et fonte
MSDN: Console Functions

Codes Sources

A voir également

Ajouter un commentaire Commentaires
denisbertin Messages postés 248 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
6 avril 2018 à 13:14
Précision au sujet de la fonction randomize, qui donne un nombre presque au hazard, PovRay le raytracer l'utilise mais comme il permet de concevoir des animation la valeur derand -seed et dupliquer pour que le calcul des nuages soit identique d'une séquence à l'autre? j'ai bien explorer un partie de leurs code sources 300.000 ligne de codification informatique. Comme tu est un expert je te conseille de faire une boucle de 1 à 1000 par exemple avec setpixel(rand%%largeur,rand%%hauteur) et tu peut ainsi découvrir que tout ceci n'est pas forcement aussi hazardeux que tu le pense, voir ces similitudes.
denisbertin Messages postés 248 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
6 avril 2018 à 13:06
La blague : mais alors combien de combinaisons vont-elle pouvoir s'acheter.
denisbertin Messages postés 248 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
6 avril 2018 à 13:01
J'ai commencé a programmer sur un micro ordinateur 8 bits de données et 16 bits d'adressage soit 2^16 = 65536, quand à la factorielle n!, sur une calculatrice scientifique des années 1981, elle pouvait être calculée jusqu'a 69! ce qui permet d'être représenté avec 2 chiffres d'une puissance de dix, avec mes copains au lycée on mesurait le temps de calcul de cette factorielle pour déterminer laquelle était la plus rapide, selon le temps de latence (d'attente) pour obtenir ce résultat !
William VOIROL Messages postés 261 Date d'inscription mardi 12 décembre 2006 Statut Membre Dernière intervention 10 juin 2019
22 mars 2018 à 06:56
Bonjour,

En C et C++, rand() donne un entier entre 0 et RAND_MAX.
Et RAND_MAX vaut (au moins) 0X7FFF = 32767 = 2¹⁵-1.

Voir par exemple cplusplus rand

De plus 0XF0&rand() donne un entier multiple de 16 entre 0X00 = 0 et 0XF0 = 240.
denisbertin Messages postés 248 Date d'inscription lundi 22 avril 2013 Statut Membre Dernière intervention 13 mai 2023 1
19 mars 2018 à 12:44
Question tu utilise la fonction random rand() sans argument, mais avec un modulo, en pascal il en faut un, quelle est la plage de variation de cette fonction en C ? normalement elle renvoie un nombre entre 0 et 1 mais la fonction modulo demande des entiers...

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.