Categories
Apprentissage Database Découverte Formation SQL Web

Base de données avec mySQL

Milieu de formation, fin des cours sur le front !
Nous passons donc sur les connaissances à avoir pour un développeur back…

Le rôle du développeur back est de manipuler les données puis de les envoyer au front pour qu’elles s’affichent.
A noter que le format d’envoi de ces données est le JSON (JavaScript Object Notation).
Le stockage des données se fait à l’aide d’une base de données.

Qu’est ce qu’une base de données ?

Logo SQL - base de données

Une base de données peut être comparée à un grand tableur excel en plus poussé : le nom du fichier excel correspond à la base de données, les feuilles (ou onglets) aux tables de la base de données ; les colonnes correspondent aux champs et les lignes aux entrées de la base de données.

Pour utiliser la base de données et récupérer les informations qu’elle contient, il faut faire des requêtes. Pour cela, on utilise le langage SQL (Structured Query Langage). Ce langage permet de regrouper toutes les requêtes et de les afficher de façon lisible pour un humain !
Les requêtes sont dites simples quand elles concernent une recherche spécifique dans une table. Elles sont dites complexes quand la recherche se fait sur plusieurs tables combinées.

La finalité d’une base de données est d’avoir des données les plus génériques possible. Ce qui permet ensuite de pouvoir faire n’importe quel type de table.

mySQL

Il existe différentes façon de faire des bases de données.
Ma formation est axée sur mySQL : il peut y avoir de nombreux champs et c’est une base de données très puissante pour manipuler de nombreuses données. mySQL est très performante pour indexer les données.

En base de données, on travaille toujours en « case insensitive » (il faut donc bien penser à indiquer que la base de données est encodée en utf8_general_ci). En effet, lorsque l’on cherche à enregistrer/récupérer une donnée on ne peut pas obliger l’utilisateur à l’écrire d’une façon qui nous convient !

Création d’une base de données et de ses tables
Base de données

Pour créer une base de données, l’appel est simple :

CREATE DATABASE IF NOT EXISTS nom_base;
USE nom_base;

Si une base de données existe déjà, il y a une erreur et la lecture du script s’arrête. Pour éviter et maîtriser ces erreurs, il faut bien penser à ajouter IF NOT EXISTS juste avant le nom de la base.

Table

Pour créer une table, on écrira :

CREATE TABLE IF NOT EXISTS Animal (
    id          SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    espece      VARCHAR(40) NOT NULL,
    sexe        CHAR(1),
    birthdate   DATETIME NOT NULL,
    nom         VARCHAR(30),
    commentaires TEXT,
    PRIMARY KEY (id)
)
ENGINE=INNODB;
Typage des variables

Attention : Il faut bien typer les variables !

  • Pour les chiffres INT :
    SMALLINT
    MEDIUMINT
    Sachant qu’un integer fait 4 bytes, le chiffre 1 par ex fait quelques octets. Donc pour un ID on va préférer un SMALLINT!
    FLOAT
    DECIMAL
    A noter que FLOAT et DECIMAL fonctionnent pareil : on met entre parenthèses le nombre de chiffres total puis le nombre de chiffres après la virgule. La différence est que FLOAT va trouver une fraction qui se rapproche le plus du nombre inscrit ds la base de données, on va donc manquer de précision (la somme des cellules sera ensuite un arrondi et non pas la somme exacte). DECIMAL est quand à lui plus lourd mais il garde le chiffre exact.
    NOT NULL : défini que l’on n’a pas le droit d’ajouter une ligne qui aurait ce champ vide.
    UNSIGNED : on l’ajoute pour n’avoir que des chiffres positifs.
    AUTO_INCREMENT : permet d’ajouter un élément qui va s’auto incrémenter.
  • Pour les chaines de caractères TEXT :
    SMALLTEXT
    MEDIUMTEXT
    CHAR : indique le nombre de caractères. Si le nombre de caractères de la donnée est plus petit alors SQL complète en espaces blancs.
    VARCHAR : utilisé pour moins de 250 caractères. On précise alors le nombre de caractères.
    A noter que TEXT n’est pas optimisé pour la recherche, alors que VARCHAR l’est car il est limité en nombre de caractères.
    Il est donc très important de prévoir en amont la taille maxi des données pour alléger la table.
  • Pour les dates, on a le choix :
    DATE
    DATETIME
    TIMESTAMP : la date est convertie en secondes depuis le  01/01/1970. Cela permet un calcul rapide (et facile) des écarts entre deux dates. Les conversions sont aussi plus aisées (en fonction des formats de chaque pays par ex.). Et cela permet une manipulation facile des dates.
Fin de création

On fini la création de la Table avec :
PRIMARY KEY : la clé primaire est la clé d’indexation de la table. C’est ce qui va la rendre unique (on préférera alors utiliser comme clé primaire l’id de la table !).
Attention, comme elle est écrite à la fin de la table (donc avant la fermeture de la parenthèse), on ne met pas de virgule après !
ENGINE=INNODB : c’est la configuration du moteur de la base de données.
CHARACTER SET=utf8 ou DEFAULT CHARACTER SET : correspond au charset (configuration des caractères d’écriture).

Autres types d’affichage
SHOW DATABASES;

Cette commande permet de voir quelles sont les bases de données qui existent dans le fichier.

SHOW TABLES;

Cela permet de voir quelles sont les tables qui existent ds la base de données en cours d’utilisation.

DESCRIBE nomTable;

Cette commande permet de voir tous les champs d’une table.

Effectuer une requête SQL

la requête de base s’effectue à l’aide des mots clés SQL :
SELECT (liste des champs à afficher / avec une virgule entre eux / s’affiche ds l’ordre écrit)
FROM (table visée mises entre guillemets inversés « )
Cette requête permet d’afficher une liste de données.
– On fini toujours la requête par un point virgule ;

L’ordre d’écriture de la requête est important. On effectue d’abord une gestion des champs, puis de la table, puis de ce que l’on recherche et enfin du tri souhaité.

SELECT  champ1, champ2
FROM    tableName;

Pour sélectionner tous les champs, on utilise l’astérisque :

SELECT  *
FROM    tableName
Affiner une requête

Il est possible d’affiner la requête en ajoutant :
WHERE : on ajoute alors le champ de recherche et la valeur recherchée avec un = (ou < ou > ou <= ou =>).
Dans ce cas là, la recherche se porte sur la valeur exacte écrite.

On peut aussi utiliser BETWEEN pour un intervalle, NOT pour mettre l’inverse, et on peut cumuler avec AND.

Pour être moins précis et élargir la recherche, ou pour faire en sorte que la case de la donnée ne soit pas prise en compte on utilise : LIKE après WHERE puis la recherche entre guillemets à laquelle on ajoute la wildcard (%) avant, après ou les 2 en fonction de là où on veut que ce soit « flou ».

Trier la recherche

Il est aussi possible de trier la recherche. On ajoute alors :
ORDER BY : on indique comment se fait le tri, et dans quel ordre (ascendant ASC (du plus petit au plus grand) ou descendant (du plus grand au plus petit) avec DESC).
LIMIT / OFFSET : tri entre 2 bornes. On peut aussi l’écrire 0, 4 pour les 4 éléments à partir de l’index 0.
DISTINCT : à placer dans SELECT, pour supprimer les doublons

Autres variations

On peut aussi imbriquer des requêtes, toujours en gardant l’ordre et en mettant la deuxième requête entre parenthèses.

Important : il faut aller progressivement ds la rédaction des requêtes pour vérifier qu’à chaque étape tout fonctionne correctement !

Mise à jour de champs
UPDATE nomTable SET champ1 = "nouvelle valeur", champ2 = "nouvelle valeur";

Cette requête va changer d’un coup tous les champs ciblés. Il faut donc bien penser à pointer la ligne sélectionnée :

UPDATE nomTable SET champ1 = "nouvelle valeur", champ2 = "nouvelle valeur" 
WHERE id = 2;
Effacer
DELETE FROM nomTable;

Cette requête va vider toute la table et il n’y a pas moyen de revenir en arrière !!! Donc bien penser à cibler :

DELETE FROM nomTable WHERE id = 21;
Les jointures

Quand on fait une base de données, on essaye de dupliquer le moins possible les données. C’est plus léger, moins redondant et permet une mise à jour plus aisée.
Pour voir ce qu’il y a dans les différentes tables, on fait une jointure avec INNER JOIN

SELECT *
FROM table
INNER JOIN table2 ON table1.champ = table2.champ;

