Java Script
Java Script
[Titre du
document]
[Sous-titre du document]
paul YAO
[Date]
DEDICACE
DEDICACE ................................................................................................................................ 0
SOMMAIRE .............................................................................................................................. 2
1. Introduction ..................................................................................................................... 6
1. Les objets....................................................................................................................... 40
Dans ce livre nous s’allons apprendre à mieux cerner tous les contours plus ou moins essentiel
à une pédagogie simple et compréhensive en vue de vous permettre de concevoir un programme
basé sur JavaScript.
CEDRIC YAO
INGENIEUR INFORMATIQUE
Doctorant en Informatique à Sup Management Maroc (Fès)
RESPONSABLE TECHNIQUE A EASY SMART Solutions
Mai 2020
INITIATION A
JAVASCRIPT
1. Introduction
JavaScript ou JS est un composant majeur de tous les sites web car ils sont composés de trois
Éléments principaux :
Elément très important pour l’utilisation de JavaScript il s’agit des outils de conception pour
les développeurs de chrome on peut les afficher de deux manières :
Ou écrit le javascript
On écrit le javascript entre des tags <scripts> codeJS</script> et peut être présenter de plusieurs
manières :
➢ Dans le head
<!Doctype html>
<html>
<head>
<script>
console.log("hello");
</script>
</head>
<body>
</body>
</html>
<!Doctype html>
<html>
<head>
</head>
<body>
<script>
console.log("hello");
</script>
</body>
</html>
<!Doctype html>
<head>
</head>
<body>
</body>
<script>
console.log("hello");
</script>
</html>
La façon la plus utilisée est de créer un fichier JavaScript dans le même dossier que le fichier
html noté script.js
index.html
<!Doctype html>
<html>
<head>
</head>
<body>
</body>
<script src="script.js">
</script>
</html>
alert("hello john")
La syntaxe de javascript
var name="john";
console.log(name);
Scripts.js
var name="john";
var x = 12;
console.log(12);
Remarque ton nombre est afficher en bleu dans la console par une chaine de caractère est
afficher en noir mais il est possible de forcer un nombre à devenir une chaîne de caractère en
utilisant la fonction x.toString()
var x = 12;
var y = 25.63;
console.log(x);
console.log(y);
console.log(x.toString())
var x = 12;
var y = 25.63;
console.log(x);
console.log(y);
console.log(xToString);
console.log(namelength);
console.log(xString);
console.log(xNumber);
console.log(position)
console.log(myNewString);
console.log(myNewString);
console.log(myNewString);
a tester
console.log(myNewString);
Méthodes 1
var x;
x = 12;
Méthodes 2
var x = 12;
console.log(x);
Addition
var x = 12;
var y = 15;
console.log(resp);
Soustraction
var x = 30;
var y = 15;
console.log(resp);
Multiplication
var x = 30;
var y = 15;
console.log(resp);
Division
var x = 30;
var y = 15;
console.log(resp);
var x = 34;
var y = 15;
console.log(resp);
Incrémentation et désincrémentation
var x = 34;
var y = 15;
x++; // incrémentation
y--; // désincrémentation
console.log(x);
console.log(y);
var x = 34;
var y = 15;
Les commentaires d’expliquer une instruction dans le code elle permet à un développeur de se
repérer facilement dans un code.
var x = "diomande";
var y = "laeticia";
console.log(x+y); //affiche la concaténation de x et y
console.log(x+" "+y);
Un commentaire permet à la partie d’un code de ne pas s’exécuter
var x = "diomande";
var y = "laeticia";
console.log(x+y);
//console.log(x+" "+y);
On peut faire un commentaire pour plusieurs lignes
/*
ceci est un test de
concaténation en
JavaScript
testé par cedric yao
*/
var x = "diomande";
var y = "laeticia";
console.log(x+y);
//console.log(x+" "+y);
Page 20 sur 156
Les opérateurs booléens
Ce sont des opérateurs pouvant prendre deux valeurs vraies ou faux
var myboolean1 = true;
var myboolean2 = false;
console.log(myboolean1) ;
console.log(myboolean2) ;
Opérateur de comparaison
Opérateur d’égalité ou de différences
/* opérateur strictement
égale ou différents*/
var x = 5
/*égalité*/
var myBoolean1 = (x===5);//égalité vérifié
/*différences*/
var myBoolean2 = (x!==5)//différence pas vérifié;
/*affichage à la console*/
console.log(myBoolean1);
console.log(myBoolean2);
Cas d’égalité simple
/* opérateur strictement
Égale ou égalité simple */
var x = 5
var myBoolean1 = (x==="5"); // strictement égale
var myBoolean2 = (x=="5"); // égalité simple
console.log(myBoolean1);
console.log(myBoolean2);
L’opérateur strictement égale vérifie l’égalité en du type de variable déclaré dans le cas de notre
exemple la valeur sera fausse (console.log(myBoolean1) et la valeur sera vérifié pour l’égalité
simple (console.log(myBoolean2)) car elle ne prend pas en compte le type de caractère.
Opérateur d’infériorité
/* opérateur d'infériorité */
/* opérateur ET */
var x = 5
var y = 15
var myBoolean1 = (x>3 && y<20); // vérifié
var myBoolean2 = (x>3 && y>20); // pas vérifié
console.log(myBoolean1);
console.log(myBoolean2);
opérateur OU
A B A OU B
VRAI FAUX VRAI
VRAI VRAI VRAI
FAUX VRAI VRAI
FAUX FAUX FAUX
/* opérateur OU */
var x = 5
var y = 15
var myBoolean1 = (x>3 || y<20); // vérifié
var myBoolean2 = (x>3 || y>20); // vérifié
var myBoolean3 = (x<3 || y>20); // pas vérifié
console.log(myBoolean1);
A Non A
Vrai Faux
Faux Vrai
/* récapitulatif */
var x = 5
var y = 15
var myBoolean1 = (x>3 || y<20); // vérifié
var myBoolean2 = (x>3 || y>20); // vérifié
var myBoolean3 = (x<3 || y>20); // pas vérifié
console.log(myBoolean1);
console.log(myBoolean2);
console.log(myBoolean3);
/*opérateur inverse*/
console.log('opération inverse');
console.log('');
console.log(!myBoolean1);
console.log(!myBoolean2);
console.log(!myBoolean3);
4. Les conditions
Condition if (si)
La syntaxe d’une condition est la suivante :
if (condition)
{
instructions;
}
Condition else (sinon)
La syntaxe est la suivante
Page 23 sur 156
If (condition)
{
Instructions ;
}
Else
{
Instructions ;
}
Condition else if (sinonsi)
La syntaxe est la suivante
If (condition)
{
Instructions ;
}
Else if (condition2)
{
Instructions ;
}
Else
{
Instructions ;
}
Exemple pratique avec l’âge
De 0 à 17 ans Mineur
De 18 à 25 ans Majeur
Plus de 25 ans Adultes
var age = 25
if(age<=18)
else
}
Un cas particulier pour les mineurs de 0 à 8ans
var age = 4
if(age<=18)
{
if (age <= 8)
{
console.log("tu est un petit gar");
}
else
{
console.log("tu est un mineur");
}
}
else if (age>=18 && age<=25)
{
console.log("tu est un majeur");
}
else
{
console.log("tu est devenu adulte");
5. Les boucles
Do
Instructions ;
While (conditions)
Pratique
var nombre = 0;
do
console.log(nombre);
nombre++;
var nombre = 0;
do
console.log(nombre);
nombre++;
Avec While
var nombre = 0;
console.log(nombre);
nombre++;
La boucle For
Instructions ;
Pratique
console.log(number);
6. Les fonctions
Code à Exécuter ;
Return result ;
Pratique
//déclaration de la fonction
function multiplication(nombre1,nombre2)
function division(nombre1,nombre2)
//exécution de la fonction
var a = 8;
var b = 9;
console.log(result);
console.log(resp);
La « portée » d’une variable désigne l’espace du script dans laquelle elle va être accessible.
En JavaScript, il n’existe que deux espaces de portée différents : l’espace global et l’espace
local. L’espace global désigne l’entièreté d’un script à l’exception de l’intérieur de nos
fonctions. L’espace local désigne, à l’inverse, l’espace dans une fonction.
function multiplication(nombre1,nombre2)
return resultmultiple*5;
function Somme(nombre1,nombre2)
return resultSomme*5;
//exécution de la fonction
console.log(result);
console.log(resp);
Mais par contre il est possible de définir une variable globale dans une fonction
function multiplication(nombre1,nombre2)
return resultmultiple*5;
function Somme(nombre1,nombre2)
return resultSomme*5;
console.log(resultmultiple);
console.log(resultSomme);
Les tableaux JavaScript sont utilisés pour stocker plusieurs valeurs dans une seule variable. Un
tableau est une variable spéciale, qui peut contenir plusieurs valeurs à la fois
Pratique
console.log(fruits.length);//longueur du tableau
Remarque
Pour lire les valeurs d’un tableau il commencer par la position zéro
On a un tableau de 10 élements.
Astuces (sélectionnez tous le test et faire ctrl + // pour mettre tous en commentaire).
La méthode push() ajoute un ou plusieurs éléments à la fin d'un tableau et renvoie la nouvelle
longueur du tableau.
Exemple
console.log(fruits);
La méthode pop() supprime le dernier élément d'un tableau et renvoie cet élément. Cette
méthode modifie la longueur du tableau.
arr .pop ()
Exemples :
console.log(fruits);
La méthode slice () renvoie une copie superficielle d'une partie d'un tableau dans un nouvel
objet tableau sélectionné de l'index des éléments de ce tableau. Le tableau d'origine ne sera pas
modifié.
Exemples :
console.log(agrumes);
console.log(tableau);
//afficher le tableau
console.log(tableau) ;
Neuf (9) se trouve dans le sous tableau deux (2) et à la position un (1) de ce sous tableaux donc
la syntaxe sera : tableau [2][1]
//afficher le tableau
//console.log(tableau);
console.log(tableau[2][1])
PROGRAMMATION
ORIENTE - OBJET
1. Les objets
Un objet est une collection de données apparentées et/ou de fonctionnalités (qui, souvent, se
composent de plusieurs variables et fonctions, appelées propriétés et méthodes quand elles
sont dans des objets).
OBJET
Propriété 1 : valeur1
Propriété 2 : valeur2
Propriété 1 : valeur1
……………………
Propriété n : valeur n
Méthodes 1( )
Méthodes 2( )
Méthodes 3( )
:::::::::::::::::::
Méthodes N( )
var objet =
Propriété 1 : valeur1,
Propriété 2 : valeur2,
……………………
Propriété n : valeur n
Méthodes 1 : function1 ( ) {
Méthodes 2 : function2 ( ) {
::::::::::::::::::::::::::::::::::::::::
Méthodes 3 : function3 ( ) {
};
Voiture
Nom : Fiat
Modèle : 500
Poids : 850kg
Couleurs : white
var voiture =
//propriété de l'objet
name: "Fiat",
model: "500",
weight: "850kg",
color: "white"
};
console.log(voiture.name);
console.log(voiture["model"]);
var voiture =
//propriété de l'objet
name: "Fiat",
model: "500",
weight: "850kg",
color: "white"
};
console.log(voiture[property]);
//propriété de l'objet
voiture.name = "Fiat";
voiture.model = "500";
voiture.weight = "850kg";
voiture.color = "white";
console.log(voiture[property]);
Voiture
Nom : Fiat
Modèle : 500
Poids : 850kg
Couleurs : white
Démarrer ( )
Conduire ( )
Freiner ( )
S’arrêter ( )
//propriété de l'objet
voiture.model = "500";
voiture.weight = "850kg";
voiture.color = "white";
voiture.start = function(){
console.log("démarer")
};
voiture.drive = function(){
console.log("conduire")
};
voiture.brake = function(){
console.log("freiner")
};
voiture.stop = function(){
console.log("s'arrêter")
};
console.log(voiture[property]);
// afficher la méthodes
voiture.start();
voiture.drive();
voiture.brake();
voiture.stop();
//propriété de l'objet
voiture.name = "Fiat";
voiture.model = "500";
voiture.weight = "850kg";
voiture.color = "white";
voiture.start = function(nombre){
while(nombre>0){
console.log(nombre.toString() + "démarer");
nombre--;
};
voiture.drive = function(){
console.log("conduire")
};
voiture.brake = function(){
console.log("freiner")
};
voiture.stop = function(){
console.log("s'arrêter")
};
console.log(voiture[property]);
// afficher la méthode
voiture.start(8);
voiture.drive();
voiture.brake();
voiture.stop();
Un constructeur est associé à un objet d'une classe particulière qui a été instanciée. Le
constructeur initialise cet objet et peut fournir un accès à ses informations privées. Le concept
de constructeur peut s'appliquer à la plupart des langages de programmation orientée objet.
Dans l'essentiel, un constructeur en JavaScript est en général déclaré lors de l'instance d'une
classe.
This.propriétés1 = Propriété 1 ;
This.propriétés2 = Propriété 1 ;
This.propriétésn = Propriété n ;
// création de méthodes
This.Methode1 = function () {
This.Methode2 = function () {
This.MethodeN = function () {
}
Page 47 sur 156
// créaction des instances pour l’appel des constructeurs .
Pour appeler le constructeur d'une classe en JavaScript, utilisez un opérateur new pour affecter
une nouvelle référence d'objet à une variable.
On désire définir un objet qui nous permet de créer à la fois un carrée et un rectangle et exploité
le calcul de la surface et du périmètre sachant que le carré et le rectangle sont tous deux des
figures géométriques qui sont constitué de longueur et de largeur la sel différences est le carrée
dont la longueur est égale à la largeur :
Figures
Nom : valeur1 (string)
Longueur : valeur2 (number)
Largeur : valeur3 (number)
Aire (Longueur * Largeur)
Perimètre ( 2*[Longueur + Largeur] )
FIGURE 1
Nom Carré
Longueur 8
Largeur 8
FIGURE 2
Nom Rectangle
Longueur 10
Largeur 8
// propriétés
this.nom = nom;
this.longueur = longueur;
this.largeur = largeur;
//méthodes
this.aire = function()
this.perimetre = function()
console.log(Figure1);
Figure1.aire();
Figure1.perimetre();
Figure2.aire();
Figure2.perimetre();
En réalité, les classes sont juste des fonctions spéciales. Ainsi, les classes sont définies de la
même façon que les fonctions : par déclaration, ou par expression.
Pour utiliser une déclaration de classe simple, on utilisera le mot-clé class, suivi par le nom de
la classe que l'on déclare.
Nom de classe
Propriété 1 : valeur1
Propriété 2 : valeur2
Propriété 1 : valeur1
……………………
Propriété n : valeur n
Syntaxe de la classe
Class Nomsclasse {
constructor(propriété1, propriété2) {
this.propriété1 = propriété1;
this.propriété2 = propriété2; }
Le corps d'une classe est la partie contenue entre les accolades. C'est dans cette partie que l'on
définit les propriétés d'une classe comme ses méthodes et son constructeur.
La méthode constructor est une méthode spéciale qui permet de créer et d'initialiser les objets
créés avec une classe.
Rectangle
Longueur : valeur2 (number)
Largeur : valeur3 (number)
Aire (Longueur * Largeur)
Perimètre ( 2*[Longueur + Largeur] )
class Rectangle {
constructor(hauteur, largeur) {
this.hauteur = hauteur;
this.largeur = largeur;
get area() {
return this.calcArea();
get perimetre() {
return this.calcPerimetre();
calcArea() {
calcPerimetre() {
console.log(carré);
console.log(carré.area);
console.log(carré.perimetre);
Le mot-clé static permet de définir une méthode statique pour une classe. Les méthodes
statiques sont appelées par rapport à la classe entière et non par rapport à une instance donnée
(ces méthodes ne peuvent pas être appelées « depuis » une instance).
Point
X : valeur1 (number)
Y : valeur2 (number)
Explication
P1P2 = √50
Cas pratique
class Point {
constructor(x, y) {
this.x = x;
this.y = y;
static distance(a, b) {
console.log(p1);
console.log(Point.distance(p1, p2));
Remarque :
La fonction Math.hypot() renvoie la racine carrée de la somme des carrés de ses arguments. On
peut également la définir avec la formule suivante :
Le mot-clé extends, utilisé dans les déclarations ou les expressions de classes, permet de créer
une classe qui hérite d'une autre classe (on parle aussi de « sous-classe » ou de « classe-fille »).
Le mot-clé super est utilisé pour appeler les fonctions rattachées à un objet parent.
nom
parle()
CHIEN
super (nom)
parle()
Cas pratique
class Animal {
constructor(nom) {
this.nom = nom;
parle() {
constructor(nom) {
parle() {
console.log(`${this.nom} aboie.`);
caniche.parle();
corbeau.parle();
Remarque :
Si on déclare un constructeur dans une classe fille, on doit utiliser super() avant this.
On peut également étendre des classes plus traditionnelles basées sur des constructeurs
fonctionnels :
this.nom = nom;
Animal.prototype.crie = function () {
crie() {
super.crie();
console.log(`${this.nom} aboie.`);
c.crie();
En revanche, les classes ne permettent pas d'étendre des objets classiques non-constructibles.
Si on souhaite créer un lien d'héritage en un objet et une classe, on utilisera
Object.setPrototypeOf() :
this.nom = nom;
Animal.prototype.crie = function () {
crie() {
super.crie();
console.log(`${this.nom} aboie.`);
c.crie();
pigeon.crie()
Le mot-clé super est utilisé pour appeler les fonctions rattachées à un objet parent.
class Chat {
constructor(nom) {
this.nom = nom;
parler() {
parler() {
super.parler();
console.log(`${this.nom} rugit.`);
felin.parler();
prédateur.parler();
Pour lire une valeur en javascript on utilise la fonction prompt( ) mais lire que les chaine de
caractère donc pour la faire les nombre il faut forcer le caractère :
switch(jours)
case 1:
console.log('lundi');
case 2:
console.log('Mardi');
break;
case 3:
console.log(' Mercredi');
break;
case 4:
console.log(' Jeudi');
break;
case 5:
console.log(' Vendredi');
break;
case 6:
console.log(' Samedi');
break;
case 7:
console.log(' Dimanche');
break;
default:
Après avoir appris les bases du javasript notre objectif est de mettre en pratique toutes les
notions vues à travers la création du jeu serpent qui nous permettra de mieux assimiler toutes
les notions dans un cadre de projet afin de confronter dans l’avenir aux exigences d’un projet
Introduction au canvas
canvas
<canvas> est un nouvel élément HTML qui peut être utilisé pour dessiner des éléments
graphiques à l'aide de scripts (habituellement JavaScript). Il permet par exemple de dessiner
des graphiques, de réaliser des compositions de photographies ou des animations simples (voire
pas si simples).
Le Document Object Model (DOM) connecte des pages Web à des scripts ou à des langages de
programmation en représentant la structure d'un document.
Le DOM représente un document avec une arborescence logique. Chaque branche de l'arbre se
termine par un nœud et chaque nœud contient des objets. Les méthodes DOM permettent un
accès programmatique à l'arborescence.
Window
Une variable globale window, représentant la fenêtre dans laquelle le script s'exécute, est
exposée au code JavaScript.
window.onload
Syntaxe
Document
L’interface Document représente toute page Web chargée dans le navigateur et sert de point
d'entrée dans le contenu de la page Web, qui est l’arborescence DOM.
L'arbre DOM comprend des éléments tels que <body>et <table>, entre autres.
Il fournit des fonctionnalités globales au document, comme comment obtenir l'URL de la page
et créer de nouveaux éléments dans le document.
L’interface Document décrit les propriétés et méthodes communes à tout type de document.
Document.createElement ()
Syntaxe
appendChild()
appendChild() , méthode pour ajouter un nœud à la fin de la liste des nœuds enfants d'un nœud
parent spécifié.
appendChild()peut être utilisé pour déplacer un nœud enfant existant vers la nouvelle position
dans le document.
Syntaxe :
parentNode.appendChild(childNode);
Syntaxe
Page 62 sur 156
canvas.getContext(typeDeContexte, attributsDeContexte);
typeDeContexte :
CanvasRenderingContext2D.fillStyle
Syntaxe
ctx.fillStyle = color;
ctx.fillStyle = gradient;
ctx.fillStyle = pattern;
Options
La méthode CanvasRenderingContext2D.fillRect()
Syntaxe
Paramètres
Index.html
<!Doctype html>
<html>
<head>
<script src="script.js"></script>
</head>
<body>
</body>
</html>
Script.js
window.onload = function()
canvas.width = 900;
canvas.height = 600;
document.body.appendChild(canvas);
ctx.fillStyle = "#FF0000";
La méthode CanvasRenderingContext2D.clearRect
Syntaxe
Paramètres
Page 65 sur 156
X : La coordonnée sur l'axe des x du point de départ du rectangle.
Méthode setTimeout ()
La méthode setTimeout () appelle une fonction ou évalue une expression après un nombre
spécifié de millisecondes.
Syntaxe
➢ var xCoord = 0;
➢ var yCoord = 0;
index.html
<!Doctype html>
<head>
<script src="script.js"></script>
</head>
<body>
</body>
</html>
Scripts.js
window.onload = function()
var canvas;
var ctx;
var xCoord = 0;
var yCoord = 0;
init();
function init()
canvas.width = 900;
document.body.appendChild(canvas);
ctx = canvas.getContext('2d');
refreshCanvas();
function refreshCanvas()
xCoord += 2;
yCoord += 2;
ctx.clearRect(0,0, canvas.width,canvas.height);
ctx.fillStyle = "#ff0000";
setTimeout (refreshCanvas,delay);
4. Projet serpent
Logique du projet:
nous allons commencer par expliquer la logique de projet , notre canvas sera en quelque sorte
une grille composé de blocs dimmensions égales, chaque bloc se caractérisent par une position
(x,y).
La méthode CanvasRenderingContext2D.save()
L'état du dessin
Syntaxe
void ctx.save();
Syntaxe
La méthode slice()
La méthode slice() renvoie un objet tableau, contenant une copie superficielle (shallow copy)
d'une portion du tableau d'origine, la portion est définie par un indice de début et un indice de
fin (exclus). Le tableau original ne sera pas modifié.
Syntaxe :
arr.slice()
arr.slice(début)
arr.slice(début, fin)
Paramètres
Début (Facultatif)
Fin (Facultatif)
Syntaxe
Paramètres
La méthode pop()
La méthode pop() supprime le dernier élément d'un tableau et retourne cet élément. Cette
méthode modifie la longueur du tableau.
Syntaxe
arr.pop()
Objet Serpent
L’objet serpent va nous permettre de créer notre serpent qui doit avancer dans le jeu pour cela
il aura comme propriéte le body et deux méthodes dessiner et avancer
Snake
Body :[ array]
Draw()
Advance()
Pour mieux cerner le projet des nouvelles variables vont s’ajouter ou d’autres seront modifier :
Script.js
window.onload = function()
var ctx;
var snakee;
init();
function init()
canvas.height = canvasHeight;
document.body.appendChild(canvas);
ctx = canvas.getContext('2d');
refreshCanvas();
function refreshCanvas()
ctx.clearRect(0,0,canvasWidth,canvasHeight);
snakee.advance();
snakee.draw();
setTimeout (refreshCanvas,delay);
// Objet serpent
function Snake(body)
this.body = body;
this.draw = function()
ctx.save();
ctx.fillStyle = "#ff0000";
drawBlock(ctx,this.body[i]);
ctx.restore();
};
this.advance = function ()
nextPosition[0] += 1;
this.body.unshift(nextPosition);
L'événement onkeydown
L'événement onkeydown se produit lorsque l'utilisateur appuie sur une touche (sur le clavier).
Syntaxe
En HTML :
<element onkeydown="myScript">
En JavaScript :
object.onkeydown = function(){myScript};
La propriété keyCode
Syntaxe :
event.keyCode
La méthode indexOf()
La méthode indexOf() renvoie le premier indice pour lequel on trouve un élément donné dans
un tableau. Si l'élément cherché n'est pas présent dans le tableau, la méthode renverra -1.
indexOf compare élémentRecherché aux éléments contenus dans le tableau en utilisant une
égalité stricte (la même méthode utilisée par l'opérateur ===).
arr.indexOf(élémentRecherché)
arr.indexOf(élémentRecherché, indiceDébut)
Paramètres
L'instruction throw
L'instruction throw permet de lever une exception définie par l'utilisateur. Lorsqu'on lève une
exception, expression fournit la valeur de l'exception.
Syntaxe
throw expression;
Analyse du projet
Le serpent doit pouvoir se déplacer en fonction de la direction que le joueur utilise mais faut
noter aussi que cela se fait selon une logique car le serpent est doté d’une tête et une queue.
Faut noter aussi que pour réussir cette phase du projet qui consiste à diriger le serpent nous
allons introduire :
SNAKE
Body
Direction
Avancer ()
Diriger ()
Script.js
window.onload = function()
var ctx;
var snakee;
init();
function init()
canvas.width = canvasWidth;
canvas.height = canvasHeight;
document.body.appendChild(canvas);
ctx = canvas.getContext('2d');
refreshCanvas();
function refreshCanvas()
ctx.clearRect(0,0,canvasWidth,canvasHeight);
snakee.advance();
snakee.draw();
setTimeout (refreshCanvas,delay);
ctx.fillRect(x,y,blockSize,blockSize);
// OBjet serpent
function Snake(body,direction)
this.body = body;
this.direction = direction;
ctx.save();
ctx.fillStyle = "#ff0000";
drawBlock(ctx,this.body[i]);
ctx.restore();
};
this.advance = function ()
switch(this.direction)
case "left":
nextPosition[0] -=1;
break;
case "right":
nextPosition[0] +=1;
break;
nextPosition[1] +=1;
break;
case "up":
nextPosition[1] -=1;
break;
default:
this.body.unshift(nextPosition);
this.body.pop();
};
this.setDirection = function(newDirection)
var allowedDirections;
switch(this.direction)
case "left":
case "right":
allowedDirections = ["up","down"];
break;
case "up":
allowedDirections = ["left","right"];
break;
default:
this.direction = newDirection;
};
var newDirection;
switch(key)
case 37:
break;
case 38:
newDirection = "up";
break;
case 39:
newDirection = "right";
break;
case 40:
newDirection = "down";
break;
default:
return;
snakee.setDirection(newDirection);
La méthode CanvasRenderingContext2D.beginPath()
void ctx.beginPath();
La méthode CanvasRenderingContext2D.arc()
Syntaxe
Paramètres
La méthode CanvasRenderingContext2D.fill()
Syntaxe
void ctx.fill([fillRule]);
➢ "nonzero": La règle de remplissage extérieur/intérieur non nul, qui est la règle par
défaut.
➢ "evenodd": La règle de remplissage pair/impair.
➢ Créer l’objet pomme qui est composé du paramètre position [function Apple(position)]
dons elle sera composé de la propriété [this.position = position;] et de méthodes
[this.draw = function ()]
➢ Créer la variable générale appelé applee [var applee;]
➢ Initialiser la variable [var applee;] au niveau de la fonction d’initialisation : applee =
new Apple([10,10]);
➢ Au niveau de fonction rafraichir on va appeler la méthode dessiner de l’objet Pomme :
applee.draw();
Apple
Position
Dessiner ()
Scripts.js
window.onload = function()
var ctx;
var snakee;
var applee;
init();
function init()
canvas.width = canvasWidth;
canvas.height = canvasHeight;
document.body.appendChild(canvas);
ctx = canvas.getContext('2d');
function refreshCanvas()
ctx.clearRect(0,0,canvasWidth,canvasHeight);
snakee.advance();
snakee.draw();
applee.draw();
setTimeout (refreshCanvas,delay);
ctx.fillRect(x,y,blockSize,blockSize);
// Objet serpent
function Snake(body,direction)
this.direction = direction;
this.draw = function()
ctx.save();
ctx.fillStyle = "#ff0000";
drawBlock(ctx,this.body[i]);
ctx.restore();
};
this.advance = function ()
switch(this.direction)
case "left":
nextPosition[0] -=1;
break;
case "right":
break;
case "down":
nextPosition[1] +=1;
break;
case "up":
nextPosition[1] -=1;
break;
default:
this.body.unshift(nextPosition);
this.body.pop();
};
this.setDirection = function(newDirection)
var allowedDirections;
switch(this.direction)
case "left":
case "right":
break;
case "down":
case "up":
allowedDirections = ["left","right"];
break;
default:
this.direction = newDirection;
};
// Objet pomme
function Apple(position)
this.position = position;
this.draw = function ()
ctx.fillStyle = "#00FF00";
ctx.beginPath();
ctx.arc(x,y,radius,0,Math.PI*2,true);
ctx.fill();
ctx.restore();
};
var newDirection;
switch(key)
case 37:
newDirection = "left";
break;
newDirection = "up";
break;
case 39:
newDirection = "right";
break;
case 40:
newDirection = "down";
break;
default:
return;
snakee.setDirection(newDirection);
Dans ce projet l’objectif est d’empêcher le serpent de sortir des murs et même de l’éviter
d’entrer en collision avec les murs par la suite nous verrons aussi qu’il ne doit pas entrer en
collisions avec lui-même pour commencer notre projet nous allons nous intéresser à l’objet
serpent en introduisant une nouvelle méthode qui sera vérifier_collisions voici le schéma de
l’objet serpent :
function refreshCanvas()
snakee.advance();
if(snakee.checkCollision())
//GAME OVER
else
ctx.clearRect(0,0,canvasWidth,canvasHeight);
snakee.draw();
setTimeout (refreshCanvas,delay);
Script.js
window.onload = function()
var ctx;
var snakee;
var applee;
init();
function init()
canvas.width = canvasWidth;
canvas.height = canvasHeight;
document.body.appendChild(canvas);
ctx = canvas.getContext('2d');
refreshCanvas();
function refreshCanvas()
snakee.advance();
if(snakee.checkCollision())
//GAME OVER
else
ctx.clearRect(0,0,canvasWidth,canvasHeight);
snakee.draw();
applee.draw();
setTimeout (refreshCanvas,delay);
ctx.fillRect(x,y,blockSize,blockSize);
// Objet serpent
function Snake(body,direction)
this.body = body;
this.direction = direction;
this.draw = function()
ctx.save();
ctx.fillStyle = "#ff0000";
drawBlock(ctx,this.body[i]);
ctx.restore();
};
switch(this.direction)
case "left":
nextPosition[0] -=1;
break;
case "right":
nextPosition[0] +=1;
break;
case "down":
nextPosition[1] +=1;
break;
case "up":
nextPosition[1] -=1;
break;
default:
this.body.unshift(nextPosition);
this.body.pop();
};
this.setDirection = function(newDirection)
var allowedDirections;
switch(this.direction)
case "left":
case "right":
allowedDirections = ["up","down"];
break;
case "down":
case "up":
allowedDirections = ["left","right"];
break;
default:
this.direction = newDirection;
};
this.checkCollision = function()
var minX = 0;
var minY = 0;
if(isNotBetweenHorizontalWalls || isNotBetweenVerticalWalls)
wallCollision = true;
snakeCollision = true;
};
function Apple(position)
this.position = position;
this.draw = function ()
ctx.save();
ctx.fillStyle = "#00FF00";
ctx.beginPath();
ctx.arc(x,y,radius,0,Math.PI*2,true);
ctx.fill();
ctx.restore();
};
var newDirection;
switch(key)
newDirection = "left";
break;
case 38:
newDirection = "up";
break;
case 39:
newDirection = "right";
break;
case 40:
newDirection = "down";
break;
default:
return;
snakee.setDirection(newDirection);
L'objet Math
L'objet Math est un objet natif dont les méthodes et propriétés permettent l'utilisation de
constantes et fonctions mathématiques. Cet objet n'est pas une fonction.
La fonction Math.round()
La fonction Math.round() retourne la valeur d'un nombre arrondi à l'entier le plus proche.
Syntaxe
Paramètres :
X : Un nombre.
La fonction Math.random()
Syntaxe
Math.random()
Conception du projet
D’un point de vue analytique, on peut affirmer que ce projet consistera à de manger la pomme
et chaque fois qu’il consomme le serpent se verra allonger d’un blocs cette analyse nous amène
à procéder à certaine étape :
if(snakee.EatApple(applee))
snakee.ateApple = true;
do
applee.setNewPosition();
while(applee.isOnSnake(snakee))
this.EatApple = function(appleToEat)
return true;
else
return false;
};
if(!this.ateApple)
this.body.pop();
else
this.ateApple = false;
Body : string
Direction : string
Mangé_serpent : booléen
Déssiner()
Avancer()
Diriger()
Vérifier_Collision()
Manger_Pomme()
➢ La seconde consiste à éviter la position de la pomme qui est définir de manière aléatoire
se retrouve sur le serpent [this.isOnSnake = function(snakeToCheck)]
this.isOnSnake = function(snakeToCheck)
{
var isOnSnake = false;
for(var i = 0; i < snakeToCheck.body.length; i++)
{
if(this.position[0] === snakeToCheck.body[i][0] && this.position[1] ===
snakeToCheck.body[i][1] )
{
isOnSnake = true;
}
Nous aurons une actualisation de certaines variables au niveau la méthodes dessiner [this.draw
= function ()] :
Pomme
Position : [string]
Dessiner()
Avancer()
Verifier_Collision()
Manger_Pomme()
Script.js
window.onload = function()
var ctx;
var snakee;
var applee;
init();
function init()
canvas.width = canvasWidth;
canvas.height = canvasHeight;
document.body.appendChild(canvas);
ctx = canvas.getContext('2d');
refreshCanvas();
function refreshCanvas()
snakee.advance();
//GAME OVER
else
if(snakee.EatApple(applee))
snakee.ateApple = true;
do
applee.setNewPosition();
while(applee.isOnSnake(snakee))
ctx.clearRect(0,0,canvasWidth,canvasHeight);
snakee.draw();
applee.draw();
setTimeout (refreshCanvas,delay);
ctx.fillRect(x,y,blockSize,blockSize);
// Objet serpent
function Snake(body,direction)
this.body = body;
this.direction = direction;
this.ateApple = false;
this.draw = function()
ctx.save();
ctx.fillStyle = "#ff0000";
drawBlock(ctx,this.body[i]);
};
this.advance = function ()
switch(this.direction)
case "left":
nextPosition[0] -=1;
break;
case "right":
nextPosition[0] +=1;
break;
case "down":
nextPosition[1] +=1;
break;
case "up":
nextPosition[1] -=1;
break;
default:
this.body.unshift(nextPosition);
if(!this.ateApple)
this.body.pop();
else
this.ateApple = false;
};
this.setDirection = function(newDirection)
var allowedDirections;
switch(this.direction)
case "left":
case "right":
allowedDirections = ["up","down"];
break;
case "down":
allowedDirections = ["left","right"];
break;
default:
this.direction = newDirection;
};
this.checkCollision = function()
var minX = 0;
var minY = 0;
if(isNotBetweenHorizontalWalls || isNotBetweenVerticalWalls)
wallCollision = true;
snakeCollision = true;
};
this.EatApple = function(appleToEat)
return true;
else
return false;
};
// Objet pomme
function Apple(position)
this.position = position;
this.draw = function ()
ctx.save();
ctx.fillStyle = "#00FF00";
ctx.beginPath();
ctx.fill();
ctx.restore();
};
this.setNewPosition = function()
this.position =[newX,newY];
};
this.isOnSnake = function(snakeToCheck)
isOnSnake = true;
return isOnSnake;
var newDirection;
switch(key)
case 37:
newDirection = "left";
break;
case 38:
newDirection = "up";
break;
case 39:
newDirection = "right";
break;
case 40:
newDirection = "down";
break;
return;
snakee.setDirection(newDirection);
La méthode CanvasRenderingContext2D.fillText()
Syntaxe
Paramètres
Texte : Le texte à représenter en utilisant les valeurs en cours de fond, textAlign, textBaseline,
et de direction.
D’un point de vue analytique le game over suppose que la partie est terminé et affiche votre
score en fonction du nombre de pomme manger avant que le serpent entre en collision
Au niveau de la variable globale, nous allons introduire une nouvelle variable score [var score;]
function restart()
score = 0;
refreshCanvas();
function drawScore()
ctx.save()
ctx.fillText(score.toString(),5,canvasHeight - 5);
ctx.restore()
function GameOver()
ctx.save()
ctx.fillText("PARTIE TERMINEE",5,20);
ctx.restore()
Au niveau de la création des boutons nous allons définir la touche espace pour appeler la
fonction reprise :
case 32:
restart()
return;
Scripts.js
window.onload = function()
var ctx;
var snakee;
var applee;
var score;
init();
function init()
canvas.width = canvasWidth;
canvas.height = canvasHeight;
document.body.appendChild(canvas);
ctx = canvas.getContext('2d');
score = 0;
refreshCanvas();
function refreshCanvas()
snakee.advance();
if(snakee.checkCollision())
GameOver()
else
if(snakee.EatApple(applee))
score++;
do
applee.setNewPosition();
while(applee.isOnSnake(snakee))
ctx.clearRect(0,0,canvasWidth,canvasHeight);
snakee.draw();
applee.draw();
drawScore();
setTimeout (refreshCanvas,delay);
//fonction recommencer
function restart()
score = 0;
refreshCanvas();
// fonction score
function drawScore()
ctx.save()
ctx.fillText(score.toString(),5,canvasHeight - 5);
ctx.restore()
function GameOver()
ctx.save()
ctx.fillText("PARTIE TERMINEE",5,20);
ctx.restore()
ctx.fillRect(x,y,blockSize,blockSize);
// Objet serpent
function Snake(body,direction)
this.body = body;
this.ateApple = false;
this.draw = function()
ctx.save();
ctx.fillStyle = "#ff0000";
drawBlock(ctx,this.body[i]);
ctx.restore();
};
this.advance = function ()
switch(this.direction)
case "left":
nextPosition[0] -=1;
break;
case "right":
nextPosition[0] +=1;
break;
case "down":
break;
case "up":
nextPosition[1] -=1;
break;
default:
this.body.unshift(nextPosition);
if(!this.ateApple)
this.body.pop();
else
this.ateApple = false;
};
this.setDirection = function(newDirection)
var allowedDirections;
switch(this.direction)
case "left":
allowedDirections = ["up","down"];
break;
case "down":
case "up":
allowedDirections = ["left","right"];
break;
default:
this.direction = newDirection;
};
this.checkCollision = function()
var minX = 0;
if(isNotBetweenHorizontalWalls || isNotBetweenVerticalWalls)
wallCollision = true;
snakeCollision = true;
};
this.EatApple = function(appleToEat)
return true;
else
return false;
};
// Objet pomme
function Apple(position)
this.position = position;
this.draw = function ()
ctx.save();
ctx.fillStyle = "#00FF00";
ctx.beginPath();
ctx.arc(x,y,radius,0,Math.PI*2,true);
ctx.fill();
ctx.restore();
};
this.position =[newX,newY];
};
this.isOnSnake = function(snakeToCheck)
isOnSnake = true;
return isOnSnake;
};
var newDirection;
case 37:
newDirection = "left";
break;
case 38:
newDirection = "up";
break;
case 39:
newDirection = "right";
break;
case 40:
newDirection = "down";
break;
case 32:
restart()
return;
default:
return;
snakee.setDirection(newDirection);
Ce projet nous permettra de mettre en pratiques comment utiliser les styles en javascript nous
procéderons comme suite :
Au niveau de la fonction d’initiation nous utiliserons certaines propriétés de styles pour définir :
➢ drawScore();
➢ snakee.draw();
➢ applee.draw();
Au niveau de la fonction score, fonction partie terminée nous allons définir certains styles :
La propriété CanvasRenderingContext2D.font
Syntaxe
ctx.font = value;
La propriété CanvasRenderingContext2D.textAlign
Syntaxe
Options
Valeurs possibles :
Start : Le texte est aligné au début normal de la ligne (aligné à gauche pour les systèmes
d'écriture de gauche à droite, aligné à droite pour les systèmes d'écriture de droite à gauche).
End : Le texte est aligné à la fin normale de la ligne (aligné à droite pour les systèmes d'écriture
de gauche à droite, aligné à gauche pour les systèmes d'écriture de droite à gauche)
La propriété CanvasRenderingContext2D.textBaseline
Options
Valeurs possibles :
Ideographic : La ligne de base du texte est la ligne de base idéographique ; c'est le bas du corps
des caractères, si le corps principal des caractères fait saillie en dessous de la ligne de base
alphabétique.
Bottom : La ligne de base du texte est le bas du cadre. Cela diffère de ligne de base
idéographique en ce que la ligne de base idéographique ne prend pas en considération les
jambages.
La propriété CanvasRenderingContext2D.strokeStyle
Syntaxe
ctx.strokeStyle = color;
ctx.strokeStyle = pattern;
Options
La propriété CanvasRenderingContext2D.lineWidth
Syntaxe
La méthode CanvasRenderingContext2D.strokeText()
Syntaxe
Paramètres
Texte : Le texte à tracer en utilisant les valeurs en cours de font, textAlign, textBaseline, et
direction.
Scripts.js
window.onload = function()
Page 131 sur 156
{
var ctx;
var snakee;
var applee;
var score;
init();
function init()
canvas.width = canvasWidth;
canvas.height = canvasHeight;
canvas.style.display = "block";
canvas.style.backgroundColor ="#000000";
ctx = canvas.getContext('2d');
score = 0;
refreshCanvas();
function refreshCanvas()
snakee.advance();
if(snakee.checkCollision())
GameOver()
else
if(snakee.EatApple(applee))
score++;
snakee.ateApple = true;
do
applee.setNewPosition();
while(applee.isOnSnake(snakee))
ctx.clearRect(0,0,canvasWidth,canvasHeight);
drawScore();
snakee.draw();
applee.draw();
setTimeout (refreshCanvas,delay);
//fonction recommencer
function restart()
score = 0;
refreshCanvas();
// fonction score
function drawScore()
ctx.save()
ctx.fillStyle = "#FFFF00";
ctx.textBaseline = "middle";
ctx.fillText(score.toString(),centreX,centreY);
ctx.restore()
function GameOver()
ctx.save()
ctx.fillStyle = "#0000FF";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.strokeStyle = "#FFFFFF";
ctx.lineWidth = 5;
ctx.fillRect(x,y,blockSize,blockSize);
// Objet serpent
function Snake(body,direction)
this.body = body;
this.direction = direction;
this.ateApple = false;
this.draw = function()
ctx.save();
ctx.fillStyle = "#ff0000";
drawBlock(ctx,this.body[i]);
ctx.restore();
this.advance = function ()
switch(this.direction)
case "left":
nextPosition[0] -=1;
break;
case "right":
nextPosition[0] +=1;
break;
case "down":
nextPosition[1] +=1;
break;
case "up":
nextPosition[1] -=1;
break;
default:
this.body.unshift(nextPosition);
if(!this.ateApple)
else
this.ateApple = false;
};
this.setDirection = function(newDirection)
var allowedDirections;
switch(this.direction)
case "left":
case "right":
allowedDirections = ["up","down"];
break;
case "down":
case "up":
allowedDirections = ["left","right"];
break;
default:
this.direction = newDirection;
};
this.checkCollision = function()
var minX = 0;
var minY = 0;
if(isNotBetweenHorizontalWalls || isNotBetweenVerticalWalls)
wallCollision = true;
snakeCollision = true;
};
this.EatApple = function(appleToEat)
return true;
else
return false;
};
// Objet pomme
function Apple(position)
this.position = position;
ctx.save();
ctx.fillStyle = "#00FF00";
ctx.beginPath();
ctx.arc(x,y,radius,0,Math.PI*2,true);
ctx.fill();
ctx.restore();
};
this.setNewPosition = function()
this.position =[newX,newY];
};
this.isOnSnake = function(snakeToCheck)
isOnSnake = true;
return isOnSnake;
};
var newDirection;
switch(key)
case 37:
newDirection = "left";
break;
case 38:
newDirection = "up";
break;
case 39:
newDirection = "right";
break;
case 40:
break;
case 32:
restart()
return;
default:
return;
snakee.setDirection(newDirection);
La méthode clearInterval()
Syntaxe
scope.clearInterval(intervalID)
Page 143 sur 156
Paramètres
intervalID : L'identifiant de l'intervalle de répétition qu'on souhaite annuler. Cet identifiant est
renvoyé lorsqu'on appelle setInterval() pour définir l'intervalle de répétition.
Code final
Index.html
<!Doctype html>
<html>
<head>
<script src="script.js"></script>
</head>
<body>
</body>
</html>
Scripts.js
window.onload = function()
var ctx;
var snakee;
var applee;
var score;
var timeout;
init();
function init()
canvas.width = canvasWidth;
canvas.height = canvasHeight;
canvas.style.display = "block";
canvas.style.backgroundColor ="#000000";
document.body.appendChild(canvas);
ctx = canvas.getContext('2d');
score = 0;
refreshCanvas();
function refreshCanvas()
snakee.advance();
if(snakee.checkCollision())
GameOver()
else
if(snakee.EatApple(applee))
score++;
snakee.ateApple = true;
do
applee.setNewPosition();
while(applee.isOnSnake(snakee))
drawScore();
snakee.draw();
applee.draw();
//fonction recommencer
function restart()
score = 0;
clearInterval(timeout);
refreshCanvas();
// fonction score
function drawScore()
ctx.save()
ctx.fillStyle = "#FFFF00";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.fillText(score.toString(),centreX,centreY);
ctx.restore()
function GameOver()
ctx.save()
ctx.fillStyle = "#0000FF";
ctx.textAlign = "center";
ctx.textBaseline = "middle";
ctx.strokeStyle = "#FFFFFF";
ctx.lineWidth = 5;
ctx.restore()
ctx.fillRect(x,y,blockSize,blockSize);
// Objet serpent
function Snake(body,direction)
this.body = body;
this.direction = direction;
this.ateApple = false;
this.draw = function()
ctx.save();
ctx.fillStyle = "#ff0000";
drawBlock(ctx,this.body[i]);
ctx.restore();
};
this.advance = function ()
switch(this.direction)
case "left":
nextPosition[0] -=1;
break;
case "right":
nextPosition[0] +=1;
break;
case "down":
nextPosition[1] +=1;
break;
case "up":
nextPosition[1] -=1;
break;
default:
this.body.unshift(nextPosition);
if(!this.ateApple)
this.body.pop();
this.ateApple = false;
};
this.setDirection = function(newDirection)
var allowedDirections;
switch(this.direction)
case "left":
case "right":
allowedDirections = ["up","down"];
break;
case "down":
case "up":
allowedDirections = ["left","right"];
break;
default:
this.direction = newDirection;
};
this.checkCollision = function()
var minX = 0;
var minY = 0;
if(isNotBetweenHorizontalWalls || isNotBetweenVerticalWalls)
wallCollision = true;
};
this.EatApple = function(appleToEat)
return true;
else
return false;
};
// Objet pomme
function Apple(position)
this.position = position;
this.draw = function ()
ctx.save();
ctx.fillStyle = "#00FF00";
ctx.beginPath();
ctx.arc(x,y,radius,0,Math.PI*2,true);
ctx.fill();
ctx.restore();
};
this.setNewPosition = function()
this.position =[newX,newY];
};
this.isOnSnake = function(snakeToCheck)
return isOnSnake;
};
var newDirection;
switch(key)
case 37:
newDirection = "left";
break;
case 38:
newDirection = "up";
break;
case 39:
newDirection = "right";
break;
case 40:
newDirection = "down";
case 32:
restart()
return;
default:
return;
snakee.setDirection(newDirection);