Utiliser les fleches du clavier en C

Salut,

1)Voici un extrait de code ou j aimerais remplacer les char 2 4 6 8 par les flèches du clavier (sous Visual Studio)


		do{
		//print star
		move(&x,&y,dir);
		locate(&x,&y);
		printf("*");
		dir=getch();
          }while(dir=='8' || dir=='4' || dir=='2' || dir=='6');

  1. j aimerais aussi savoir comment je peux faire pour que l’étoile soit imprimée en continue mm si je n’appuies pas sur une touche et que simplement au moment ou je choisi une autre direction la saisie soit faite en parallèle.

Merci

pour les fleches : sciencesphy.free.fr…

caractere 24 a 27

2)avant ton ‘do’ tu affiches ton étoile (j’avoue ne pas très bien comprendre ce point)

Donc …

Pour les flèches… au départ… pour voir leur code ascii j avais écrit un truc du genre:


	char kb;

	kb=getch();

	printf("%c %d",kb,kb);

et comme resultat j ai eu un alfa et -32 … !! : )
Du coup je n ai pas pense aller voir du cote du tableau ascii…

Apres la reponse de jmgchouchou j ai réessayé comme ceci:


	int kb;

	scanf("%d",&kb);

	printf("%d",kb);

Et ce n est pas encore la bonne solution… en plus mm si ca marchait ca me pauserait un problème parce que avec scanf() il faut faire ENTER.

Donc voila pour ce qui est de ma question No 1 j aimerais “capter” les fleches a la maniere de getch(). (dans un premier tps…)

Pour la question No 2:
Ce coup ci … le problème c est justement getch(), qui provoque un arrêt du programme.

J aimerai que l impression de l étoile se fasse sans arrêt, mais que je puisse quand mm capter la saisie d une fleche sur le clavier.

En gros pour l instant ce que j aimerais faire c est que l étoile se “promène” dans la fenêtre DOS, et que je puisse la diriger avec les flèches.

Ouufff

Ca y est j ai la solution pour la deuxieme question ca donne ca:

if(kbhit())
dir=getch();


		do{
		//print star
		move(&x,&y,dir);
		locate(&x,&y);
		printf("*");
		if(kbhit())
			dir=getch();

		Sleep(100);
	}while(dir=='8' || dir=='4' || dir=='2' || dir=='6');

Maintenant, comment remplacer 2 4 6 8 par les fleches : ).
Edité le 28/08/2007 à 21:02

fgetc(stdin) :neutre:

Bon… j ai fait qlqs essaies avec fgetc(stdin), mais sans succes.

Qlq 1 pourrait me corriger ou completer svp ?


        int c;
	c=fgetc(stdin);

	if (c==???) 
		printf("up");

j ai essaye de mettre c==24, mais ca ne marche pas : )

Merci
Bon WE

On peut les attraper sur l’entrée standard stdin les touches spéciales?

Je vois que tu termines ta phrase par un point d interrogation : )

Donc… peut être… mais j aimerais un exemple de code parce que je n y arrive pas.

Merci.

Ce que je veux dire, c’est qu’il m’avait semblé qu’il fallait passer par la fonction système read() et que fgetc() ne le permettait pas. A voir donc.

Ok … je vais essayer… mais si qlq 1 a un bout de code : )

Merci

Je suis sûr que google code en fourmille… code.google.com…

j’avais fait ce bout de code pour obtenir rapidement les caracteres ascii


#include "definition.h"

int main(void)
{
 char car;
 do{
     car = getche();
     printf("\ncode ascii : %x\n\n",car);
    }while(car != 'F');  
 system("Pause");     
return 0;
}    

et j’obtiens les résultats suivant:
fleche haut 48
fleche gauche 4B
fleche bas 50
fleche droite 4D

www.cppfrance.com…

files.codes-sources.com…

une source crade (23h46 inside :paf: ) :
#include <stdio.h>
#include <CONIO.h>
#include <stdlib.h>
#include <stddef.h>
#include <windows.h>
#include <dos.h>

#define UP 0x48
#define DOWN 50
#define RIGHT 4D
#define LEFT 4B

static SMALL_RECT __WINDBOUND={0,0,79,24}; // Absolute bounds of window
static COORD __SCREENCONS={80,25}; // Columns and rows of the DOS screen

void gotoxy(int x,int y);
int wherex();
int __Inside_Window_Relative (COORD c);
void __To_Absolute (COORD * c);

int main(int argc, char argv[])
{
int x = 5;
int y = 0;
char c;
printf("
");
do{
while(!kbhit());
c = getch();
switch©
{
//a finir
case UP : if(x>0)
{
system(“CLS”);
//x–;
//moveTo(5,5);
//Gotoxy(5,5);
gotoxy(5,5);
//printf(GOTOYX,5,5);
printf("*");
}
break;
/case DOWN :;break;
case RIGHT :;break;
case LEFT :;break;
/
default : printf("\ncar : %x",c);break;
}
}while(c != ‘F’);
system(“CLS”);
system(“PAUSE”);
return 0;
}

void gotoxy(int x, int y)
/* window_text related :

  • Move the cursor to row y, column x. The upper left corner of the
  • current window is (1,1).
    */
    {
    COORD c;

c.X= x;
c.Y= y;
if ( __Inside_Window_Relative© )
{
__To_Absolute(&c);
SetConsoleCursorPosition (GetStdHandle(STD_OUTPUT_HANDLE), c);
}
}

int wherex ()
/* Window_text related :

  • return column position of the cursor in the current window_text
    */
    {
    CONSOLE_SCREEN_BUFFER_INFO info;

GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
return info.dwCursorPosition.X - __WINDBOUND.Left + 1 ;
}

int __Inside_Window_Relative (COORD c)
/* true iff c inside current window /
/
left upper coordinate : 1,1 */
{
return ( (0<c.X) && (c.X<=__WINDBOUND.Right-__WINDBOUND.Left+1) &&
(0<c.Y) && (c.Y<=__WINDBOUND.Bottom-__WINDBOUND.Top+1) );
}

void __To_Absolute (COORD * c)
/* convert c from relative to absolute */
{
c->X +=__WINDBOUND.Left-1;
c->Y +=__WINDBOUND.Top-1;
}

voir mes lien au dessus

: )

Merci.