La table 2 se rajoute à la fin de la table 1, à condition que les deux champs correspondent entre eux !
Quand on cherche à faire une jointure entre deux tables avec des champs dont le nom est identique, il faut absolument éviter les ambiguïtés. Dans tous les cas, il faut penser à bien mettre le nom de la table avant le champ (table.champ).

Il est possible de modifier l’intitulé des champs à ce moment là :

SELECT table1.champ1 as "Nom Générique du champ1"
              table1.champ2 as "Nom Générique du champ2"
              table2.champ2 as "Nom Générique du champ2bis"
FROM table
INNER JOIN table2 ON table1.champ3 = table2.champ3;
INNER JOIN

C’est une jointure fermée qui ne récupère pas de données s’il n’y a pas de croisements. La jointure ne se fait que s’il y a des données « jointables » des 2 cotés.

LEFT JOIN

« La table 1 est à gauche de table 2 »
Affiche toutes les données de la table gauche même si à droite il n’y a rien à faire correspondre.

LEFT JOIN ... WHERE table2.champ IS NULL

Ici, on affiche tous les éléments de la table 1 qui n’ont pas de liens avec la table 2.

RIGHT JOIN

idem que LEFT JOIN mais avec la table de droite !

CONSEIL : il est préférable de ne faire que des LEFT JOIN pour garder les repères lors de la jointure des tables !

Les fonctions d’agrégation

Ces fonctions retournent une valeur unique et non une liste d’entrées. En effet, elles permettent d’agréger des résultats en une seule donnée et le résultat de ces fonctions est alors un sous dossier des champs agrégés.
Elles sont bien expliquées sur le site de w3schools .

On distingue différents types de fonctions.

  • Les fonctions numériques :
    AVG(), COUNT(), MAX(), MIN(), SUM()
    – Possibilité de faire des arrondis : ROUND() supérieur par défaut / FLOOR() arrondi inférieur / CEIL()
  • Les fonctions scalaires :
    – Possibilité d’afficher le texte différemment. Par exemple UPPER()
    – Il est possible de faire des recherches de string avec SUBSTR()
  • Les fonctions de dates :
    NOW() , par exemple, qui est une fonction qui donne la date du jour.
  • GROUP BY : il permet de regrouper plusieurs champs (dont certains sont agrégés) en fonction d’un champ défini.
SELECT  champ1, count(*) as 'Nombre de résultats'
FROM    tableName
GROUP BY champ1

J’ai appris beaucoup de nouvelles notions. Et bien qu’ayant l’habitude de manipuler des tableurs, la création et la manipulation d’une base de donnée sont de grandes nouveautés pour moi !
Et ce n’est pas fini !!! 😉

Categories
Apprentissage CSS Découverte Formation HTML Javascript Web

Les bibliothèques logicielles

Les bibliothèques logicielles (libraries en anglais) sont là pour aider le développeur à coder un site plus rapidement. Les libraries sont donc des facilitateurs de travail. En effet, elles permettent en très peu de lignes de code d’ajouter de multiples fonctions lors du développement d’un site (ou application) web.

Je vais donc vous faire une liste (non exhaustive) des différentes bibliothèques logicielles – basées sur JavaScript – que j’ai vu lors de la formation.

jQuery

Une des bibliothèques logicielles les plus connues pour JavaScript est jQuery. Et son slogan illustre très bien ce qu’une library apporte au développeur :

write less, do more

jQuery

Ajouter jQuery consiste à charger un script supplémentaire dans le fichier HTML.
C’est un fichier qui a déjà plein de fonctions écrites et dont on pourra se servir pour nos propres scripts (on ajoute donc ce script avant le script de notre propre fichier JS).

Tout comme en JavaScript, jQuery permet de cibler des éléments du DOM pour leur ajouter une action (événement, modification du CSS, etc.). Il permet aussi d’ajouter des animations pré-construites permettant de dynamiser encore plus le site.

jQuery UI

Cette bibliothèque logicielle permet entre-autre de venir compléter jQuery.
En effet, cette library apporte des interactions avec l’utilisateur, des widgets et des effets pré-construits qui ciblent plus particulièrement les formulaires (mais peuvent aussi être utilisées autrement !).
Elle propose aussi des thèmes dont on peut s’inspirer.

Bootstrap

J’en ai déjà parlé, Boostrap est un framework CSS.
Et c’est aussi une library JavaScript.
Elle fonctionne avec les scripts jQuery et PoperJS et permet d’ajouter de nombreux components aux pages HTML.
Ces derniers sont dynamiques, ils utilisent des classes spéciales ; ce qui évite donc d’ajouter des scripts perso.

