begin process at 2013 05 24 19:47:24
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > ÉDITEUR DE RECTANGLES EN CONSOLE

ÉDITEUR DE RECTANGLES EN CONSOLE


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :sokoban console, editeur getch, rectangle Niveau :Débutant Date de création :17/01/2012 Date de mise à jour :23/01/2012 06:49:35 Vu / téléchargé :1 945 / 43

Auteur : seoseo

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 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

Source avec Zip ASSISTANT POUR TROUVER LES MINES AU DÉMINEUR SOUS WINDOWS XP
CONVERSION DE FICHIER EN FICHIER BMP
GÉNÉRATION DE FICHIER .WAV

 Sources de la même categorie

PROBLEME DU LOGARITHME DISCRET par nkghislain
Source avec Zip ALGORITHMES DE SAC A DEAUX ,PIECE DE MONAIS ET MULTUPLICATIO... par brsmed
Source avec une capture PING SUR QT par LoVerMaKi
Source avec Zip SLITHER_LINK_JEUX par kossitykossity
Source avec Zip Source avec une capture DON'$COMUNIK_IRC par Donald2991

 Sources en rapport avec celle ci

Source avec Zip APPLICATION DE DESSIN DE QUELQUES FIGURES par laguchori
Source avec Zip Source avec une capture DESSIN D'ARBRES par JCDjcd
Source avec Zip Source avec une capture AFFICHAGE D'UN BITMAP ET ZONE DE SELECTION DANS UN CSTATIC A... par greg73
Source avec Zip CONNAITRE UN COTÉ DE L'ANGLE DROIT (PYTHAGORE) par pipolasmimi38
Source avec Zip Source avec une capture COLLISION DE RECTANGLES 2D par Galmiza

Commentaires et avis

Commentaire de seoseo le 23/01/2012 06:58:25

Jeez, j'ai inutilement mis la date dans l'historique. J'espère que l'amélioration sera appréciée, il y a une sur-utilisation de cls de nos jours. N'ayant aucun moyen standard de revenir derrière un \n, il faut passer par des fonctions spécifiques à l'OS. Ça fait moins mal aux yeux maintenant.

Commentaire de seoseo le 23/01/2012 07:02:55

Oh my, dans le zip, je n'ai pas pensé de changer le nom du fichier sokoban.c en main.c pour rester cohérent avec la Source sous la Description.

 Ajouter un commentaire


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


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,666 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales