Blog

Page d’exemple

NumApps

Pong en Python, Numworks

Pong est un jeu que l’on n’a plus besoin de présenter. Autrefois présent sur des bornes d’arcades lors de la genèse du jeu vidéo au début des années 70, le concept a évolué mais reste toujours aussi fun ! Découvrir la programmation d’un jeu en python sur ce jeu est passionnant, et si le code de 12ko de la première version offrait de grandes possibilités, la version 2 présentée ici est à découvrir sans tarder.

Captures d’écran du jeux

Une version 2 optimisée

La première version de ce jeu, conçu en deux semaines et quelques insomnies, a plutôt bien marché mais paradoxalement c’était mon premier jeu, et donc il n’était vraiment pas optimisé. Six mois plus tard, j’ai décidé de m’y remettre. J’ai donc pris mon courage à deux mains et je l’ai entièrement réécrit. De cette manière, la nouvelle version est plus petite mais bien meilleure.

Des menus, des graphisme et un gameplay revisité

Le jeu offre tout premièrement des menus interactifs, programmés grâce à une bibliothèque personnelle, menulib. Ce dernier vous permet de tout (ou presque) paramétrer, des points maximums à la vitesse de la balle, la difficulté, mais aussi les graphismes. En effet, grosse nouveauté, le jeu supporte désormais des thèmes et des particules ont étés ajoutées quand on active les détails de la balle.

Le jeu est jouable en plusieurs modes :

  • Solo : on contrôle les deux pads et on doit faire le plus grand nombre de rebonds
  • 2 players : on a la possibilité de jouer avec un ami en duel
  • Contre l’ordinateur : on joue contre la calculatrice. Attention ! La difficulté se règle dans les paramètres de jeu.

Contrôles

Flèches haut/basBouton supprimer (backspace)Boutons multiplication/addition
Pad 1 (gauche)PausePad 2 (droite) (en mode 2 joueurs)

Téléchargement

Tutoriels

Comment exécuter un script python

Que vous soyez en spécialité NSI, un lycéen français ou simplement un curieux désireux de tester un script python, voici quelques solutions simples pour exécuter un script python.

Voici un code python très simple. Quel est le résultat produit par l’exécution de ce code ?

''' python3 Hello World ! '''
message = [72, 101, 108, 108, 111, 44, 32, 87, 111, 114, 108, 100, 33] 
for nb in message:
    print(chr(nb), end="")
print("\n"+" " * 42, ord("*"))
#spé nsi

Thonny, un IDE simple à utiliser.

Sur Windows, Mac ou Linux il existe un IDE très simple et facile à utiliser. On le télécharge depuis le site officiel thonny.org, on peut l’installer sur un compte utilisateur sur Windows et on peut le personnaliser avec des thèmes pour obtenir une coloration syntaxique à son goût.

Thonny avec le thème Clean Dark Blue et la coloration syntaxique Dracula.

Il suffit de copier / coller le script dans l’éditeur de script, de l’enregistrer, puis de cliquer sur le bouton d’exécution du script (ou sur son raccourci clavier [F5]) pour obtenir le résultat de l’exécution dans la console.

On peut bien évidemment utiliser la console pour tester rapidement du code python ou interroger le contenu des variables.

Thonny est un logiciel libre, gratuit, sous licence MIT.

Basthon, un IDE en ligne respectueux de votre vie privée

Basthon est l’acronyme de « Bac À Sable pour pyTHON« . Il s’agit un IDE en ligne, accessible sans aucune installation préalable, donc utilisable si vous disposez d’un navigateur internet. Vous pouvez l’utiliser en ligne, en étant connecté à internet ou simplement en téléchargeant et décompressant une archive zip.

Basthon est :

Tester le mode console de Basthon

Depuis le site officiel ou depuis notre site. Seul le premier lien vous garanti de disposer de la dernier version de Basthon.

NumApps

JetPack Bird en Python, Numworks

Sortie en 2013, Flappy Bird fut un énorme succès sur les plateforme Android et iOs. Le jeu proposé ici est une fusion de deux jeux, Flappy Bird, jeu ou l’on fait voler un oiseau en tapotant l’écran, et JetPack joyride, dans lequel le personnage Barry utilise un jetpack pour se promener à sa guise entre des rayons lazers.

Capture d’écran du jeux

La jouabilité

Pour ce jeu, j’ai voulu donner plus de jouabilité au personnage, pour qu’il soit adapté au « grand publique ». Au départ pensé comme un simple clone de Flappy Bird, je me suis tourné vers un déplacement plus fluide tel que celui d’un JetPack, fonctionnant avec une accélération et non par à-coup. Une seule touche est utile, la touche [OK].

Optimisation et graphismes

Comme je l’ai déjà dit, je voulais un jeu adapté à tout le monde. Donc, par soucis de place, j’ai opté d’enlever tout menu. Pour rendre le jeu tout de même beau, j’ai ajouté une fonction qui trace un contour autour de chaque rectangle tracé. Malheureusement, pour avoir un jeu rapide, il est plus facile de tracer un grand rectangle noir qui sert de cadre puis de tracer à l’intérieur un rectangle de la couleur désirée, mais (combiné à l’écran lui même qui a quelques défauts) cela produit des effets de rafraichissement pas très agréables… Rassurez vous tout de même, cela reste largement jouable ! Notez que le meilleur score est enregistré avec Oméga (et Os dérivées). Bon jeu !

Téléchargement

Nous vous proposons 2 liens distincts, le premier est le lien vers la source du créateur de l’application, le deuxième est un lien alternatif en cas de problème. Seul le premier lien garanti de disposer de la dernière version de l’application ainsi que la documentation écrite directement dans le workshop.

DS

Correction du sujet de l’épreuve Blanche de 1ère NSI,…

Dans le cadre de l’évaluation en contrôle continu, les élèves étudiant la spécialité NSI passent des épreuves de de contrôle continu lors du troisième trimestre de leur année de première.

Introduction

Les épreuves de la session 2021 ont été annulés, mais les épreuves blanches dans notre établissement ont été maintenues.

Nous vous proposons la correction de cette épreuve. Elle contient 40 questions de la banque officielle des sujets ainsi qu’une question « One More Thing » sur deux points. Il est néanmoins hypothétiquement possible que certaines des réponses proposées dans ce sujet ne soient pas à 100 % « totalement officielles ».

Le sujet est disponible en version PDF :

Cette correction a été entièrement préparé et rédigé sur ce site web par nos élèves de la spécialité NSI du lycée Louis Pasteur.

Les sujets sont sous licence CC BY-NC-SA 3.0 FR, le présent corrigé est sous la même licence.

Thème A : types de base

Question A.1
Quel est un avantage du codage UTF8 par rapport au codage ASCII ?

Réponses
A. il permet de coder un caractère sur un octet au lieu de deux
B. il permet de coder les majuscules
C. il permet de coder tous les caractères
D. il permet de coder différentes polices de caractères
E. UTF8 permet de descendre de la montagne même quand ASCII ce n’est pas possible.

Correction : Réponse C
Après une très longue réflexion, la E nous semblait être la plus pertinente. Néanmoins n’aimant pas le Ski mais préférant la course à pied, nous avons plutôt choisi la C. En effet UTF8 permet de coder tous les caractères et même le très franchouillard « Â » ou encore le « ß » de nos cousins germains.

Question A.2
On considère les codes ASCII en écriture hexadécimale (en base 16).Retour ligne automatique
Le code ASCII de la lettre A est 0x41, celui de la lettre B est 0x42, celui de la lettre C est 0x43, etc. Quel est le code ASCII, en hexadécimal, de la lettre X (c’est la 24e lettre de l’alphabet usuel).

Réponses
A. 0x58 
B. 0x64 
C. 0x7A
D. 0x88

Correction : Réponse A
Ici le piège si on ne lisait que les chiffres c’était de croire que le X qui est la 24 ème lettre de l’alphabet usuel (soit la 24 lettre en décimal). On additionnait donc des décimaux et des hexadécimaux et paf, on tombait en plein dans l’erreur. Il faut donc convertir 23 (car il y a 23 d’écart entre A et X) en hexadécimal, puis l’additionner à l’hexadécimal de A. Et paf, ça fait des chocapics (où plutôt 0x58) !

Question A.3
Quelle est la représentation en binaire de l’entier 64 sur un octet ?

Réponses
A. 0101 0000
B. 1100 0100
C. 0100 0000
D. 0000 1100

Correction : Réponse C
C’est dans cette question où on verra qui sont les béotiens du binaire, je crois qu’on ne peut faire plus simple, tomberas-tu dans le piège qui te dit que c’est trop facile donc tu coches autre chose (d’illogique evidemment) puis en fait il s’avère que tu avais raison, donc tu as un énorme seum pasque tu sais que tu avais bon. Bref, j’espère que tu as la C sinon tu crains.

Question A.4
Quelle est l’écriture hexadécimale de l’entier dont la représentation en binaire non signé est 1100 0011 ?

Réponses
A. BB
B. C3
C. CB
D. 7610

Correction : Réponse B
Excepté si vous souhaitez vous rendre dans le chaleureux (et très perdu) canton d’Eu, ou avoir une carte bancaire, ou même écraser un bébé (???), euuu je vous conseille de prendre la Citroen C3, c’est la plus fiable et vous aurez moins de problèmes.

Thème B : types construits

Question B.1
On considère le script suivant :

t = [2, 8, 9, 2]
t[2] = t[2] + 5

Quelle est la valeur de t à la fin de son exécution ?

Réponses
A. [42, 13, 9, 2]
B. [2, 8, 14, 2]
C. [7, 13, 14, 7]
D. [7, 13, 9, 42]

Correction : Réponse B
Bon, même si le 42 attire inéluctablement nos regards, on doit l’oublier (excusez nous). Ça nous laisse plus que deux possibilités, B et C. Si vous vous débrouillez super bien en calcul mental, vous verrez que 9+5=14. Vérifier le calcul si vous doutez évidemment, je ne suis sure de rien. Donc, on remplace à l’indice 2 (n’oubliez pas qu’on commence avec l’indice 0 dans une liste) avec votre calcul effectué avec brio ci-dessus. On se demande où ils sortent leur réponse C quand même.

Question B.2
Que vaut l’expression [ 2*k for k in range(5) ] ?

Réponses
A. [0,2,4,6,8]
B. [2,4,6,8,10]
C. [1,2,4,8,16]
D. [2,4,8,16,32]

Correction : Réponse A
Une seule réponse sera l’élue, avec un zéro dedans puisque le inrange(5) démarre dès 0, donc sauf si vous avez des problèmes de vue, ou autres hein (ignare), impossible de trouver autre chose.

Question B.3
Après l’affectation suivante :

alphabet = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N',
'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]

quelle est l’expression qui permet d’accéder à la lettre E ?

Réponses
A. alphabet[42]
B. alphabet[’E’]
C. alphabet[4]
D. alphabet[5]

Correction : Réponse C
Donc, pour trouver l’expression qui permet d’accéder à la lettre E, il suffit de compter à quel rang elle est dans l’alphabet. Ensuite il nous faut retrancher à ce nombre 666, puis ajouter un peu de poudre de perlimpinpin de 69, quelques carabistouilles de 42 et enfin, traverser 120 fois la rue pour trouver un travail. Et voilà ! Vous tombez sur la réponse C (le premier indice de la liste est 0).

Question B.4
On définit le dictionnaire d = ’a’ : 1, ’b’ : 2, ’c’ : 3, ’z’ : 26. Quelle expression permet de récupérer la valeur de la clé ’z’ ?

Réponses
A. d[4]
B. d[26]
C. d[z]
D. d[’z’]

Correction : Réponse D
Vous savez utiliser un dictionnaire ? Et ben voilà c’est pareil ! On cherche la “définition” (appelée ici “valeur”) de “z” donc tape donc la réponse D, et magie on a comme retour la valeur de “z”.

Question B.5
On définit : L​ = [10,9,8,7,6,5,4,3,2,1] Quelle est la valeur de L[L[3]] ?

Réponses
A. 3
B. 4
C. 7
D. 8

Correction : Réponse A

Il faut apprendre à décomposer on cherche donc le retour de la liste L d’indice de la valeur de l’indice 3 de la liste L. Autrement dit, on regarde la valeur d’indice trois. Comptons :
1, 2, 3 ; c’est donc “8” ! Et bien non chers nsistes ! Il ne faut pas oublier que pour une liste en Python, la première valeur est celle d’indice “0”. Donc la valeur d’indice “3” est “7” !
On cherche ensuite la valeur de la liste d’indice “7” ; soit “3” !!

Question B.6
On exécute le code suivant :

A = [ [ 1 , 2 , 3 ], [ 4 , 5 , 6 ], [ 7 , 8 , 9 ] ] 
B = [ [ 0 , 0 , 0 ], [ 0 , 0 , 0 ], [ 0 , 0 , 0 ] ] 
for i in range( 3 ):
	for j in range( 3 ): 
		B[i][j] = A[j][i]

Que vaut B à la fin de l’exécution ?

Correction : Réponse C

Pour l’audace, la E. Nan plus sérieusement, il faut d’abord comprendre ce que fait le programme. On se rend compte que la liste B va être « remplie » des éléments de la liste A mais pas dans l’ordre, seulement, il y a des petits pièges, puisque le programme ne fait pas qu’inverser la liste, mais les indices de la liste. Ainsi pour une valeur de B ; soit B[i][j], on mettra la valeur de A[j][i]. 
Un exemple parle toujours mieux : 
Si on a B[1][2] ; soit la troisième valeur de la deuxième sous-liste de B, on va y mettre comme valeur, celle de A[2][1] ; soit 8 !

Thème C : traitements de données en table

Question C.1
On définit la fonction suivante qui prend en argument un tableau non vide d’entiers :

def f (T) : 
    s = 0
    for k in T: 
        if k == 8 :
            s = s+ 1 
        if s > 1 :
            return True 
        else :
            return False

Dans quel cas cette fonction renvoie-t-elle la valeur True ?

Réponses
A. dans le cas où 8 est présent au moins une fois dans le tableau T
B. dans le cas où 8 est présent au moins deux fois dans le tableau T 
C. dans le cas où 8 est présent exactement une fois dans le tableau T 
D. dans le cas où 8 est présent exactement deux fois dans le tableau T
Correction : Réponse B

Question C.2
Soit le tableau défini de la manière suivante :
tableau = [[​1​,​3​,​4​],[​2​,​7​,​8​],[​9​,​10​,​6​],[​12​,​11​,​5​]]
On souhaite accéder à la valeur 12, on écrit pour cela :
Réponses
A. tableau[4][1]
B. tableau[1][4]
C. tableau[3][0]
D. tableau[0][3]

Correction : Réponse C
Encore une fois on a affaire à ces foutus tableaux de tableaux grrrr, bref simplement de la logique, comme dhab vous avez l’indice 0 en premier, donc pour trouver 12, selon ce raisonnement foncièrement bon, vous allez au tableau 3, indice 0 (pasque on va du plus grand au plus petit, bref si tu comprends pas va voir ton cours loulou).

Question C.3
On définit :

contacts = { 'Toto' : 'toto@nsi.fr' , 'Chloé' : 'chloe@nsi.com' , 'Paul' :'paul@nsi.net' , 
            'Clémence' : 'clemence@nsi.org' }

Parmi les propositions suivantes, laquelle est exacte ?

Réponses
A. ’Chloé’ est une valeur de la variable contacts
B. ’Chloé’ est une clé de la variable contacts
C. ’Chloé’ est un attribut de la variable contacts
D. ’Chloé’ est un champ de la variable contacts
E. ’Chloé’ a été identifiée “cas contact” par le ministère de l’éducation nationale

Correction : Réponse B
Si j’étais vous je m’approcherais pas de Chloé. Bon ça fait une semaine maintenant, vous pouvez aller lui faire plein de poutoux ! Si vous voulez quand même la dm, vous lui envoyez un petit mail 😉 Bref, quesque chloé ? Nan c’est pas une personne débilos, c’est la clé de ton cœur (oof) :)) Donc grâce à la force de l’amour tu as trouvé la réponse !

Question C.4 (Pas Picasso)
Laquelle de ces listes de chaînes de caractères est triée en ordre croissant ?

Réponses
A. [’Chat’, ’Chien’, ’Cheval’, ’Cochon’] 
B. [’Chat’, ’Cheval’, ’Chien’, ’Cochon’] 
C. [’Chien’, ’Cheval’, ’Cochon’, ’Chat’] 
D. [’Cochon’, ’Chien’, ’Cheval’, ’Chat’]

Correction : Réponse B
On ne parle pas d’ordre croissant de préférence, nan nan, mais bien au niveau de la place des lettres dans l’alphabet. Étant tous des non illettrés, nous savons que O est après H, et que E avant I, donc sauf si vous lisez à l’envers, quoique très courant de nos jours, je vous propose la réponse B (en plus le chat est clairement au dessus du cheval, du chien et du cochon, c’est pas pour rien qu’il était adulé en Egypte hein).

Thème D : interactions entre l’Homme et la Machine sur le Web

Question D.1
Par quoi commence l’URL d’une page Web sécurisée ?

Réponses
A. http 
B. https 
C. ftp 
D. smtp

Correction : Réponse B
Regarde l’URL de ton site préféré (nsi.xyz evidemment), il y aura toujours “http” mais si tu veux être sur que ce site est sécurisé il y aura un “s” comme pour “sécurité_juste_pour_toi”. Tu pourras donc livrer tes informations les plus privées à Google comme tes mot de passe, tes codes de carte bleu, etc… (même si il sait déjà tout 🤫).

Question D.2
Quelle méthode d’envoi des paramètres est-il préférable d’utiliser, pour un formulaire d’une page web, destiné à demander à l’utilisateur un mot de passe pour se connecter (le protocole utilisé est HTTPS) ?

Réponses
A. la méthode PASSWORD 
B. la méthode CRYPT
C. la méthode GET 
D. la méthode POST

Correction : Réponse D
Euuuuuu alors, non ca peut pas etre un caveau souterrain servant de sépulcre, ni un mot de passe (oui vous avez vu on parle couramment anglais ici). Plus que 2 possibilités, mais seule la méthode POST vous permet d’entrer un mdp sur un site sécurisé (qui va encore sur ce genre de site mon dieuuuuu).

Question D.3
Parmi les langages suivants, lequel est exécuté sur le serveur lors de la consultation d’une page Web ?

Réponses
A. JavaScript
B. HTML 
C. CSS 
D. PHP

Correction : Réponse D
Le PHP, c’est lourd, complexe ! C’est pour cela que ce langage s’exécute côté serveur. Sinon ça serait trop complexe pour ton ordi qui a fait les 2 guerres mondiales. On laisse tous ces calculs à des supers machines de la mort qui tuent, et comme ça toi, t’es tranquille.

Question D.4
Quelle est la machine qui exécute un programme JavaScript inclus dans une page HTML ?

Réponses
A. le serveur WEB qui contient la page HTML 
B. la machine de l’utilisateur qui consulte la page HTML 
C. un serveur du réseau 
D. un routeur du réseau

Correction : Réponse B
Une fois que tu as reçu les programmes venant du serveur, alors tout se fait sur ta machine, y compris les programmes JavaScript. Au passage, une petite astuce, si sur ton site tu appelles un script JS, appelle le à la fin de ton script HTML, comme ça la page s’affiche et après calcul le Java (ce qui est donc “plus mieux” rapide).

Question D.5
Quelle est la balise HTML utilisée pour indiquer un titre de niveau d’importance maximum ?

Réponses
A. la balise <h0>
B. la balise <h1>
C. la balise <head>
D. la balise <header>

Correction : Réponse B
Bon, j’ai vraiment besoin de développer ça ?! Juste tu veux un titre en HTML, alors tu utilises <h1>.

Question D.6
Dans le code HTML les délimiteurs tels que et s’appellent ?

Réponses
A. des bornes
B. des balises
C. des paragraphes
D. des liens

Correction : Réponse Ø
Bhahahahahah là y a pas de réponse, juste tu marques que le prof a fait une erreur –oui les profs en font-, ducoup t’as un point gratos et ça fait assez plaiz surtout quand tu verras ta note (oof).

Question D.7
Parmi GET et POST, quelle méthode d’envoi de formulaire crypte les informations envoyées au serveur ?

Réponses
A. les deux : GET et POST
B. GET seulement
C. POST seulement
D. aucune des deux

Correction : Réponse D
GET et POST sont fourbes ! Ces deux méthodes sont hyper utiles, MAIS elles ne cryptent rien, ce qui n’est pas vraiment super pour nous… Mais pas le choix d’utiliser autre chose, tant pis 🤷‍♂️ (si on peut utiliser https au moins c’est crypté ! mais si on utilise get alors ça apparaît dans l’url donc pas ouf ! Le nec ++ ultra c’est donc POST + HTTPS mais bon on sait pas pour la NSA (pas encore…)).

Question D.8
Parmi les éléments suivants, lequel est un protocole ?

Réponses
A. GET
B. POST
C. HTTP
D. HTML

Correction : Réponse C
GET et POST étaient précédemment définis comme étant des méthodes, donc pourquoi ça deviendrait un protocole ???? La réponse est vraiment dans les questions précédentes, donc bon, je sais pas quoi vous dire de plus mmmmmm. HTML est un langage de balisage, tout comme LateX, plus qu’une réponse, faites par élimination (même si devant la copie j’avoue qu’on panique).

Question D.9
Pour créer un lien vers la page d’accueil de Wikipédia, que devra-t-on écrire dans une page Web ?

Réponses
A. <​a target="http://fr.wikipedia.org">Wikipédia</a>
B. ​<a href="http://fr.wikipedia.org" />
C. <​a href="http://fr.wikipedia.org">Wikipédia</a>
D. ​<link src="http://fr.wikipedia.org">Wikipédia</link>

Correction : Réponse C
OUIII WIKIPEDIA, on va encore pouvoir faire toutes nos recherches dessus (sans tricher), et c’est les profs qui nous donnent le droit donc, tout est permis !!!! Bon la si vous trouvez pas le bon vous craignez, ça on l’a vu en SNT (vous avez eu la chance de le voir ; nuance), même si oui on a rien fait dans cette matière l’année dernière, je l’admet, ON A QUAND MÊME VU LES LIENS, cherchez pas des excuses.

Thème E : Architectures matérielles et système d’exploitation

Question E.1
Identifier parmi les éléments suivants celui qui n’est pas un capteur.
A. haut-parleur 
B. caméra 
C. accéléromètre 
D. microphone

Correction : Réponse A
Essayez de crier dans un haut-parleur. Bravo vous avez cassé la membrane de la Devialet à 1500 € !! Vous avez plus qu’à prendre des écouteurs de Ryanair en les mettant dans l’enceinte pour pas que vos parents vous défoncent. Tout ça parce que vous êtes pas capables de savoir qu’un haut-parleur n’enregistre pas du son.

Question E.2
Lequel de ces objets n’est pas un périphérique ? 
A. le clavier 
B. une clé USB 
C. la carte graphique 
D. la carte mère

Correction : Réponse D
Un périphérique est un objet que tu rajoutes à ton PC, mais sans cet objet ton PC pourra toujours fonctionner. On peut faire marcher fonctionner un PC sans clavier, sans clé USB, ni carte graphique. Mais sans carte mère… c’est un peu complexe.

Question E.3
L’adresse IP du site www.education.gouv.fr est 185.75.143.24. Quel dispositif permet d’associer l’adresse IP et l’URL www.education.gouv.fr ? 
A. un routeur 
B. un serveur DNS 
C. un serveur de temps 
D. un serveur Web 
E. L’application TousAntiCovid, qui empêche également le virus de rentrer dans les écoles.

Correction : Réponse B
Tu as désormais l’adresse IP du gouvernement !! Trop bien, tu peux maintenant hacker tout le gouvernement en passant par un serveur DNS et ainsi te mettre plein de 20/20 (c fo ils ont pas eu le budget pour avoir un serveur à eux tout seul ; essayez de taper l’I.P. sur internet) ! (tu peu le fer poure moua estépé). Par contre a-t-on des retours sur l’efficacité de TousAntiCovid (aka HadopiCovid) ?!

Question E.4
L’architecture client-serveur : 
A. est un mode de communication entre programmes 
B. est une architecture matérielle de coopération entre machines 
C. est un mode de communication entre routeurs 
D. est un mode de communication entre commutateurs 
E. est le mode de fonctionnement des restaurants avant la crise sanitaire, qui sont actuellement fermés donc je ne peux pas répondre à la question car je dois respecter les gestes barrières.

Correction : Réponse A
Attention à ne pas confondre hardware et software.
L’architecture client-serveur est un mode de communication entre programmes, au même type que l’’architecture P2P. Elle ne dépend pas du hardware, mais bien du logiciel installé, qui peut être un client ou un serveur. (Corrigé par un enseignant)

Thème F : langages et programmation

Question F.1 (Ca va vite)(Attention vous avez pas le permis hein)
On considère le code suivant :
Quelle construction élémentaire peut-on identifier dans le code ci-dessus ?

if x < 4 :
	x = x + 3
else :
	x = x - 3

Réponses
A. une boucle non bornée 
B. une structure conditionnelle 
C. une boucle bornée
D. un appel de fonction
E. Un troll des cavernes
F. La réponse F.

Correction : Réponse B
Vous pouvez répéter la question ??
Fioooooooum ! Est-ce que qu’il y a besoin de tant déblatérer sur celle-là, c’est pourtant évident !

Question F.2 (Après F1 (normalement))
La fonction suivante calcule la racine carrée du double d’un nombre flottant. from math import sqrt Quelle est la précondition sur l’argument de cette fonction ?

def racine_du_double(x):
   return sqrt(2*x)

Réponses
A. x < 0 
B. x >= 0 
C. 2 * x > 0 
D. sqrt(x) >= 0

Correction : Réponse B
Ton prof de maths ne t’a jamais dit qu’une racine carré NE PEUT PAS manger de la soupe et de la pizza en même temps être négative ; une racine carrée, c’est toujours content (on garde ça pour le prochain spot de pub sur les maths) !

Question F.3
On considère le code suivant : Quelles sont les préconditions sur les arguments ?

def puiss(y,x): 
	res = y 
	for i in range(x): 
	    res = res*y 
	return res

Réponses
A. les arguments doivent être obligatoirement de type entier 
B. les arguments peuvent être de type entier ou flottant 
C. le type des arguments n’a pas d’importance 
D. il n’y a pas de préconditions dans ce cas

Correction : Réponse A
T’as déjà essayé de multiplier un nombre décimal en python ? Si oui ça marche ? Si oui dis moi comment tu fais !! Bon t’as bien compris qu’on peut pas… donc on s’assure bien que ce soit un entier avant tout.

Question F.4 (fait Alt+F4 stp)
Quelle est la valeur de la variable x à la fin de l’exécution du script suivant :

def f(x):
   x = x + 1
   return x + 1
x = 0
f(x+1)

Réponses
A. 0 
B. 1 
C. 2 
D. 3 
E. Georges

Correction : Réponse A
La variable x définie par x=0 est une variable globale qui n’a aucun rapport avec la variable locale nommé x de la fonction f. L’appel f(0+1) retourne bien la valeur 3, mais ce n’est pas la question posée. La variable globale n’a pas été modifiée, sa valeur est toujours 0. (Corrigé par un enseignant)

Question F.5(prenez un peu d’air frais)
On exécute le script suivant.

a = 11
for i in range(3):
   a = a * 2
   a = a - 10

Que contient la variable a​ ​à la fin de cette exécution ?

Réponses
A. 0 
B. 14 
C. 18 
D. 26

Correction : Réponse C
Dans le for i in range, ça veut dire que i ira pas jusqu’à 3 mais s’arrêtera à 2. Mais vous me diriez “Mon ptit bonhomme”, mais il part d’où ce A ?
Et bien c’est simple de rien, comme nous dans 3 ans sur le marché du travail. Mais rien c’est pas une valeur ?! 
Si, j’ai un indice le premier nombre arabe, le début de tout, le nombre “presque” suprême.
Et oui c’est le 0 !
Donc i va prendre les valeurs de 0, puis 1, puis 2, en faisant pendant ce temps sa mixture avec a.

Question F.6
On définit la fonction suivante :

def f(x,y):
     x = x +y
     y = x -y
     x = x -y
    return (x,y)

Quel est la valeur renvoyée par l’appel de patrick ​de chez carglass (mais non c’est Olivier de Carglass ) f(2019,2020)​ ?
Réponses
A. (2019,2019)
B. (2019,2020)
C. (2020,2019) 
D. (2020,2020)

Correction : Réponse C
OH MON DIEU DES MATHS J’AI ENVIE DE ME CREVER LES YEUX ET DE BOIRE MON SANG, bref.
La réponse est C, car elle est forcément égale à 2019 : (2020+2019)-2020 = 2019 (un vase peut y arriver, même un spé philo peut le faire).

Question F.7 (Vous avez vérifié nos fautes ?)
Un programme Python commence par la ligne : import​ os

À quoi sert cette ligne ?
Réponses
A. C’est du poulet basquaise
B. c’est la déclaration du système d’exploitation (operating system)
C. Python 3.6 exige cette ligne au début de tout programme
D. c’est la déclaration d’une bibliothèque (ou module) que le programme compte utiliserRetour ligne automatique
Correction : Réponse A
Bon la on se pose même pas la question, la nourriture est prioritaire partout. Juste le poulet c’est pas fou, on aurait pu trouver mieux hein. (os → module déclaré, pas de bouffe, dommage, un jour omega nous livrera à domicile). Donc réponse D, on verra si vous lisez toutes nos réponses de folie comme ça.

Question F.8
La fonction Python suivante ne calcule pas toujours correctement le résultat de 𝑥 𝑦 pour des arguments entiers. Parmi les tests suivants, lequel va permettre de détecter l’erreur ?

def puissance (x,y):
   p = x
   for i in range (y - 1):
      p = p * x
   return p

Réponses
A. puissance(2,0) 
B. puissance(2,1) 
C. puissance(2,2) 
D. puissance(2,10)

Correction : Réponse A
On sait bien que 20 = 1 ! Mais si on regarde le logarithme népérien de 0, on remarque que la réponse A permet avec certitude de déclarer Patrick Balkany comme prochain guest de Just Dance after the covid. (#Lourdeur)

Thème G : algorithmique

Question G.1 (meilleure classe, confirmé par près de π/3*100 de tous les rédacteurs)

Que fait la fonction suivante :

def trouver(L):
   i = 0
   for j in range(1, len(L)):
      if L[j] >= L[i]:
         i = j
   return i

Réponses
A. elle renvoie le maximum de la liste 
B. elle renvoie le minimum de la liste 
C. elle renvoie l’indice de la première occurrence du maximum de la liste 
D. elle renvoie l’indice de la dernière occurrence du maximum de la liste

Correction : Réponse D
Que nous imaginassions nous trouver dans un champ de pommes. On choisit la plus grande (je t’ai vu sourir raph), et si deux font la même taille on prend la deuxième.
Donc voilà vous savez on vire donc la A et la B car ça retourne l’indice tout ça. Ensuite on l’a dit si y en a 2 on prend la deuxième, donc c’est la réponse D. (Bon on avoue, on a un peu triché on a incanté le dieux des 1G1 et du 42 pour trouver la réponse, car c’est l’entier entre les deux extrêmes du deuxième dieu, soustrait au G du dieu de la classe :)).

Question G.2 (ahhhhh les G2 y en a qu’une qui est bien…🥰) (en effet)
On exécute le script suivant :

compt = 0
resultat = 1
while compt != 7 :
   resultat = resultat * compt
   compt = compt + 1

Laquelle de ces affirmations est vraie ?

Réponses
A. Le script ne s’arrête pas
B. Le script entre 7 fois dans la boucle et à la fin de son exécution, r​esultat ​vaut 0 
C. Le script entre 7 fois dans la boucle et à la fin de son exécution, r​esultat ​vaut 720 
D. Le script entre 6 fois dans la boucle et à la fin de son exécution, ​resultat ​vaut 0

Correction : Réponse B
Déjà quelque chose multiplié par 0, tu sais que ça fait 0 (sauf ∞ mais on parle pas de ça maintenant). Donc notre fameux “temp”, il rentre 7 fois dans la boucle parce que “while != 7” veut dire “ca rentre tant que c’est différent du chiffre 7”.
Mais bon c’est une situation temporaire comme ils disent tous au début donc on s’en fiche un peu.

Question G.3
Quelle est la valeur du couple (​ s,i)​ à la fin de l’exécution du script suivant ?

s = 0
i = 1
while i < 5:
   s = s +i
   i = i + 1

Réponses
A. (4, 5) 
B. (10, 4) 
C. (10, 5) 
D. (15, 5) 
E. (42, 5)

Correction : Réponse C
Bah là y’a rien à dire… juste c’est des maths de la logique banane / humour d’arbre !

Question G.4 (G4 Cube)
La fonction suivante doit calculer le produit de tous les éléments de la liste passée en paramètre. Avec quelles expressions doit-on la compléter pour que cette fonction soit correcte ?

def produit (L):
p = …
for elt in L:
     .......
     return p

Réponses
A. 1 puis p​ = p * elt 
B. 0 puis ​p = p * elt 
C. 1 puis p​ = elt
D. 0 puis ​p = elt
Correction : Réponse A

Un produit fois 0 c’est comme si on vous donnait 42 fois 0 PS5 (de toute façon y en a plus ils sont pas foutu d’en produire 2), donc c’est pas bon vu qu’on en veut. Donc c’est forcément 1. Il ne reste que la A et la C (à la fin il n’en restera qu’un 😁). et vu qu’on veut faire le produit de tout c’est forcément la A !

Question G.5 (The last) (but not the least)
Quelle est la valeur de e​lement ​à la fin de l’exécution du code suivant :

L = [ 1 , 2 , 3 , 4 , 1 , 2 , 3 , 4 , 0 , 2 ] 
element = L[ 0 ]
	for k in L:
	    if k > element: 
	        element = k

Réponses
A. 0 
B. 1 
C. 4 
D. 10

Correction : Réponse C
La dernière question, elle nous promet une difficulté intense, une réflexion poussée, un stress à son comble. Non c’est une liste, dur retour à la réalité, de nos actes, nos pensées, nos vies inintéressantes.
En fait on cherche juste la valeur de la liste la plus grande (toujours cette notion de plus grand, pourquoi comparer les gens c’est inutile, on est tous unique, donc comparer des gens ou même des nombres ça revient à les dégrader). Pourquoi, ici 4 serait supérieur aux autres, c’est injuste pour le 0 qui est très beau, pourquoi, pourquoi ?!!

Pour le petit bonus,

bah c’est juste 36 // 42 // 666 // 404 (logique).
On tiendrait quand même à parler de quelques succès des One More Thing :
On peut trouver un Mac que je suis le seul à trouver magnifique le Powerbook G3 aussi nommé Clamshell,

Il est pas magnifique ce PowerBook G3 Clamshell 🥰 ?

Ici vous verrez une magnifique photo de cette beauté colorée

Bon après il y a aussi des ratés commes : 
– Itunes Match (si quelqu’un connait, qu’il lève la main) 
– Face Time

Bref on espère que ça vous aura plus.
42,
Peace,
NSI

One more thing

Ce script ci-dessous est exécuté.

Vous devez déterminer les valeurs des variables quarantedeux , Quarantedeux , quaranteDeux et QuaranteDeux à la fin de l’exécution de ce script.

# déclaration des variables
wan, tu, free, fore, faiv, sɪks, seven = 7, 6, 5, 4, 3, 2, 1
quarantedeux = Quarantedeux = quaranteDeux = QuaranteDeux = 0
 
# déclaration des fonctions
 
def double(x):
    return x ** 2
 
def cube(y):
    return 2 * y
 
def carre(z):
    return z ** 3
 
# déclaration des affectations de variables
 
quaranteDeux = fore + fore * ( double( wan + faiv ) )
 
if carre(sɪks) == cube(fore):
    quarantedeux = 666
else :
    quarantedeux = 42
   
while QuaranteDeux != 42:
    QuaranteDeux += 1
   
for i in range(7):
    Quarantedeux = 6 * i

Le dernier exercice de ce sujet n’est pas corrigé ici mais plus haut hihihi.

Sachez juste que derrière une variable appelée 42 peut se cacher autre chose que 42. 😂

Conclusion

Vous pouvez réagir ici :

En particulier si les élèves auteurs de ce corrigé se sont trompés.

Le précédent corrigé : Correction du sujet n°42 de la BNS des E3C de NSI

contenait lui 2 erreurs fâcheuses 😱

NumApps

Des simulateurs web pour la NumWorks

Le logiciel de la NumWorks est sous licence Creative Commons, ce qui autorise la modification du code de la calculatrice et sa redistribution en respectant quelques règles.

Le simulateur officiel de la NumWorks

Un simulateur web construit sur du HTML, CSS et Javascript est proposé en ligne, gratuitement sur le site officiel de la calculatrice, il est présenté comme un outil idéal pour les démonstrations en classe et c’est une réalité.

  • Il est gratuit,
  • Il est accessible en ligne et hors ligne (téléchargeable gratuitement),
  • Il gère le mode plein écran pour un usage au vidéoprojecteur,
  • il est responsive et s’adapte à la taille de votre écran,
  • il gère l’enregistrement de la session et le partage de celle-ci par lien
    (cette dernière fonctionnalités n’est pas encore parfaitement stable à la date du 27 avril 2021)

En ligne : https://www.numworks.com/fr/simulateur/

Les simulateurs modifiés de la NumWorks

Nous vous proposons 3 simulateurs web légèrement modifiés de la NumWorks.

Pour un usage en ligne, nous les avons hébergé sur des sous domaines de ce site web.

Epsilon simulateurOmega simulateurPsi simulateur
epsilon.nsi.xyzomega.nsi.xyzpsi.nsi.xyz
Image modifiée par nos soins
Patché par Joachim Le Fournis
Simulateur officiel de Omega
https://getomega.dev/releases
Dérivé du projet NSIos
Gabin P. et Raphaël C.

Et parce que vous souhaitez peut-être changer d’ambiance un menu de navigation vous permet de passer de l’un des simulateurs à l’autre.

Patchs sur le simulateur epsilon

Quelques modifications ont été apportées au simulateur epsilon.nsi.xyz par rapport au simulateur officiel du constructeur de la calculatrice.

  1. L’image de la calculatrice a été modifiée pour avoir un rendu plus flat, pas parfait mais suffisant pour nous permettre de faire les captures d’écran que nous utilisons pour notre sélection NumApps.
  2. Le fond d’écran à été modifié pour la même raison.
  3. Les scripts natifs ont été effacés, il ne doivent donc pas être désactivés ou supprimés manuellement à chaque fois
  4. La taille des copiés / collés de scripts python externe à été porté à 16 ko contre environ 8 ko pour la version officielle.

Ces modifications codées par Jaochim Le Fournis nous permettent d’importer via un simple CTRL + V un script python rapidement et facilement, et ce sans se soucier des scripts python déjà présents, ni de la taille du script.

Design non flat / Design flat

DS

Banque des sujets de spécialité NSI

Les épreuves communes de spécialités NSI, qu’il s’agisse des épreuves écrites et des épreuves pratiques sont publiées sous une licence libre. Vous pouvez donc librement les télécharger pour vous entrainer et préparer au mieux ses examens.

Le site officiel quandjepasselebac

Vous pouvez trouver les sujets de NSI sur le site officiel du gouvernement :
http://quandjepasselebac.education.fr/revisions-la-banque-nationale-de-sujets/

En date du 26 avril 2021, ce site refuse une connexion HTPPS et il n’est pas possible de faire une lien direct stable vers les sujets d’une matière en particulier, aussi vous devrez trouver les sujets par vous même :

Bac général > Sujet de première > Enseignements de spécialité > …
Bac général > Sujet de terminale > Enseignements de spécialité > …

Le site officiel Eduscol

Vous y trouverez la banque des sujets des épreuves pratiques de spécialité NSI (Numérique et Sciences Informatiques) de la session 2021.

https://eduscol.education.fr/2661/banque-des-epreuves-pratiques-de-specialite-nsi

Le site ccbac.fr

CCBac.fr est le site gratuit de référence sur les épreuves de Contrôle Continu E3C du Baccalauréat, il n’est pas affilié à l’Éducation Nationale. Il a l’avantage de proposer des adresses web stables et un bouton pour télécharger rapidement tous les sujets pour l’année 2021.

ClasseExamenannéeLien
1èreEC22020https://ccbac.fr/list.php?session=2&voie=1&mat=26&opt=0&an=2020
1èreEC22021https://ccbac.fr/list.php?session=2&voie=1&mat=26&opt=0&an=2021

Ce site ne contient par contre pas les épreuves pratiques de spé NSI ni les épreuves de bac. Le sujet 0 de l’épreuve de baccalauréat de spé NSI est ci-dessous au format PDF.

Et les corrigés ?

Des élèves ont rédigé sur ce site le corrigé de l’épreuve 42 des E3C de l’année 2020 : Correction du sujet n°42 de la BNS des E3C de NSI, pour le reste il va falloir faire chauffer votre moteur de recherche favoris, quel qu’il soit.

Tutoriels

Comment optimiser Windows 10 ?

Ce tutoriel a été entièrement rédigé par un élève en spécialité NSI au Lycée Louis Pasteur. Pour en savoir plus : Les tutoriels en spécialité NSI 

 

On est d’accord, Windows (et plus particulièrement Windows 10) est le système d’exploitation le plus claqué au sol, le moins bien optimisé. Je vais donc te montrer comment optimiser Windows 10 sans logiciel ! Tu vas voir c’est assez simple, on va juste utiliser les paramètres. Et on ira du plus facile au plus extrême.

 

1. Des petites tâches très simples

A. Effacer les icônes

On va commencer très gentiment. Comme par exemple : supprimer les icônes sur ton bureau. Calculer et afficher chaque icône demande des ressources au démarrage, mais aussi à chaque retour Windows. Pour éviter ça, soit tu supprimes quelques icônes (comme celles que tu utilises le moins). Ou alors, sur ton bureau tu fais : Clic droit, « Affichage », « Afficher les éléments du Bureau » (pareil pour les réafficher).

B. Vider la corbeille

On va aussi supprimer pleins de fichiers qui restent sur ton ordi, et qui (encore une fois) peuvent le ralentir. Tout d’abord tu peux vider la corbeille. Pour ça, fais un Clic droit sur la corbeille, puis sur « Vider la corbeille ».

C. Supprimer les fichiers temporaires

On va aller un peu plus loin ! Sur ton clavier appuie sur la touche « Windows » + r, une fenêtre s’ouvrira en bas à gauche. Tu peux alors écrire « temp » puis sur la touche « Entrée » de ton clavier. Tous les fichiers que tu vas voir sont des fichiers temporaires, mais qui restent pour toujours (logique Windows). Ça peut être des diagnostics de bug, des erreurs, etc… tu peux donc supprimer tous ces fichiers (sauf quelques-uns que tu ne pourras pas supprimer). Pour ça, appuie sur les touches « Ctrl » + a de ton clavier pour tout sélectionner, puis sur la touche « Suppr » pour les mettre à la poubelle. Cette étape est la même en entrant « %temp% » et « prefetch » dans la fenêtre de Windows + r.

 

 

2. Jouons dans les paramètres

Il se peut que tu ne saches même pas comment lancer la fenêtre des paramètres Windows. C’est le début, c’est normal. Dans un premier temps, clique sur le logo Windows en bas à gauche. Puis clique sur l’engrenage (2ème en partant du bas).

A. Les mises à jour

Et oui ! c’est tout simple mais c’est la raison numéro 1 des latences de ton ordi. Pour voir si ta machine est à jour, clique sur l’onglet « Mise à jour et sécurité ». Puis il te suffit de cliquer sur « Rechercher des mises à jour ». En bonus, dans l’onglet « Optimisation de la distribution », je te conseille de désactiver les « Téléchargements à partir d’autres PC ». Cela te fera gagner de la rapidité et du débit internet, car ton PC va arrêter d’envoyer des éléments à d’autres PC. en effet, cette option n’est intéressante que pour un administrateur de réseau (ayant donc plusieurs pc), pour les gérer plus facilement.

B. Système

Comme vu précédemment, plus on a d’espace de stockage, plus le PC se comportera mieux. On va approfondir ce nettoyage. Pour ça, de retour dans les paramètres, clique sur l’onglet « Système ». Puis dans « Stockage », active « L’assistant de stockage ». Enfin, clique sur « L’exécuter maintenant » et vérifie qu’il soit bien activé « Chaque mois ». Tu peux ensuite mettre les durées que tu préfères. Pour nettoyer le disque directement, sélectionne « Nettoyer maintenant ».

C. Confidentialité

Windows veut tout savoir sur toi. Et pour arriver à ses fins, il va te demander plein d’informations personnelles en arrière-plan (sans que tu le saches sinon ce n’est pas drôle). Et comme tu t’en doutes, ça rend Windows très instable en plus de ne pas protéger ta vie privée ! Pour désactiver tout ça, et retrouver une vie paisible : clique sur l’onglet « Confidentialité » dans les paramètres, dans « Général » tu peux désactiver les 4 (ou le premier et le dernier comme moi, car ils prennent le plus de ressources). Dans « Diagnostics et commentaires », tu désactives tout. Dans « Diagnostics de l’application », encore une fois tu désactives. Puis dans « Historique des activités », tu peux décocher les 2 cases. Pour finir, dans « Applications en arrière-plan », tu peux tout désactiver, sauf Windows Defender/Sécurité Windows, et Office (si tu as une licence), ainsi, Plus 1 ou 2 applications si tu le souhaites.

D. Jeux

Beaucoup de gens se disent « Un mode jeux ?! Super ça doit booster mon jeu ! » NON ! Déjà en jeu, les performances sont les mêmes avec ce mode activer ou non, mais surtout, en bureautique, Windows va être à l’affût pour savoir quand tu vas vouloir l’activer. Donc encore un programme qui tourne pour rien. Pour arrêter ce programme, dans l’onglet « Jeux » des paramètres, puis dans « Xbox Game Bar » tu désactives la barre d’éléments. Si tu joues à la manette, tu peux donc, aussi décocher la case.

E. Applications

Il y a pleins d’applications sur ton ordi que tu n’utilises pas. Même si tu penses le contraire, tu joues vraiment au solitaire de Microsoft ?! Pour libérer de l’espace de stockage et quelques performances, on va désinstaller tout ça. Dans mon cas, je vais désinstaller Mozilla Firefox. Pour ce faire, dans les paramètres, clique sur l’onglet « Applications », clique sur l’application que tu veux supprimer, puis sur « Désinstaller ». Il te suffira de confirmer.

Bravo ! T’en as fini dans les paramètres. Mais ce n’est pas fini 🙂

On va attaquer le niveau au-dessus ! Tu l’as donc compris, ça sera un peu plus complexe, mais c’est là où tu gagneras le plus de performances.

 

3. Des paramètres plus … avancés

A. Supprimer les fichiers inutiles cachés

Encore une fois, on va supprimer des fichiers temporaires et inutiles. Mais encore plus cachés. On va aller dans la source de ce que l’on cherche : les paramètres de ton stockage. Il te faut tout d’abord lancer « L’explorateur de fichiers », puis sélectionner « Ce PC », sur ton disque dur, tu fais Clique Droit« Propriétés ». Une nouvelle page va s’ouvrir, clique alors sur « Nettoyage de disque ». Tu peux alors tout sélectionner et cliquer sur « Nettoyer les fichiers système ».

B. Performances élevées

Si t’as un PC portable, c’est indispensable ! Même si c’est aussi utile sur les PC fixes. La consommation va un tout petit peu augmenter (et encore c’est presque rien) mais les différences se voient de plus en plus. Pour mettre ton ordi en « Performances élevées », recherche « Panneau » et clique sur « Panneau de configuration », sélectionne ensuite « Options d’alimentation », puis active « Performances élevées ».

C. Applications au démarrage

Le retour de Windows qui fait plein de tâche sans rien te dire ! Y compris le lancement automatique d’applications à chaque démarrage. C’est ce qui te prend le plus de RAM (mémoire vive). Le style d’application qui se lance à coup sûr, ce sont les launchers de tes jeux ! Pour les désactiver, appuie simultanément sur Ctrl + Alt + Suppr, clique sur « Gestionnaire des tâches », une nouvelle fenêtre va se lancer, sélectionne alors « Plus de détails ». Pour finir, dans l’onglet Démarrage, sélectionne une application (où il y a écrit « Activé » à droite), puis clique sur « Désactiver ». Je te déconseille de faire ça pour « Windows Security » et ton « Gestionnaire audio ».

D. Affichage

Même si depuis le début, on a l’impression que je déteste Windows, ce n’est pas le cas ! Il reste un très joli système d’exploitation ! Sauf qu’évidemment, ça prend une bonne partie des performances ! Comme, par exemple, l’ombre des fenêtres et leurs animations, etc… Si ton PC à vraiment besoin de la moindre puissance, désactive tout, sauf la « Lisser les polices d’écran ». Sinon c’est vraiment moche. Pour faire ça, lance « L’explorateur de fichiers », puis fais un Clic droit sur « Ce PC », et clique sur « Propriétés ». Sur la nouvelle fenêtre qui s’ouvre, clique sur « Paramètres avancées du système », sur la nouvelle fenêtre, re sélectionne « Paramètres », enfin, tu peux tout désactiver, ou sélectionner les 3 comme moi pour avoir la meilleure qualité/performance ! En bonus, dans l’onglet « Avancé », sélectionne « Les programmes ». Cela va mettre les performances de ton processeur dans les applications en cours et non celles en arrière-plan.

E. Affichage Nvidia

Cette étape est seulement pour ceux qui ont une carte vidéo Nvidia dans leurs PC. On va continuer à choisir les paramètres pour avoir la meilleure qualité/performance. Pour ça, il va falloir tout d’abord faire un Clic droit sur ton bureau et sélectionner « Panneau de configuration NVIDIA ». Clique ensuite sur l’onglet « Régler la taille et la position du bureau », puis pour « Effectuer la mise à l’échelle sur : », sélectionne « Processeur graphique ». Fini cette tâche en cliquant sur « Appliquer ». Ensuite, dans l’onglet « Régler les paramètres d’image avec Aperçu », sélectionne « Utiliser mes préférences pour améliorer : », puis place le curseur sur « Performances ». Pour finir, clique sur « Appliquer ». A noter que la différence de pixel entre « Qualité » et « Performances » n’est absolument pas la même que montré dans ce paramètre ! En jeu, la différence est à peine notable. Enfin, dans l’onglet « Gérer les paramètres 3D », met « DSR – Facteurs » sur Off (pour ça, il te suffit de désactiver tout), puis met « Filtrage de texture – qualité » sur « Hautes performances », pour finir, met « Mode de gestion de l’alimentation » sur « Privilégier les performances maximales ». Pour finir, clique sur « Appliquer ». A noter que la consommation de ton PC sera à peine affectée.

4. Conclusion

Si t’as fait tout ça, tu peux peut-être voir une différence ! Plus ton PC est déjà une machine de guerre, moins il y aura de différence. Personnellement, avec mon PC fixe qui est déjà très puissant, j’ai eu de 5 à 7% de performances en plus ! J’ai fait les mêmes tests avec un PC fixe moins puissant, il a gagné 6 à 9% de performances ! Mais les différences les plus notables sont sur les PC portables. Sur un ancien PC portable, j’ai réussi à avoir 9 à 12% de performances supplémentaires !! Ce qui est loin d’être négligeable au quotidien. Après évidemment que si tu as un processeur des années 1742 et 500 Mo de RAM, je peux pas beaucoup t’aider… fin si je te conseil vivement d’acheter un SSD (=disque dur beaucoup plus performant que les HDD), de l’installer dans ton PC et de mettre Windows dessus. De plus, si tu fais extrêmement attention sur internet, tu peux aussi désactiver Windows Defender ! Mais je te le déconseille vivement. C’est à tes risques et périls. Mais même si avec tout ça, ton Windows est vraiment beaucoup trop lent… tu peux toujours supprimer le fichier « Win32 » (ne le fait surtout pas !). Ou alors passer sur « Linux » 😉🤔 Pour finir, si tu as vraiment peur que Windows t’espionne et que tu te moques des performances tu peux néanmoins passer sur Windows XP, avec lui aucun problème de sécurité (mais des performances amoindries), la preuve il te demande ton autorisation pour tout !

Projets

Une bataille navale codée en python sur NumWorks

Jouez contre une composition aléatoire au grand classique du jeu de société : la bataille navale ! Devinez ou sont cachés les bateaux en un minimum de temps.

Introduction

Projet réalisé par A. Juge, P. Moucadeau et B. Kerneïs de la classe de première en spécialité NSI. Nous sommes également les auteurs de ce compte rendu. Pour en savoir plus : Les projets en spécialité NSI

Lien court vers ce document : https://nsi.xyz/battleship

Jouez à l’incontournable jeu de la bataille navale directement sur votre calculatrice NumWorks ou sur un émulateur compatible avec le module kandinsky (Omega – IDE) !

La bataille navale ou touché-coulé est un jeu de société commercialisé en 1831 qui se joue à deux joueurs. Le principe du jeu, si vous ne le connaissez pas, est de placer des « navires » sur une grille tenue secrète et de tenter de couler les navires adverses. La partie s’arrête lorsque l’un des deux joueur a réussi à couler tous les navires de l’autre joueur.

Dans le cadre de notre projet, le jeu codé en python a été simplifié : le joueur essaie de deviner la composition de l’ordinateur qui a été générée aléatoirement et ainsi, le jeu ne se joue que dans un seul sens. C’est à dire que le joueur ne peut que gagner ! Incroyable non ?

Vous pouvez jouer contre avec vos amis et tenter de gagner en le moins de coup possible !

Évolution

Le processus de création s’est divisé en différentes parties.

La première grille
Avec le module kandinsky, nous avons commencé par reprendre et améliorer le code de Schraf : Maths-info qui nous a permit de construire une grille de 10*10

def grille():
    '''
   Tracé de la grille
   '''
    for i in range(11):
        if i<11:fr(50,10+20*i,200,1,N)
        fr(50+20*i,10,1,200,N)

Interaction homme/machine
Ensuite, nous avons crée un « curseur » qui peut se déplacer dans cette grille en récupérant les touches pressées par le joueur grâce au module ion.

Cette portion de code sert à attendre que l’utilisateur appuie sur une touche et la récupérer.

def wait(b):
    while Partie:
        for i in b:
            if keydown(i):
                while keydown(i):True
                return i

code inspiré de Arthur Jacquin

La classe bateau
La création d’une classe bateau nous a permit de simplifier le code, notamment pour ce qui est de détecter si un bateau est touché et/ou couléuniquement avec les coordonnées du début et de la fin

bateaux1,y1x2,y2état
11,21,4touché
26,49,4safe
38,28,5coulé

Les méthodes is_touche et is_coule sont la pour repérer si un bateau est touché ou coulé lorsque le joueur décide de tirer sur une case. Elles utilisent la liste des cases composant le bateau.

def is_touch(self,x,y):
        ''''Méthode revoyant Vrai si le bateau est touché 
       et Faux si il ne l'est pas
       '''
        l = [x,y]
        for i,elt in enumerate(self.LC):
            if elt == l:
                self.etat = 1
                self.L_etats[i] = 1
                return True
      
        return False
    
    def is_coule(self):
        '''Méthode revoyant Vrai si le bateau est coulé 
       et Faux si il ne l'est pas
       '''
        if self.etat == 2:
            return True
 
        for i in self.L_etats:
            if i != 1:
                return False
 
        for j in self.LC:
            ca(j[0],j[1],N)
 
        self.L_etats = []
        for i in range(len(self.LC)):
            self.L_etats.append(2)
 
        self.etat=2
        print(self, "est coulé")
        return True

Le cerveau du programme
La fonction Main représente la boucle principale, c’est elle qui récupère les boutons pressés par les joueurs pour appeler les autres fonctions. La boucle s’arrête lorsque tous les bateaux sont dans l’état coulé.
Puisque c’est une boucle qui tourne à toutes les actions du joueur, c’est l’endroit idéal pour mettre à jour les infos du joueur, comme le nombre de coups.

def Main(n):
    '''Boucle principale'''
    global X,Y,Partie,NBcoups,NBtouches,LB
    LB = compo(n)
    grille()
    ca(X,Y,G)
    print(Partie)
    while Partie:
        t = wait([0,1,2,3,4,])
        if t == 3 and X+1<10:
            majcase(X,Y,X+1,Y)
            X+=1
        elif t == 0 and X>0:
            majcase(X,Y,X-1,Y)
            X-=1
        elif t == 1 and Y>0:
            majcase(X,Y,X,Y-1)
            Y-=1
        elif t == 2 and Y+1<10:
            majcase(X,Y,X,Y+1)
            Y+=1
        elif t == 4:
            touche(X,Y)
        ds("Coups",255,10,Bl)
        ds(str(NBcoups),255,30)
        ds("Touches",251,50,R)
        ds(str(NBtouches),255,70)

Le tirage aléatoire de la composition
Il a fallu ensuite générer aléatoirement la composition des bateaux de l’adversaire. Le module random nous a été très utile. La difficulté principale a été de faire que les bateaux ne dépassent pas de la grille. Nous avons donc décalés les bateaux étant dans cette situation en modifiant les coordonnées x1, y1 de ce dernier.

def compo(n):
    '''Générateur de composition aléatoire'''
    L= []
 
    for i in range(n):
        ori = randint(0,1)
        sens = randrange(-1,2,2)
        longueur = randint(2,4)
        x1 = randint(0,10)
        y1 = randint(0,10)
 
        if ori == 0:
            x2 = x1
            y2 = y1+(longueur*sens)
            c1 = y1
            c2 = y2
        else :
            x2 = x1+(longueur*sens)
            y2 = y1
            c1 = x1
            c2 = x2
        
        if c2 > 9:
            c1 = c1 - (c2-9)
            c2 = c1+(longueur*sens)
        elif c2 < 0:
            c1 = c1 - c2
            c2 = c1+(longueur*sens)
        
        if ori == 0:
            L.append(bateau(x1,c1,x2,c2))
        else :
            L.append(bateau(c1,y1,c2,y2))
    
    return L