FancyBox

Cette bibliothèque permet de créer un zoom en cliquant sur une image ou une vidéo et de faire un déroulé d’images.
Elle fonctionne simplement : les images sur toute la page sont de basse qualité. Puis quand on clique dessus, un effet zoom se déclenche et ouvre une image de qualité supérieure.
Cette library permet d’optimiser les temps de chargement des pages contenant de nombreux fichiers multimédias.

Masonry

Cette bibliothèque permet, lorsqu’il y a des images de tailles différentes, de réorganiser les éléments pour les placer de la meilleure façon.
Cette library recalcule donc les tailles de toutes les images.

Isotope

C’est une bibliothèque qui permet de faire du tri visuel dans les éléments.
(Elle permet aussi d’ajouter une mise en page d’images.
)

Hammer.js

Cette bibliothèque permet de gérer des gestures tactiles : elle créée de nouveaux événements entièrement dédiés au tactile.

Autres librairies 

  • Animate CSS et Anime JS
    Ces deux bibliothèques logicielles permettent d’ajouter des animations très poussées sur un site.
  • Leaflet
    C’est une library qui permet d’ajouter de la cartographie sur un site.
  • PixiJS
    Cette bibliothèque permet de faire de la gestion 2D pur les images, les jeux. C’est un moteur de rendus qui utilise les canvas.
    (elle est assez complexe à prendre en main, je la recommande à des développeur plus aguerris !).
  • AOS (Animate On Scroll)
    Comme son acronyme le mentionne, cette library permet d’ajouter des animations lors d’un scroll.
  • Container player
    C’est une bibliothèque qui permet d’ajouter des vidéos en background.
  • Progressively
    Cette library permet tout simplement de charger progressivement les images.

Voici donc un petit tour d’horizon des différentes libraries que j’ai pu voir lors de ma formation.
Si vous en connaissez ou utilisez d’autres, venez les partager en commentaires ! 🙂

Categories
Conseil Découverte Javascript

FizzBuzz… Mais qu’est ce que c’est ?

Le « FizzBuzz » est à l’origine un jeu pour apprendre aux enfants le principe de la division. Les enfants doivent énoncer les chiffres dans l’ordre et remplacer le nombre par « Fizz » s’il est divisible par 3 ou « Buzz » s’il est divisible par 5.

Et en quoi ça me concerne ?

Dans le monde des développeurs, ce jeu est repris sous forme de test.
Lors d’un entretien d’embauche, ce test peut être proposé parmi d’autres tests techniques.  Il permet à l’employeur de vérifier si, sous environ 15 minutes, le candidat est capable d’écrire ce programme dans le langage demandé.

J’ai eu à faire cet exercice lors du cours sur OpenClassrooms que je suis actuellement : Apprenez à coder avec JavaScript.

Alors, on programme ?

L’énoncé est simple :
Écrivez un programme qui affiche tous les nombres entre 1 et 100 avec les exceptions suivantes :
Il affiche :
– « Fizz » à la place du nombre si celui-ci est divisible par 3.
– « Buzz » à la place du nombre si celui-ci est divisible par 5 et non par 3.
– « FizzBuzz » à la place du nombre si celui-ci est divisible à la fois par 3 et par 5.

Pour réussir, il faut utiliser l’opérateur modulo « % » qui renvoie le reste de la division d’un entier par un autre. Plus simplement si un chiffre est divisible par un autre, le reste est nul :

10 % 2 => 0 (divisible)
alors que 
5 % 2 => 1 (non divisible)

Je vous laisse chercher le programme en JavaScript…
Avec un peu de recherche, je suis sure que vous allez trouver la solution !!! 😉

N’allez pas plus loin… Entraînez-vous avant !


Allez je partage avec vous ma solution en JavaScript…

let i=1;

while (i <= 100) {
  if ((i % 3 === 0) && (i % 5 === 0)) {
    console.log("FizzBuzz");
    } else if (i % 3 === 0) {
      console.log("Fizz");
      } else if (i % 5 === 0) {
        console.log("Buzz");
        } else {
          console.log(i);
        }
  i++;
}
Categories
Apprentissage Découverte Raspberry Pi

Découverte du Raspberry Pi 4B

