#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#include <graphics.h>
#include <sys\stat.h>
#include <string.h>
#include <fcntl.h>
#include <io.h>
#define ARROW_SIZE 10
int pos_x = 640 / 2; //positionnement du curseur
int pos_y = 480 / 2; //…au centre de l'écran
int touche = 0; //valeur d'une touche sur le clavier
int port = 0x378 ; //valeur du port série
int graphdriver;
int graphmode;
int handle; // traitement de l’enregistrement
int length; // taille de la phrase (string)
char *string; // événements enregistrés
void init(void) {
graphdriver = DETECT;
initgraph(&graphdriver, &graphmode, ".."); //initialisation du BGI dos mode
handle = creat("C:/parcours.txt", S_IREAD |S_IWRITE); //création du fichier
} // ..PARCOURS.TXT sur C:/
void draw_arrow_d(int pos_x, int pos_y) { //dessine une flèche vers la droite
moveto(pos_x, pos_y); //position d'origine du curseur
linerel(4*ARROW_SIZE, 0);
linerel(-2*ARROW_SIZE, -1*ARROW_SIZE);
linerel(0, 2*ARROW_SIZE);
linerel(2*ARROW_SIZE, -1*ARROW_SIZE);
setfillstyle(SOLID_FILL,0); //efface l'écran
floodfill (0,0,1);
}
void draw_arrow_g(int pos_x, int pos_y) { //de même pour les autres fonctions
moveto(pos_x, pos_y); //…mais la flèche est dessinée
linerel(-4*ARROW_SIZE,0); //…vers la gauche
linerel(2*ARROW_SIZE, 1*ARROW_SIZE);
linerel(0, -2*ARROW_SIZE);
linerel(-2*ARROW_SIZE, 1*ARROW_SIZE);
setfillstyle(SOLID_FILL,0);
floodfill (0,0,1);
}
void draw_arrow_b(int pos_x, int pos_y) { // vers le bas
moveto(pos_x, pos_y);
linerel(0*ARROW_SIZE, 4*ARROW_SIZE);
linerel(-1*ARROW_SIZE, -2*ARROW_SIZE);
linerel(2*ARROW_SIZE, 0*ARROW_SIZE);
linerel(-1*ARROW_SIZE, 2*ARROW_SIZE);
setfillstyle(SOLID_FILL,0);
floodfill (0,0,1);
}
void draw_arrow_h_g(int pos_x, int pos_y) { // haut gauche
moveto(pos_x, pos_y);
linerel(-4*ARROW_SIZE, -4*ARROW_SIZE);
linerel(0*ARROW_SIZE, 2*ARROW_SIZE);
linerel(2*ARROW_SIZE, -2*ARROW_SIZE);
linerel(-2*ARROW_SIZE, 0*ARROW_SIZE);
setfillstyle(SOLID_FILL,0);
floodfill (0,0,1);
}
void draw_arrow_h_d(int pos_x, int pos_y) { //haut droite
moveto(pos_x, pos_y);
linerel(4*ARROW_SIZE, -4*ARROW_SIZE);
linerel(0*ARROW_SIZE, 2*ARROW_SIZE);
linerel(-2*ARROW_SIZE, -2*ARROW_SIZE);
linerel(2*ARROW_SIZE, 0*ARROW_SIZE);
setfillstyle(SOLID_FILL,0);
floodfill (0,0,1);
}
void draw_arrow_b_g(int pos_x, int pos_y) { //bas gauche
moveto(pos_x, pos_y);
linerel(-4*ARROW_SIZE, 4*ARROW_SIZE);
linerel(0*ARROW_SIZE, -2*ARROW_SIZE);
linerel(2*ARROW_SIZE, 2*ARROW_SIZE);
linerel(-2*ARROW_SIZE, 0*ARROW_SIZE);
setfillstyle(SOLID_FILL,0);
floodfill (0,0,1);
}
void draw_arrow_b_d(int pos_x, int pos_y) { //bas droite
moveto(pos_x, pos_y);
linerel(4*ARROW_SIZE, 4*ARROW_SIZE);
linerel(0*ARROW_SIZE, -2*ARROW_SIZE);
linerel(-2*ARROW_SIZE, 2*ARROW_SIZE);
linerel(2*ARROW_SIZE, 0*ARROW_SIZE);
setfillstyle(SOLID_FILL,0);
floodfill (0,0,1);
}
void draw_arrow_h(int pos_x, int pos_y) { /haut
moveto(pos_x, pos_y);
linerel(0*ARROW_SIZE, -4*ARROW_SIZE);
linerel(1*ARROW_SIZE, 2*ARROW_SIZE);
linerel(-2*ARROW_SIZE, 0*ARROW_SIZE);
linerel(1*ARROW_SIZE, -2*ARROW_SIZE);
setfillstyle(SOLID_FILL,0);
floodfill (0,0,1);
}
void dessine(int pos_x, int pos_y) { // place un pixel indiquant
putpixel(pos_x,pos_y, 5); // la position de la voiture
}
void main(void)
{
init(); //initialisation du graph.
while(touche!=27) // Esc fait sortir de la boucle
{
touche=getch() ; // lit la valeur de la touche appuyée
switch (touche) // test de la valeur de la touche appuyée
{
case 56: // haut (8)
outport(port,0xf8); // envoi de la valeur sur le port draw_arrow_h(pos_x, pos_y); // dessine une flèche vers le haut
pos_y--; // déplace la position du curseur
string = "avance, "; // enregistre le déplacement
break;
case 57: // haut droite (9)
outport(port,0xff);
draw_arrow_h_d(pos_x, pos_y);
pos_x++; pos_y--;
string = "virage à droite, ";
break;
case 55: // haut gauche (7)
outport(port,0xf0);
draw_arrow_h_g(pos_x, pos_y);
pos_x--; pos_y--;
string = "virage à gauche, ";
break;
case 50: // bas (2)
outport(port,0x08);
draw_arrow_b(pos_x, pos_y);
pos_y++;
string = "marche arrière, ";
break;
case 49: // bas gauche (1)
outport(port,0x00);
draw_arrow_b_g(pos_x, pos_y);
pos_x--; pos_y++;
string = "marche arrière gauche, ";
break;
case 51: // bas droit (3)
outport(port,0x0f);
draw_arrow_b_d(pos_x, pos_y);
pos_x++; pos_y++;
string = "marche arrière droite, ";
break;
case 52: // gauche (4)
outport(port,0x80);
draw_arrow_g(pos_x, pos_y);
pos_x--;
string = "tourne les roues sur la gauche, ";
break;
case 54: // droite (6)
outport(port,0x8f);
draw_arrow_d(pos_x, pos_y);
pos_x++;
string = "tourne les roues sur la droite, ";
break;
case 27: // fin du programme (Esc)
close(handle); // ferme le fichier texte
printf("regarde ton parcours sur ce fichier : C:/parcours.txt");
clock_t clock(), clock();
delay(5000); //délai de 5 secondes
closegraph(); //ferme le BGI mode
break;
default : // repos
outport(port,0x88);
break;
}
dessine(pos_x, pos_y); // place le point de positionnement du curseur
length = strlen(string); // longueur (en caractère) de la variable string
write(handle, string, length); // écriture de cette phrase dans le fichier texte
}
}