Interface graphique
Puisque les conditions de jeu ne changent pas (mode de jeu, nombre de bateaux…), la présence d’un menu augmente inutilement la taille du fichier. Nous avons alors opté pour insérer une image d’accueil qui s’efface au bout de 2 secondes. Le jeu se lance lorsque les 2 secondes sont écoulées.

def play():
    fill_rect(0,0,320,222,(255,255,255))
    texte_center("Battleship", 160, 20, col_os())
    texte_center("nsi.xyz/battleship ", 160, 50, N)
    texte_center("par", 160, 80, (101,101,101))
    texte_center("Alexandre Juge", 160, 100, (42,42,42))
    texte_center("Pierre Moucadeau", 160, 120, (42,42,42))    
    texte_center("Baptiste Kerneis ", 160, 140, (42,42,42))
    sleep(2)
    fill_rect(0,0,320,222,(255,255,255))
    Main(5)
Résultat des crédits

Par la suite nous avons rajouté 2 compteurs, un comptant le nombre de coup et l’autre le nombre de bateau touché.

Lorsque le nombre de bateau touché est égale au nombre de bateau il lance un menu de fin.

def end():
    global NBcoups
    fill_rect(0,0,320,222,B)
    texte_center("Battleship", 160, 20, col_os())
    texte_center("Vous avez fait un score de :", 160, 50, N)
    texte_center(str(NBcoups), 160, 80, col_os())
    texte_center("Vous pouvez faire mieux !", 160, 100, (42,42,42))

Mention spéciale

Mention spéciale à la toute petite fonction ca qui malgré ses 2 lignes est la fonction la plus utile puisque elle permet de remplir un case. Et oui, tout simplement

Ce n’est pas la taille qui compte , « Un grand sage »

def ca(x,y,c=G):
    ''' Remplis la case x,y avec la couleur c '''
    fr(51+20*x,11+20*y,19,19,c)

Problèmes rencontrés

A la fin du processus de création nous nous sommes heurtés à de nombreux problèmes le premier étant la taille du fichier, supérieur à 8ko donc inutilisable sur la calculatrice, ont a alors dut supprimer le mode multijoueur car prenant trop de place.

Deuxièmement les bateaux généré étaient magnifique mais complètement en dehors de la grille.

Certains bateaux étaient générés en dehors de la grille

Pour régler ce problème nous avons rajouter une condition à la formation des bateaux qui fait ,que lorsqu’ils se trouvent en dehors de l’intervalle de la grille ,ils sont décalés à l’intérieur de la grille .

Anecdote

Pour l’anecdote, il faut savoir que nous voulions originellement créer un jeu uno ! Mais suite à de nombreuses difficultés, notamment la gestion de la pioche pour deux joueurs, nous nous sommes réorientés vers la bataille navale et rabattu sur une parti en solo.

Conclusion 

Pour pouvoir jouer à cette version du jeu bataille navale, téléchargez le code par l’intermédiaire du lien ci-dessous. Les commandes sont assez intuitives : les flèches pour se déplacer, et le bouton OK pour interagir.
Amusez-vous bien !

Crédits / Remerciements 

Tout d’abord un grand merci aux fragments de codes de Arthur Jacquin, notamment son menu (réalisé avec @cent20). 
Ainsi que M.Schraf pour ses tutos très utiles sur la couche graphique de Python

Téléchargement

Projets

Site avec un piano fonctionnelle , un générateur de…

Site qui renvoie aléatoirement vers un piano fonctionnel, un générateur de citation, ou un compte à rebours.

Ce projet est un site composé de 4 pages codées en html : 

La page principale

  • Présentation 

Voici la page principale de notre site, c’est elle qui renverra l’utilisateur vers 3 autres pages au hasard grâce à un script javascript que vous retrouver plus tard dans cette article. La redirection vers les sites est effectué par une interaction sur un bouton cliquable situé au centre de la page. De plus autre bouton placé en bas à droite de la page permet de changer la couleur du dégradé de fond.

  • Le code HTML
<html lang="fr">
<head>
        <link rel="stylesheet" href="main.css">
        <link rel="icon" type="image/ico" href="favicon.ico" />
        <title>Bienvenue</title>
        <meta charset="utf-8"/>
        <script src="https://package.nsi.xyz/api/"></script>
        <nsi-xyz add="menu" ref="0NSI 2020"></nsi-xyz>
</head>
<body>
  <div id="container" class="orange1">
        <h2> CLIQUEZ SUR CE BOUTON POUR ACCÉDER À UN DE NOS SITES</h2>
        <button id="style_boutton"; type="button"; ><h2>CLIQUEZ MOI</h2></button>
  </div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="target" class="orange"></button>
</body>
  • Le code CSS
html{
        margin: 0;
        height: 100%;
}
 
body {
    font-family: Verdana;
 
}
 
#container {
    width: 32rem;
    height: 21rem;
    box-shadow: 0 0 1rem 0 rgba(0, 0, 0, .2);
    border-radius: 20px;
    overflow: hidden;
    position: fixed;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}
 
 
 
h2{
  color: #d3d3d3;
  text-align: center;
}
 
 
 
#style_boutton {
        border-radius: 20px;
    font-family: Verdana;
    animation: boutton_animation 3s infinite;
    background-color: transparent;
    color: #C0C0C0;
    height: 6rem;
    width: 15rem;
    border-width: 4px;
    margin: 0;
    position: absolute;
    top: 52%;
    left: 50%;
    transform: translate(-50%, -50%);
    transition: 0.3s;
}
 
 
 
#style_boutton:hover {
    animation: boutton_animation 2s ease infinite;
    animation-fill-mode: forwards;
    cursor: pointer;
    height:40%;
    width:60%;
    font-size: 100%;
}
 
 
 
@keyframes boutton_animation {
    0% {border-color: red;}
    25%{border-color:yellow;}
                35%{border-color:orange;}
    50%{border-color:green;}
    75%{border-color:blue;}
    100% {border-color: purple;}
}
 
 
 
