Accueil > > > ÉDITEUR DE RECTANGLES EN CONSOLE
ÉDITEUR DE RECTANGLES EN CONSOLE
Information sur la source
Description
Utilisant la merveilleuse fonction non standard "getch", ainsi que quelques fonctions pour manipuler la position du curseur dans la console _WIN32, ce programme permet de faire un rectangle d'une hauteur et largeur fixée par l'utilisateur. Une fois affiché dans la console, le rectangle est éditable. (Un 'X' représente la position du 'curseur' et les touches directionnelles du clavier servent à le déplacer. La valeur de la position du 'X' est remplacée par l'entrée de l'utilisateur. (autre que celle des touches directionnelles)) Le tout est ensuite écrit dans un fichier .txt une fois que la touche 'q' (pour quitter l'éditeur) a été enfoncée.
Source
- /* main.c */
- #include <stdio.h>
- #include <stdlib.h>
- #ifdef _WIN32
- # include "refresh.h"
- /* Flèches directionnelles */
- # define UP 72
- # define DOWN 80
- # define LEFT 75
- # define RIGHT 77
- #endif
- int lire();
-
- int main()
- {
- char *tmp, c = 0;
- int height = 0, width = 0;
- int i,j;
- char **table;
-
- printf("Width : ");
- scanf("%d", &width);
- width++;// pour le \n
- printf("Height : ");
- scanf("%d", &height);
-
- table = malloc(height*sizeof(char *));
- if(table == NULL)
- {
- printf("Dynamic memory allocation failed.\n");
- return -1;
- }
- for(i=0;i<height;i++)
- {
- table[i] = malloc(width*sizeof(char));
- if(table[i] == NULL)
- {
- printf("Dynamic memory allocation failed.\n");
- return -1;
- }
- }
-
- for(i = 0;i<height;i++)//initialisation du tableau.
- for(j=0;j<width;j++)
- {
- if(j < width-1)
- table[i][j] = '0';
- else
- table[i][j] = '\n';
- }
- int x = 0;
- int y = 0;
- char backup = table[x][y];
- tmp = &table[x][y];
- *tmp = table[x][y];
- while(1)
- {
- for(i = 0;i<height;i++)
- for(j=0;j<width;j++)
- printf("%c", table[i][j]);
- c = lire();
- *tmp = backup;//6. met la valeur de ce qu'il y avait à cette position en prévision d'un autre déplacement
- if(c == 'q')
- break;
- tmp = &table[x][y];//1. stocke l'adresse de la position courante
- switch(c)//2. teste l'entrée, déplace la position ou remplace la valeur de la position courante par l'entrée
- {
- case UP : x = (x-1) >= 0 ? (x-1) : x; break;
- case DOWN : x = (x+1) < height ? (x+1) : x; break;
- case LEFT : y = (y-1) >= 0 ? (y-1) : y; break;
- case RIGHT: y = (y+1) < width-1 ? (y+1) : y; break;
- default: *tmp = c;//remplace la valeur de la position courante par l'entrée
- }
- tmp = &table[x][y];//3. stocke l'adresse de la prochaine position
- backup = *tmp;//4. stocke la valeur de la prochaine position
- table[x][y] = 'X';//5. met le 'X' à la prochaine position
- refresh(height);/* affichage */
- }
-
- FILE *fichier = fopen("rectangle.txt", "w");
- for(i = 0;i<height;i++)
- for(j=0;j<width;j++)
- fprintf(fichier, "%c", table[i][j]);
- fclose(fichier);
- for(i=0;i<height;i++)
- free(table[i]);
- free(table);
- }
-
- int lire()
- {
- int a = 0;
- a = getch();
- if(a == 224)//code sous Windows pour une touche directionnelle
- a = getch();//deux valeurs sont envoyées, donc le prochain getch la récupère
- return a;
- }
-
- /* refresh.h */
- #ifndef H_H_INCLUED
- #define H_H_INCLUED
- void refresh(int height);
- #endif
-
- /* refresh.c */
- #include <windows.h>
- #include "refresh.h"
-
- void refresh(int height)
- {
- CONSOLE_SCREEN_BUFFER_INFO coninfo;
- HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
- GetConsoleScreenBufferInfo(hConsole, &coninfo);
- coninfo.dwCursorPosition.Y -= height;
- coninfo.dwCursorPosition.X = 0;
- SetConsoleCursorPosition(hConsole, coninfo.dwCursorPosition);
- }
/* main.c */
#include <stdio.h>
#include <stdlib.h>
#ifdef _WIN32
# include "refresh.h"
/* Flèches directionnelles */
# define UP 72
# define DOWN 80
# define LEFT 75
# define RIGHT 77
#endif
int lire();
int main()
{
char *tmp, c = 0;
int height = 0, width = 0;
int i,j;
char **table;
printf("Width : ");
scanf("%d", &width);
width++;// pour le \n
printf("Height : ");
scanf("%d", &height);
table = malloc(height*sizeof(char *));
if(table == NULL)
{
printf("Dynamic memory allocation failed.\n");
return -1;
}
for(i=0;i<height;i++)
{
table[i] = malloc(width*sizeof(char));
if(table[i] == NULL)
{
printf("Dynamic memory allocation failed.\n");
return -1;
}
}
for(i = 0;i<height;i++)//initialisation du tableau.
for(j=0;j<width;j++)
{
if(j < width-1)
table[i][j] = '0';
else
table[i][j] = '\n';
}
int x = 0;
int y = 0;
char backup = table[x][y];
tmp = &table[x][y];
*tmp = table[x][y];
while(1)
{
for(i = 0;i<height;i++)
for(j=0;j<width;j++)
printf("%c", table[i][j]);
c = lire();
*tmp = backup;//6. met la valeur de ce qu'il y avait à cette position en prévision d'un autre déplacement
if(c == 'q')
break;
tmp = &table[x][y];//1. stocke l'adresse de la position courante
switch(c)//2. teste l'entrée, déplace la position ou remplace la valeur de la position courante par l'entrée
{
case UP : x = (x-1) >= 0 ? (x-1) : x; break;
case DOWN : x = (x+1) < height ? (x+1) : x; break;
case LEFT : y = (y-1) >= 0 ? (y-1) : y; break;
case RIGHT: y = (y+1) < width-1 ? (y+1) : y; break;
default: *tmp = c;//remplace la valeur de la position courante par l'entrée
}
tmp = &table[x][y];//3. stocke l'adresse de la prochaine position
backup = *tmp;//4. stocke la valeur de la prochaine position
table[x][y] = 'X';//5. met le 'X' à la prochaine position
refresh(height);/* affichage */
}
FILE *fichier = fopen("rectangle.txt", "w");
for(i = 0;i<height;i++)
for(j=0;j<width;j++)
fprintf(fichier, "%c", table[i][j]);
fclose(fichier);
for(i=0;i<height;i++)
free(table[i]);
free(table);
}
int lire()
{
int a = 0;
a = getch();
if(a == 224)//code sous Windows pour une touche directionnelle
a = getch();//deux valeurs sont envoyées, donc le prochain getch la récupère
return a;
}
/* refresh.h */
#ifndef H_H_INCLUED
#define H_H_INCLUED
void refresh(int height);
#endif
/* refresh.c */
#include <windows.h>
#include "refresh.h"
void refresh(int height)
{
CONSOLE_SCREEN_BUFFER_INFO coninfo;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsole, &coninfo);
coninfo.dwCursorPosition.Y -= height;
coninfo.dwCursorPosition.X = 0;
SetConsoleCursorPosition(hConsole, coninfo.dwCursorPosition);
}
Conclusion
Parfait pour faire des niveaux de Sokoban pour un Sokoban en console ou bien pour épater vos amis avec une oeuvre de caractères ASCII.
Historique
- 23 janvier 2012 06:49:35 :
- 12:42 AM 23/01/2012 : Modification de la méthode de rafraichissement de la console par quelque chose de plus propre et exclusive à Windows. MSDN est une source d'informations palpitante sur le sujet.
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
directX [ par pip ]
Bonjour,Lorsque j'effectue une rotation d'un rectangle avec directX (en C++) j'obtient la chose suivante:Une
InvalidateRect() [ par GreatNeo ]
Voila je dessine un rectangle comme ceci:SetRect(&rect,25,25,625,250);Et après je veux rafraichir ce rectangle avec :InvalidateRect(hwnd,&rect,TRUE);M
Rectangle(), float? [ par Xentor609 ]
Salut, j'utilise la fonction Rectangle, pour dessiner un rectangle, le prob, ce't qu'il faut entrerdes int, et moi je voudrais y mettre des floats ou
GDI windows [ par moi1392 ]
Bonjour, j'ai un léger soucis avec l'API win32.Alors voila, je voudrais tracer un rectangle vide au milieu mais avec une certaine epaisseur de bord.La
pb temps avec gtk [ par sparetime ]
bonjour je veux faire une petite animation avec gtk+ 2.0 mais bien sur j'ai un pb .voila je dessine un rectangle par exemple en bleu ensuite j'utilis
vérifier ca position -CPoint CRect [ par michelmt ]
Salutvoici mon problême,mon programme dessine des object a l'intérieur d'un rectangleet je me demande depuis très longtemps comment je peut lui fair c
Affichage du buffer à l'écran [ par CyberP ]
Voilà, j'ai fait un programme censé afficher différentes figures à l'écran... Après plusieurs calculs, le résultat est stocké dans un buffer et je vou
tableau dynamique [ par azkab ]
bonjour,dans mon programme j ai deux classes (classe 'rectangle' et classe 'cercle'). j ai une troisieme classe 'Objet' qui est l aggregation de ces d
rectangle englobant [ par spycomeback ]
spycomebackSalut a tousj'aurais besoin d'aide pour créer un rectangle dans une listbox avec le curseur de la souris. Dans cette listbox je lis deja un
rectangle [ par spycomeback ]
spycomebackSalut a tous,J'aurais besoin d'aide pour créer un rectangle transparent (sauf contour) dans une listbox. Ce rectangle doit etre créer avec
|
Derniers Blogs
ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0ETENDRE LE TEAM WEB ACCESS DE TFS 2012 - STEP 0 par Philess
L'extensibilité du Team Web Access
Le Web Access (site d'équipe) de Team Foundation Server a été complètement réécrit dans la version 2012 avec pas moins de 400.000 lignes de JavaScript. Ce nouveau modèle a été pensé pour offrir de grandes...
Cliquez pour lire la suite de l'article par Philess SIMULER FACILEMENT L'ENVOI DE MAILSIMULER FACILEMENT L'ENVOI DE MAIL par JeremyJeanson
il m'a été demandé, à plusieurs reprises, comment je faisais pour simuler l'envoi de mail lors de mes démos de Workflow Foundation. Ma solution est plutôt simple : j'utilise la configuration par défaut du SmtpClient et j'oriente les mails vers un dossier ...
Cliquez pour lire la suite de l'article par JeremyJeanson VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES !VOTEZ POUR LE TOP 10 DES INFLUENCEURS SHAREPOINT FRANCOPHONES ! par Patrick Guimonet
Si ce n'est déjà fait (comme plus de 600 personnes déjà), il est encore temps de voter pour le concours TOP 10 des influenceurs SharePoint francophones ! Il est organisé par harmon.ie et accessible ici : http://harmon.ie/top-...
Cliquez pour lire la suite de l'article par Patrick Guimonet [CONF'SHAREPOINT] DERNIER RAPPEL ! :-)[CONF'SHAREPOINT] DERNIER RAPPEL ! :-) par Patrick Guimonet
La Conf'SharePoint en chiffres c'est : 3 jours de SharePoint ! 4 parcours et 60 sessions 17 partenaires représentant toutes les fac...
Cliquez pour lire la suite de l'article par Patrick Guimonet
Forum
PB PACMAN C++PB PACMAN C++ par garfield95
Cliquez pour lire la suite par garfield95
Logiciels
Easy-Planning (4.5.0.11)EASY-PLANNING (4.5.0.11)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté a... Cliquez pour télécharger Easy-Planning CVEasy (3.1.0.51)CVEASY (3.1.0.51)PHMSD-CVEasy est un logiciel d'aide à la rédaction de CV d'une simplicité déconcertante.
PHMSD-C... Cliquez pour télécharger CVEasy LettresFaciles 2011 (8.6.0.31)LETTRESFACILES 2011 (8.6.0.31)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011 sDEVIS-FACTURES vlPRO (8.4.2.62)SDEVIS-FACTURES VLPRO (8.4.2.62)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO Devis-Factures PHMSD (2.1.0.11)DEVIS-FACTURES PHMSD (2.1.0.11)Configuration minimale
Nécessite Windows™ 2000, XP, Windows 7, 8, Vista (Service Pack à... Cliquez pour télécharger Devis-Factures PHMSD
|