Aujourd’hui, j’ai enfin fait la découverte et le montage du Raspberry Pi 4B que j’ai eu à Noël !

Contenu coffret LABISTS Raspberry Pi 4 - Espace Raspberry

Et ce ne fut pas une mince affaire… 😉

Heureusement que YouTube existe…

En effet, dans mon kit de démarrage, il n’y avait pas de notice de montage. Aïe, pour une débutante la tâche me semblait ardue !

J’ai donc cherché sur YouTube une vidéo me permettant de monter mon Raspberry Pi pour pouvoir m’en servir.
J’ai alors trouvé une super vidéo de GuiPoM qui teste le même kit de démarrage que j’ai eu.

Il donne beaucoup d’explications et fait un comparatif complet avec son expérience sur le Raspberry Pi 3.
a noter que pour les plus impatients, vous pouvez aller directement à la 27ème minute pour commencer le montage !

J’ai donc suivi scrupuleusement ses conseils et j’ai monté mon Raspberry Pi rapidement.

Me voici donc avec mon « nouvel ordinateur » branché sur la télé… 😉

Et c’est parti pour le paramétrage du Raspberry Pi…

L’avantage de ce kit de démarrage c’est que sur la carte SD incluse, tout est déjà installé dessus. Je n’ai donc pas eu besoin de télécharger le système d’exploitation (Raspbian) ni les éléments de base (comme, par exemple, la suite Open Office). 
J’ai donc suivi les instructions de démarrage qui permettent d’initialiser l’ordinateur… Et après une mise à jour et un redémarrage, je peux enfin l’utiliser !

Direction l’environnement mis en place spécialement pour Python sur le Raspberry Pi : Thonny.

Et pour bien démarrer, quoi de plus normal que de commencer avec un « Hello World » ? 

C’est chose faite…

Je peux enfin dire que j’ai bien inauguré mon Raspberry Pi !!! 😀

Categories
Apprentissage Découverte Raspberry Pi

Nouveau projet : programmer un ordinateur !

Devinez ce que le père Noël a déposé au pied du sapin…
Un Raspberry Pi !

Qu’est ce que c’est ?

Le Raspberry Pi est ce qu’on appelle un nano-ordinateur.
En effet, il est composé uniquement d’une carte mère sur laquelle il va falloir ajouter tous les composants, comme par exemple le boitier, le clavier, la souris, l’écran, etc. (il existe aussi de nombreux kits « tout en un » proposés pour débuter avec le Raspberry Pi !).
Puis il faudra programmer cet ordinateur pour qu’il puisse fonctionner.

Le Raspberry Pi a été conçu dès 2006 puis amélioré par la Fondation Raspberry Pi (avec le soutien de l’Université de Cambridge et du fabricant de semi-conducteurs Broadcom) dès 2009. Il a été officiellement lancé en 2012.
Son objectif est de rendre accessible l’informatique et d’encourager les jeunes à s’intéresser à la programmation informatique.
En effet, le fait qu’il soit « nu », diminue considérablement le prix d’achat et le rend donc accessible à tous.

Que faire avec le Raspberry Pi ?

Il y a de nombreux sites qui proposent des idées de projets (dont le site officiel de Raspberry Pi !).
Pour être très vaste, on peut citer les jeux vidéo (ou non !), un robot, un site web, de la musique, etc.

Alors, qu’est ce que je vais en faire ?

Dès que j’aurais fini mon apprentissage du Python (et de ses objets !), je vais me lancer dans la découverte de mon Raspberry Pi.
Je n’ai pas encore fait le tour de tout ce qu’il est possible de faire, mais aujourd’hui j’en ferais bien un serveur web ou pourquoi pas quelque chose de plus pratique comme un arrosage automatique des plantes de mon balcon (car vous ne le savez peut-être pas, mais je n’ai pas du tout la main verte ! 😉 )…
Je pense qu’en découvrant cet ordinateur je vais avoir de plus en plus d’idées !!!


Un petit plus…

En attendant, voici les premiers sites sur lesquels je suis tombée et qui fourmillent d’idées :
– Le site officiel de Raspberry Pi et ses projets
– Le site Français de Raspberry Pi et ses tutoriels
– Korben et ses 60 idées
– Le blog de Nouvelles Technologies et ses 10 projets pour débutants
– Hitek et ses 10 idées cool

Categories
Apprentissage Découverte Python

Le jeu du Pong

