Éditeur de rectangles en console

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 / 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];

  • 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.

Codes Sources

A voir également

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.