html {
  background: linear-gradient(to bottom right, #1B998B, #0D1317);
}
.black {
     background: linear-gradient(to bottom right, #006BA6, #D81159);
}
.blue {
     background: linear-gradient(to bottom right, #C81D25, #23395B);
}
.orange{
     background: linear-gradient(to bottom right, #1B998B, #0D1317);
}
.black1 {
     background: linear-gradient(to top left , #006BA6, #D81159);
}
.blue1 {
     background: linear-gradient(to top left , #C81D25, #23395B);
}
.orange1 {
     background: linear-gradient(to top left , #1B998B, #0D1317);
}
#target {
          height: 50px;
          width: 50px;
        color: #fff;
        border-radius: 50%;
          display: inline-block;
          text-shadow: #000 1px 1px 1px;
          cursor: pointer;
          border: none;
          position:absolute;
          bottom:0;
          right:0;
          transition: 0.5s;
}
#target:hover{
          height: 58px;
          width: 58px;
}
  • Les scripts javascript
  • Le script changeur de thème

Ce script sera exécuté lorsque l’utilisateur appuiera sur le bouton en bas à droite de l’écran. Il changera alors la class de l’arrière-plan. Les classes (dans le css) « black », « blue », et « orange » sont utilisé pour l’arrère plan de l’html alors que « black1 », « blue1 », et « orange1 » sont utilisé pour l’arrière plan du container au ilieu de l’écran.

<script>
    var colors = [
    'orange',
    'blue',
    'black'
  ];
    var colors1 = [
    'orange1',
    'blue1',
    'black1'
  ];
    var currentColor = 0;
    var currentColor1 = 0;
    var target = jQuery('#target');
    var target1 = jQuery('html');
    var target2 = jQuery('#container');
 
 
    target.click(function (evt) {
      currentColor += 1;
      currentColor1 += 1;
      currentColor %= colors.length;
      currentColor1 %= colors1.length;
      target1.prop('class', colors[currentColor]);
      target.prop('class', colors[currentColor]);
      target2.prop('class', colors1[currentColor1]);
 
    });
</script>
Télécharger

Le scripte qui renvoi vers d'autre sites
Lorsque le bouton au milieu de l'écran est utilisé, le script sera utilisé, et l'utilisateur sera renvoyé vers une de nos pages aléatoirement.

<script>
  var links = new Array();
  links[0] = "http://kebab.nsi42.net/new/compte_a_rebours.html";
  links[1] = "http://kebab.nsi42.net/new/citation.html";
  links[2] = "http://kebab.nsi42.net/new/piano.html";
 
  function openLink() {
    var i = Math.floor(Math.random() * links.length);
    parent.location = links[i];
    return false;
  }
</script>

Le piano

  • Présentation

Voici notre page piano dans laquelle est présent un « extrait » de piano que l’utilisateur pourra utiliser grâce aux touches de son clavier. Lorsque l’utilisateur appuiera sur l’une des touches du clavier, la note correspondante à la touche s’affichera au dessus du piano.

  • Le code HTML
<html lang="fr">
<head>
        <title>Piano</title>
        <link rel="stylesheet" type="text/css" href="piano111.css">
        <meta charset="utf-8">
  <script src="https://package.nsi.xyz/api/"></script>
</head>
<header>
  <h1>Piano</h1>
  <h2>Afin d'utiliser ce magnifique piano il faut utiliser les touches de ton clavier. Regarde le tableau de correspondance des touches. Et vas y petit Mozart.</h2>
</header>
<body>
  <nsi-xyz add="menu" ref="0NSI 2020"></nsi-xyz>
  <section id="wrap">
    <section id="main">
        <div class="nowplaying"></div>
        <div class="keys">
                        <div data-key="81" class="key" data-note="Do"><p>Q</p></div>
                        <div data-key="90" class="key sharp" data-note="Do#"><p>Z</p></div>
                        <div data-key="83" class="key" data-note="Ré"><p>S</p></div>
                        <div data-key="69" class="key sharp" data-note="Ré#"><p>E</p></div>
                        <div data-key="68" class="key" data-note="Mi"><p>D</p></div>
                        <div data-key="70" class="key" data-note="Fa"><p>F</p></div>
                        <div data-key="84" class="key sharp" data-note="Fa#"><p>T</p></div>
                        <div data-key="71" class="key" data-note="Sol"><p>G</p></div>
                        <div data-key="89" class="key sharp" data-note="Sol#"><p>Y</p></div>
                        <div data-key="72" class="key" data-note="La"><p>H</p></div>
                        <div data-key="85" class="key sharp" data-note="La#"><p>U</p></div>
                        <div data-key="74" class="key" data-note="Si"><p>J</p></div>
                        <div data-key="75" class="key" data-note="Do"><p>K</p></div>
                        <div data-key="79" class="key sharp" data-note="Do#"><p>O</p></div>
                        <div data-key="76" class="key" data-note="Ré"><p>L</p></div>
                        <div data-key="80" class="key sharp" data-note="Ré#"><p>P</p></div>
                        <div data-key="77" class="key" data-note="Mi"><p>M</p></div>
        </div>
 
      <audio data-key="81" src="http://carolinegabriel.com/demo/js-keyboard/sounds/040.wav"></audio>
      <audio data-key="90" src="http://carolinegabriel.com/demo/js-keyboard/sounds/041.wav"></audio>
      <audio data-key="83" src="http://carolinegabriel.com/demo/js-keyboard/sounds/042.wav"></audio>
      <audio data-key="69" src="http://carolinegabriel.com/demo/js-keyboard/sounds/043.wav"></audio>
      <audio data-key="68" src="http://carolinegabriel.com/demo/js-keyboard/sounds/044.wav"></audio>
      <audio data-key="70" src="http://carolinegabriel.com/demo/js-keyboard/sounds/045.wav"></audio>
      <audio data-key="84" src="http://carolinegabriel.com/demo/js-keyboard/sounds/046.wav"></audio>
      <audio data-key="71" src="http://carolinegabriel.com/demo/js-keyboard/sounds/047.wav"></audio>
      <audio data-key="89" src="http://carolinegabriel.com/demo/js-keyboard/sounds/048.wav"></audio>
      <audio data-key="72" src="http://carolinegabriel.com/demo/js-keyboard/sounds/049.wav"></audio>
      <audio data-key="85" src="http://carolinegabriel.com/demo/js-keyboard/sounds/050.wav"></audio>
      <audio data-key="74" src="http://carolinegabriel.com/demo/js-keyboard/sounds/051.wav"></audio>
      <audio data-key="75" src="http://carolinegabriel.com/demo/js-keyboard/sounds/052.wav"></audio>
      <audio data-key="79" src="http://carolinegabriel.com/demo/js-keyboard/sounds/053.wav"></audio>
      <audio data-key="76" src="http://carolinegabriel.com/demo/js-keyboard/sounds/054.wav"></audio>
      <audio data-key="80" src="http://carolinegabriel.com/demo/js-keyboard/sounds/055.wav"></audio>
      <audio data-key="77" src="http://carolinegabriel.com/demo/js-keyboard/sounds/056.wav"></audio>
      </section>
  </section>
 
    <table class="tableau-style">
 
        <thead>
            <tr>
                <th>Do</th>
                <th>Ré</th>
                <th>Mi</th>
                <th>Fa</th>
                <th>Sol</th>
                <th>La</th>
                <th>Si</th>
                <th>Do</th>
                <th>Ré</th>
                <th>Mi</th>
                <th>Do#</th>
                                <th>Ré#</th>
                                <th>Fa#</th>
                                <th>Sol#</th>
                                <th>La#</th>
                <th>Do#</th>
                                <th>Ré#</th>
            </tr>
        </thead>
 
 
        <tbody>
            <tr>
                <td>Q</td>
                <td>S</td>
                <td>D</td>
                <td>F</td>
                <td>G</td>
                <td>H</td>
                <td>J</td>
                <td>K</td>
                <td>L</td>
                <td>M</td>
                <td>Z</td>
                <td>E</td>
                <td>T</td>
                <td>Y</td>
                <td>U</td>
                <td>O</td>
                <td>P</td>
 
            </tr>
 
        </tbody>
 
    </table>
  • Le code CSS
html{
  background: linear-gradient(#006494, #FF1053);
        margin: 0;
        height: 100%;
}
 
body  {
        font-family: 'Noto Serif', serif;
        text-align: center;
      }
 
 
header {
      position: relative;
      margin: 30px 0;
    }
 
header:after {
      content: '';
      width: 460px;
      height: 15px;
      display: inline-block;
      text-align: center;
      background-size: 70%;
    }
 
h1 {
      color: #fff;
      font-size: 50px;
      font-weight: 400;
      letter-spacing: 0.18em;
      text-transform: uppercase;
      margin: 0;
    }
 
h2 {
      color: #fff;
      font-size: 24px;
      font-style: italic;
      font-weight: 400;
      margin: 0 250px 30px;
 
    }
 
 
 
.nowplaying {
      font-size: 120px;
      line-height: 1;
      color: #eee;
      text-shadow: 0 0 5rem #028ae9;
      transition: all .07s ease;
      min-height: 120px;
    }
 
.keys {
      display: block;
      width: 100%;
      height: 350px;
      max-width: 880px;
      position: relative;
      margin: 40px auto 0;
      cursor: none;
    }
 
.key {
      position: relative;
      border: 4px solid black;
      border-radius: .5rem;
      transition: all .07s ease;
      display: block;
      box-sizing: border-box;
      z-index: 2;
    }
 
.key:not(.sharp) {
      float: left;
      width: 10%;
      height: 100%;
      background: rgba(255, 255, 255, .8);
    }
 
.key.sharp {
      position: absolute;
      width: 6%;
      height: 60%;
      background: #000;
      color: #eee;
      top: 0;
      z-index: 3;
    }
 
.key[data-key="90"] {
      left: 7%;
    }
 
.key[data-key="69"] {
      left: 17%;
    }
 
.key[data-key="84"]  {
      left: 37%;
    }
 
.key[data-key="89"] {
      left: 47%;
    }
 
.key[data-key="85"] {
      left: 57%;
    }
 
.key[data-key="79"] {
      left: 77%;
    }
 
.key[data-key="80"] {
      left: 87%;
    }
 
.playing {
      transform: scale(.95);
      border-color: #028ae9;
      box-shadow: 0 0 1rem #028ae9;
 
    }
 
.hints {
      display: block;
      width: 100%;
      opacity: 0;
      position: absolute;
      bottom: 7px;
 
      font-size: 20px;
        }
 
 
 
.tableau-style  {
        cursor: none;
    border-collapse: collapse;
    min-width: 400px;
         font-style: italic;
    width: auto;
    box-shadow: 0 5px 50px rgba(0,0,0,0.15);
    margin: 100px auto;
    border: 2px solid black;
}
 
thead tr {
    background-color: black;
    color: #fff;
    text-align: center;
}
 
tbody tr {
    background-color: white;
    color: black;
    text-align: center;
}
 
th, td {
    padding: 15px 20px;
}
 
tbody tr, td, th {
    border: 1px solid ;
}
 
tbody tr:nth-child(even){
    background-color: #f3f3f3;
}
  • Le scripts javascript du piano

Dans ce script javascript est présent une ligne très importante :

if (e.repeat) return;

qui empèche la répétition de la note de musique qui ferait planter le piano lorsque l’utilisateur maintiendrai la touche enfoncée.

<script>
                const keys = document.querySelectorAll(".key"),
                note = document.querySelector(".nowplaying"),
                hints = document.querySelectorAll(".hints");
 
                function playNote(e) {
                const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`),
                key = document.querySelector(`.key[data-key="${e.keyCode}"]`);
 
                if (!key) return;
                if (e.repeat) return;
 
                const keyNote = key.getAttribute("data-note");
 
                key.classList.add("playing");
                note.innerHTML = keyNote;
                audio.currentTime = 0;
                audio.play();
                }
 
                function removeTransition(e) {
                if (e.propertyName !== "transform") return;
                this.classList.remove("playing");
                }
 
                function hintsOn(e, index) {
                e.setAttribute("style", "transition-delay:" + index * 50 + "ms");
                }
 
                hints.forEach(hintsOn);
 
                keys.forEach(key => key.addEventListener("transitionend", removeTransition));
 
                window.addEventListener("keydown", playNote);
        </script>

Le compte à rebours

  • Présentation

Voici la page compte à rebours de la fin présumé d’internet. Au centre de l’ecran se trouve le compte à rebours ayant pour fin 2023 sur un fond gif.

  • Le code HTML
<html lang="fr">
<html>
<head>
  <link rel="stylesheet" href="compte_a_rebours.css">
  <link rel="icon" type="image/ico" href="favicon.ico" />
  <title>END</title>
  <meta charset="utf-8"/>
  <script src="https://package.nsi.xyz/api/"></script>
</head>
<body>
<nsi-xyz add="menu" ref="0NSI 2020"></nsi-xyz>
<div class="container">
  <h1 id="headline">Compte a rebours de la Fin d'Internet:</h1>
  <div id="countdown">
    <ul>
      <li><span id="days"></span>days</li>
      <li><span id="hours"></span>Hours</li>
      <li><span id="minutes"></span>Minutes</li>
      <li><span id="seconds"></span>Seconds</li>
    </ul>
  </div>
  <div class="message">
    <div id="content">
      <span class="emoji">&#128126; </span>
      <span class="emoji">&#128187;</span>
      <span class="emoji">&#128128;</span>
    </div>
  </div>
</div>
  • Le code CSS
* {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}
 
html, body {
  height: 100%;
  margin: 0;
}
 
body {
  align-items: center;
  background-image:url(images/36010.gif);
  display: flex;
  font-family: -apple-system,
    "Segoe UI",
    "Helvetica Neue",
    sans-serif;
}
 
.container {
  color: white;
  margin: 0 auto;
  text-align: center;
}
 
h1 {
  font-weight: bolder;
  letter-spacing: .125rem;
  text-transform: uppercase;
}
 
li {
  display: inline-block;
  font-size: 1.5em;
  list-style-type: none;
  padding: 1em;
  text-transform: uppercase;
}
 
li span {
  display: block;
  font-size: 4.5rem;
}
 
.message {
  font-size: 4rem;
}
 
#content {
  display: none;
  padding: 1rem;
}
 
.emoji {
  padding: 0 .25rem;
}
  • Le scripts javascript du compte à rebours
<script>
(function () {
  const second = 1000,
        minute = second * 60,
        hour = minute * 60,
        day = hour * 24;
 
  let annee = "Janvier 1, 2023 00:00:01",
      countDown = new Date(annee).getTime(),
      x = setInterval(function() {
 
        let now = new Date().getTime(),
            distance = countDown - now;
 
        document.getElementById("days").innerText = Math.floor(distance / (day)),
          document.getElementById("hours").innerText = Math.floor((distance % (day)) / (hour)),
          document.getElementById("minutes").innerText = Math.floor((distance % (hour)) / (minute)),
          document.getElementById("seconds").innerText = Math.floor((distance % (minute)) / second);
 
        //do something later when date is reached
        if (distance < 0) {
          let headline = document.getElementById("headline"),
              countdown = document.getElementById("countdown"),
              content = document.getElementById("content");
 
          headline.innerText = "C'est la Fin !";
          countdown.style.display = "none";
          content.style.display = "block";
 
          clearInterval(x);
        }
        //seconds
      }, 0)
  }());
 
</script>
  • Le script javascript de la page qui s’ouvre

Ce script Javascript permet de d’ouvrir une page lorsque l’utilisateur écrira le mot « end » avec les touches de son clavier.

<script>
function openPage(pageName,elmnt,color) {
  var i, tabcontent, tablinks;
  tabcontent = document.getElementsByClassName("tabcontent");
  for (i = 0; i < tabcontent.length; i++) {
    tabcontent[i].style.display = "none";
  }
  tablinks = document.getElementsByClassName("tablink");
  for (i = 0; i < tablinks.length; i++) {
    tablinks[i].style.backgroundColor = "";
  }
  document.getElementById(pageName).style.display = "block";
  elmnt.style.backgroundColor = color;
}
 
// Get the element with id="defaultOpen" and click on it
document.getElementById("defaultOpen").click();
</script>
<script>
            var index = 0;
            var magic_word = "end";
                if (e.key == magic_word[index]) {
                    index++;
 
                    if (index == magic_word.length) {
                        window.open("https://www.youtube.com/watch?v=EqaHgjv_Snc", "_blank");
                        index = 0;
                    }
                } else {
                    index = 0;
                }
            }
</script>

Le générateur de citations

  • Présentation

Voici la page générateur de citations qui présentera à l’utilisateur lorsqu’il qu’il le voudra divers citation de personne fictif ou bien réel. Enregistré en variable dans les scripts javascript. De plus le fond de la page est une gradation de couleur en mouvement constant.

  • Le code HTML
<html lang="fr">
<head>
        <link rel="stylesheet" href="citation.css">
        <link rel="icon" type="image/ico" href="favicon.ico" />
        <title>Citation</title>
        <meta charset="utf-8"/>
        <script src="https://package.nsi.xyz/api/"></script>
<body>
        <nsi-xyz add="menu" ref="0NSI 2020"></nsi-xyz>
</body>
 
        <div class="container">
                <div class="citation">
                        <div id="citationplace"></div>
                </div>
                <div class="auteur">
                        <div id="auteurplace"></div>
                </div>
        <button>Nouvelle Citation</button>
</div>
</body>
</html>
  • Le code CSS
@import url('https://fonts.googleapis.com/css2?family=Montserrat&display=swap');
 
.container{
        width: 32rem;
        height: 21rem;
        box-shadow: 0 0 1rem 0 rgba(0, 0, 0, .3);
        border-radius: 20px;
        overflow: hidden;
        position: fixed;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        background-color: rgba(0, 0, 0, 0.08);
        overflow: hidden;
        color:white;
}
 
.guil{
        font-size: 10%;
}
 
.citation{
        text-align: left;
        margin-top: 20px;
        margin-left: 10px;
        margin-right: 10px;
        font-size:31px;
}
 
.auteur{
        margin-left: 10px;
        margin-right: 10px;
        margin-bottom: 10px;
        text-align: right;
        font-size:28px;
}
 
html {
        font-family: 'Montserrat', sans-serif;
        background: linear-gradient(to top left, #ee7752, #e73c7e, #23a6d5, #23d5ab);
        background-size: 400% 400%;
        animation: gradient 15s ease infinite;
        width:100%;
        height:100%;
}
 
button{
        width:30%;
        height:20%;
    position:absolute;
    bottom:0;
    right:0;
        transition: 0.3s;
    cursor:pointer;
        color: white;
        text-transform: uppercase;
        background-color: rgba(0, 0, 0, 0.08);
        padding: 20px;
        border-radius: 5px;
        display: inline-block;
        border: none;
        transition: all 0.4s ease 0s;
        border-radius: 5px;
}
 
button:hover{
        background-color: rgba(0, 0, 0, 0.2);
        letter-spacing: 2px;
        animation: titre 1s;
        width:31%;
        height:21%;
}
 
 
@keyframes gradient {
        0% {background-position: 0% 50%;}
        50% {background-position: 100% 50%;}
        100% {background-position: 0% 50%;}
}
  • Les scripts javascript
  • Le script changeur de citation

A chaque fois que l’utilisateur actualise la page ou que le bouton est utiliser, une nouvelle citation qui est dans dans la variable « citations » sera affiché.

<script>
        var auteur = [
                "Maitre Oogway",
                "Maitre Oogway",
                "Martin Luther King",
                "Confucius",
                "Jean-Paul Sartre",
                "Victor Hugo",
                "Albert Einstein",
                "Oscar Wilde",
                "Albert Einstein",
                "Emmanuel Kant",
                "Douglas Adams",
                "Maitre Yoda"
        ]
        var citations = [
                "❝Hier est derrière, demain est mystère, et aujourd'hui est un cadeau, c'est pour cela qu'on l'appelle le présent.❞",
                "❝On rencontre souvent sa destinée par les chemins qu'on a pris pour l'éviter.❞",
                "❝Celui qui accepte le mal sans lutter contre lui coopère avec lui.❞",
                "❝Exige beaucoup de toi-même et attends peu des autres. Ainsi beaucoup d'ennuis te seront épargnés.❞",
                "❝Dans la vie on ne fait pas ce que l'on veut mais on est responsable de ce que l'on est.❞",
                "❝On passe une moitié de sa vie à attendre ceux qu'on aimera et l'autre moitié à quitter ceux qu'on aime.❞",
                "❝La vie, c'est comme une bicyclette, il faut avancer pour ne pas perdre l'équilibre.❞",
                "❝La beauté est dans les yeux de celui qui regarde.❞",
                "❝Un problème sans solution est un problème mal posé.❞",
                "❝La musique est la langue des émotions.❞",
                "❝42 est la réponse à la grande question sur la vie, l'univers et le reste❞",
                "❝Difficile à voir. toujours en mouvement est l'avenir.❞"
        ]
        function nouveaux() {
                var rand = Math.floor(Math.random() * (citations.length));
                document.getElementById('citationplace').innerHTML = citations[rand];
                document.getElementById('auteurplace').innerHTML = auteur[rand];
        }
        </script>
  • Le script javascript changeur d’image

A chaque fois que l’utilisateur actualise la page ou que le bouton est utiliser, une nouvelle image tiré au hasard de Flickr sera affiché. Cette image est trouvé grâce au mot clé « autumn forest ».

</script>
 
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
        <script type="text/javascript">
        var keyword = "autumn forest";
        $(document).ready(function (){
                        $.getJSON("http://api.flickr.com/services/feeds/photos_public.gne?jsoncallback=?",
                        {
                                        tags: keyword,
                                        tagmode: "any",
                                        format: "json"
                        },
                        function (data) {
                                        var rnd = Math.floor(Math.random() * data.items.length);
                                        var image_src = data.items[rnd]['media']['m'].replace("_m", "_b");
                                        $('.container').css('background-image', "url('" + image_src + "')");
                        });
        });
 
 
        </script>

Un problème rencontré

Lors de la programation de nos page nous avons constaté plus précisément dans la page du piano, que la personne ayant codé le javascript avait codé avec un choix de touche adapté au clavier QWERTY il a donc fallut modifié les touches du clavier en l’adaptant pour un clavier AZERTY. Cette action a était possible en changeant les DATA-KEY des touches.

Projets

Un donjon textuel en Python sur la NumWorks

Mini jeux sous forme de jeux de rôle. Nommé dungeon, ce jeu consiste à remplir des mini quêtes en interagissant avec des personnage fictif.

L’histoire du jeu textuel

En 1972, William Crowther programme la première fiction interactive, nommée Adventure. Nécessitant 300 Ko de stockage, il était programmé sur un PDP 10, un ordinateur créé à la fin des années 1960 .
Cependant ce style de jeu a aussi existé sous forme de livres, les livres dont vous êtes le héros. Ce sont donc ces livres, qui ont bercé notre enfance, qui nous ont donné l’idée de ce jeu, Dungeon !

De l’idée à la conception

Après un long débat, nous étions parvenus à la conclusion que notre jeu proposerait toujours 2 choix, et qu’il n’existerait qu’une seule fin valable. Mais l’imagination débordante de notre professeur nous a permis de revoir l’idée de notre jeu. Ainsi nous vous proposons de naviguer dans un donjon, en interagissant avec différents personnages fantastiques.
Nous avons choisi différents personnages, ainsi que leurs interactions. Pour les plus cruels des joueurs, nous offrons la possibilité de tuer certains personnages, à leurs risques et périls. Tout au long de cette aventure, il sera possible de récolter des objets différents permettant de sortir du donjon.

Le début du codage

Il nous a fallu définir une variable pour chaque personnage ou objet contenant l’état de ce personnage ou objet :

  • True : le personnage est en vie ou l’objet est en votre possession
  • False : le personnage est mort ou vous ne possédez pas l’objet.

Ceci fait, on a cherché le moyen de coder chaque interaction. Ainsi, on demande au joueur de choisir entre plusieurs possibilités, et la réponse entrée est testée pour effectuer l’action correspondante. Le code pris cette forme (\n indiquant un saut de ligne) :

x=int(input("Que voulez vous faire entre :\n1 : manger un steak \n2 : ne pas manger de steak ?\n\nChoix : ")
if x==1 :
    print("vous mangez un steak")
elif x==2 :
    print("Vous ne mangez pas de steak")

Coder jusqu’à la fin !

Il nous a fallu coder chacune des pièces dans lesquelles le joueur peut se rendre dans une fonction def, permettant de tester et débuguer plus facilement nos lignes de code. Nous avons gardé cette écriture pour plus de lisibilité.
Une fois les salles et les interactions avec les personnages codées, un long travail de saut de ligne (\n) s’est mis en place pour rendre lisible le jeu. De cette manière, nous avons essayé d’optimiser la lecture à l’écran.

def room1():
    print("Vous entrez dans la salle du\nFourneau.\nParler : ")
    if etat[2]==True :
        print("\n1 : au", objet[2])
    if etat[6]==True :
        print("2 : a l'", objet[6])
    f=int(input("\n\n\n\n\nChoix : "))
    if f==1 and etat[2]==True :
        fo=int(input("Bonjour, je peux vous forger\nce que vous voulez, mais\navec des materiaux.\n\n1 : Avez-vous ... ?\n2 : Tuer le forgeron\n3 : Donner un objet\n\n\n\n\nChoix : "))
        if fo==1 :
            print("Oh vous etes le livreur,\ntenez, c'est la pioche du\nmineur. Allez lui donner,\nil a deja tout paye.\n\n\n")
            etat[10]=True
        elif fo==2 :
            print("Argh je me meurs !\n\n\n\n\n")
            etat[2]=False
            etat[19]=etat[19]+1
        elif fo==3 :
            if etat[9]==True :
                print("Un instant, je vous forge\nune epee avec ceci !\n\n\n\n")
                etat[11]=True
            else :
                print("Je ne peux rien faire\npour vous, desole\n\n\n\n\n")
    elif f==2 and etat[6]==True :
        al=int(input("Bienvenue, je suis\nl'alchimiste Gandalf,\nspecialiste de\nl'immortalite.\n\n1 : Gandalf ?\n2 : Tuer Gandalf\n3 : Prendre une potion\n\n\n\nChoix : "))
        if al==1 :
            print("Je suis Gandalf, un\nimmortel de 70 ans.\n\n\n\n")
        elif al==2 :
            print("Ainsi je meurs.\n\n\n\n\n")
            etat[6]=False
            etat[19]=etat[19]+1
        elif al==3 :
            print("Je vous echange ma potion\ncontre un STEAK.")
            if etat[12]==True :
                print("Tenez. Bonne journee.\n\n\n\n")
                etat[15]=True
            else :
                print("PAS TOUCHE A MES POTIONS!\n\n\n\n") 

Les difficultés encontrées…

Notre idée première était d’établir chacune des variables désignant un personnage ou un objet en début de code, sous la forme suivante (avec comme exemple un nain et sa hache) :

nain=True
hache=False

Seulement, ce style de définition de variables est « local », il ne peut être utilisé que dans le code en lui-même et non pas dans les fonctions defdes salles, dans lesquelles nous utilisions ces variables. Notre professeur, M. Robert, nous a expliqué que certaines définitions de variables étaient donc « globales », comme les tableaux. Ainsi nous avons codé toutes nos variables dans deux tableaux, l’un contenant le nom de la variable et l’autre la valeur de la variable. Nous obtenions donc ceci :

nom=["nain", "hache"]
etat=[True, False]

Par la suite, il nous a fallu remplacer chaque variable par le nom du tableau et le nombre correspondant au tableau. Selon les exemples précédents, « nain » devait être changé en « nom[0] » ou « etat[0] ». Nos vingt-et-une variable échangées dans le code pour le nom des tableurs, il nous fut plus complexe de coder mais cela était encore faisable.
Enfin, il nous a fallu définir la manière dont le programme afficherait chaque interactions. Nous disposions de 11 lignes sur l’écran, et pour que le jeu soit le plus clair possible il fallait que chaque interface occupe 11 lignes ( de temps en temps 10 ou 9 si vous vous comportez mal dans notre jeu, c’est le karma). nous avons donc opté pour une version lisible et ordonnée.

A vous de jouer !

Notre jeu étant composé de nombreuses interactions avec des personnages, et ne voulant pas spoiler notre jeu, nous ne voulons pas vous montrer trop d’images de ce jeu.
Mais vous pouvez télécharger Dungeon sur votre calculatrice via le bouton rouge ci-dessous ou en cliquant ici.

Télécharger et tester

Serveur Workshop de NumWorks tiplanet.org nsi.xyz 
RemarquesPermet un téléchargement rapide sur la calculatriceTéléchargement .pyTéléchargement .zip
Liens hypertexteslienNumWorks > Jeux > Lien