Vous connaissez tous le jeu du Pong ?

Mais si, le jeu du Pong c’est ce jeu où l’on doit faire rebondir une balle entre deux barres…
Vous ne voyez toujours pas ?

PongGame

Le voici :


Aujourd’hui je suis allée voir un tuto sur YouTube de FreeCodeCamp : https://youtu.be/XGf2GcyHPhc pour réaliser le jeu du Pong.

J’ai réalisé le jeu en même temps que la vidéo.
C’était ma petite partie récréative pour me réconcilier avec Python (car en ce moment j’ai une overdose du cours que je suis sur OpenClassrooms; et surtout des classes et méthodes qui sont pour moi imbuvables ! 😉 )

Alors le principe est simple : il faut créer une fenêtre avec des dimensions précises, des barres et une balle. Puis programmer pour que tout se déplace, que la balle rebondisse et que les scores s’affichent…

Simple comme bonjour ? Presque…

J’ai suivi la vidéo et j’ai dû faire quelques modifications pour que le programme marche sur mon ordinateur !

  • Tout d’abord, j’ai fait des erreurs de frappe. Par exemple pour le déplacement des barres, j’ai oublié de mettre le signe négatif pour le déplacement en bas… Ce qui fait que, quelle que soit la touche paramétrée utilisée, ma barre se déplaçait uniquement en haut !
# Function
def paddle_a_up():
    y = paddle_a.ycor()
    y += 20
    paddle_a.sety(y)

def paddle_a_down():
    y = paddle_a.ycor()
    y += -20
    paddle_a.sety(y)
  • Le déplacement de la balle était bien trop rapide avec une valeur de 2. J’ai donc diminué progressivement jusqu’à 0.1 pour que la balle se déplace suffisamment lentement pour pouvoir jouer sans perdre dès le début !
ball.dx = 0.1			# speed
ball.dy = -0.1			# speed
  • Lorsque je suis passée au codage du déplacement de la balle, la balle doit toujours se retrouver au milieu après être sortie sur un côté. Mon code a marché lorsque j’ai supprimé les espaces dans la ligne.
if ball.xcor() > 390:  # right side of the screen
    ball.goto(0,0)
    ball.dx *= -1

if ball.xcor() < -390:  # left side of the screen
    ball.goto(0,0)
    ball.dx *= -1
  • Pour les conditions permettant à la balle de « rebondir » sur les barres, je n’avais pas mis toutes les parenthèses nécessaires. Ce qui provoquait un arrêt du programme…
# Paddle and ball collisions
if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < paddle_b.ycor() + 40 and ball.ycor() > paddle_b.ycor() -40):
    ball.setx(340)
    ball.dx *= -1

if (ball.xcor() < -340 and ball.xcor() > -350) and (ball.ycor() < paddle_a.ycor() + 40 and ball.ycor() > paddle_a.ycor() -40):
    ball.setx(-340)
    ball.dx *= -1

Finalement, ce moment récréatif a été très instructif !
En effet, même en ayant le modèle sous les yeux, j’ai eu quelques bugs qui m’ont permis de réfléchir et donc de m’améliorer !!! 🙂

De plus j’ai découvert une nouvelle bibliothèque : « turtle » qui permet notamment de dessiner des lignes. Et ça c’est top ! 😎


Et voici le code final !

# Simple Pong
# By @TokyoEdTech

import turtle

wn = turtle.Screen()
wn.title("Pong by @TokyoEdTech")
wn.bgcolor("black")
wn.setup(width=800, height=600)
wn.tracer(0)

# Score
score_a = 0
score_b = 0

# Paddle A
paddle_a = turtle.Turtle()
paddle_a.speed(0)
paddle_a.shape("square")
paddle_a.color("white")
paddle_a.shapesize(stretch_wid=5, stretch_len=1)
paddle_a.penup()
paddle_a.goto(-350, 0)

# Paddle B
paddle_b = turtle.Turtle()
paddle_b.speed(0)
paddle_b.shape("square")
paddle_b.color("white")
paddle_b.shapesize(stretch_wid=5, stretch_len=1)
paddle_b.penup()
paddle_b.goto(350, 0)

# Ball
ball = turtle.Turtle()
ball.speed(0)
ball.shape("square")
ball.color("white")
ball.penup()
ball.goto(0, 0)
ball.dx = 0.2			# speed
ball.dy = -0.2			# speed

