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 / Exemple :
/* 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];
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.
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.