# Pen
pen = turtle.Turtle()
pen.speed(0)
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(0, 260)
pen.write("Player A: 0  Player B: 0", align="center", font=("Courier", 24, "normal"))

# Function
def paddle_a_up():
    y = paddle_a.ycor()
    y += 20
    paddle_a.sety(y)

def paddle_a_down():
    y = paddle_a.ycor()
    y += -20
    paddle_a.sety(y)

def paddle_b_up():
    y = paddle_b.ycor()
    y += 20
    paddle_b.sety(y)

def paddle_b_down():
    y = paddle_b.ycor()
    y += -20
    paddle_b.sety(y)

# Keyboard binding
wn.listen()
wn.onkeypress(paddle_a_up, "a")
wn.onkeypress(paddle_a_down, "q")
wn.onkeypress(paddle_b_up, "p")
wn.onkeypress(paddle_b_down, "m")

# Main game loop
while True:
    wn.update()

    # Move the ball
    ball.setx(ball.xcor() + ball.dx)
    ball.sety(ball.ycor() + ball.dy)

    # Border checking
    if ball.ycor() > 290:    # top of the screen
        ball.sety(290)
        ball.dy *= -1

    if ball.ycor() < -290:   # bottom of the screen
        ball.sety(-290)
        ball.dy *= -1

    if ball.xcor() > 390:  # right side of the screen
        ball.goto(0,0)
        ball.dx *= -1
        score_a += 1
        pen.clear()
        pen.write("Player A: {}  Player  B: {}". format(score_a, score_b), align="center", font=("Courier", 24, "normal"))

    if ball.xcor() < -390:  # left side of the screen
        ball.goto(0,0)
        ball.dx *= -1
        score_b += 1
        pen.clear()
        pen.write("Player A: {}  Player  B: {}". format(score_a, score_b), align="center", font=("Courier", 24, "normal"))

    # Paddle and ball collision
    if (ball.xcor() > 340 and ball.xcor() < 350) and (ball.ycor() < paddle_b.ycor() + 40 and ball.ycor() > paddle_b.ycor() -40):
        ball.setx(340)
        ball.dx *= -1

    if (ball.xcor() < -340 and ball.xcor() > -350) and (ball.ycor() < paddle_a.ycor() + 40 and ball.ycor() > paddle_a.ycor() -40):
        ball.setx(-340)
        ball.dx *= -1
Categories
Découverte

Connaissez vous le Code Golf ?

Je trouvais que mes codes étaient un peu longs. Du coup, je me suis demandée s’il n’y avait pas moyen de faire plus court…
Et c’est là que j’ai appris qu’il existait un concours récréatif de programmation pour avoir le code le plus court : le « Code Golf  »

Alors, qu’est-ce que c’est le « Code Golf » ?

C’est un concours, aussi connu sous le nom de « Golf scripting ». Son nom fait référence aux règles du jeu du Golf.
En effet, les golfeurs doivent finir leur parcours en moins de coups possibles.
Tout comme les participants du « Code Golf » qui doivent rédiger un programme très court (le plus court possible, même !) permettant d’exécuter une action.

Un peu d’histoire…

Le programme le plus court produisant une donnée a été rédigé en 1963 par Andrey Kolmogorov. Il est nommé Complexité de Kolmogorov.

De nombreux développeurs se sont ensuite lancés dans un concours informel pour rivaliser d’ingéniosité sur la rédaction d’un code.
Ce concours est devenu populaire avec le langage Perl et principalement grâce aux hackers en APL.
Le nom de « Code Golf » serait apparu en 1999. Le concours peut aussi prendre le nom du langage testé, par exemple « Perl Golf » !

Depuis, de nombreux langages spécifiques à ce concours ont été créés. Comme le Golf Script (en décembre 2007) ou le Flogscript.
Le code devant être le plus court possible, l’inconvénient majeur de ces programmes est un manque de lisibilité et de compréhension au premier coup d’œil !
Mais quand il faut rédiger rapidement un programme, on est moins regardant sur la forme que sur le fond, non ? 😉


Une chose est sûre : je ne suis pas assez mordue pour me lancer dans ce concours… L’idée ne m’a d’ailleurs même pas effleuré l’esprit lors de mes recherches sur le sujet !!! 🙂

Et vous, vous aimeriez tenter cette aventure ? Si oui, il existe une plateforme permettant de s’entraîner : Codewars.