les bases de la programmation

Répondre
Partager Rechercher
Salut à tous. Même si NwN2 n'est pas encore sorti, qui n'a jamais pesté de ne rien comprendre aux hiéroglyphes de la programmation lorsqu'il s'agissait de donner un peu d'interactivité à un module ?
La programmation possédant des bases commune à tous les langage il n'est pas inutile de les présenter ici dés aujourd'hui pour que les futur modeurs puissent faire leur première armes dans le monde de l'interactivité.

Alors entrons directement dans le vif du sujet !

il y'a qutre type d'objets en programmation (rien à voir avec la programmation orientée objet qu'il est préférable d'aborder dans un second temps) :

- les variable
- les opérateurs
- les fonctions
- les boucles


les variables :

Il s'agit de valeurs qui peuvent changer au cours du temps. Par exemple, les caractéristiques d'un personnage tels que son intelligence, sa force, son nom etc.

généralement on les déclare comme ceci :

<type de la variable> <nom de la variable> <valeur>

par exemple :

int force = 12
string nom = roger
float poids = 68,5

les mots int, string et float sont empruntés aux langage tels que le C, C++ ou encore Java.

int est utilisé pour désigner un nombre entier, tandis que float l'est pour les nombres à virgule. String quand à lui désigne un suite de caractères (lettres, nombres, ponctuations). Ce topic, par exemple, est enregistré dans la base de donnée du forum comme étant une string ("chaîne" en français).

Il y'a d'autres types de variable, comme par exemple le type booléen. Un nom bizarre qui viens du mathématicien qui les à "inventés" et qui s'appelait Boole. Ce type ne peut prendre que deux valeurs : vrai ou faux (true ou false).

Il y'a aussi le type char qui est un simple caractère, comme une chaîne mais composée d'un seul élément, par exemple 'c' ou '2' ou '#' etc.

Il existe d'autres types selon les langages, mais je ne les aborderaient pas ici car on entre alors dans des cas particuliers qui pourraient s'éloigner fortement des possibilités du NwNScript.


Citation :
parenthèse :
Il est bon de savoir que tout ceci n'est qu'une convention d'écriture définie par les créateurs des différents langages.

En effet, dans mon exemple on écrit 'int force = 12' mais dans certains langages de programmation on écrira ' force = 12 as int'.

Pourquoi ?

parce qu'un ordinateur ne comprend absolument pas ce que veux dire 'int' ou 'float', il ne comprend que des trucs du genre 0110100101....

Et oui, les langages de programmation ont étés créés pour les humains, pas pour les ordinateurs !
Et il y'a autant de manière d'écrire en informatique qu'il y'en à dans la vie réelle (français, anglais, arabe, chinois, hiéroglyphes)
Encore une chose concernant les variable. Lorsqu'une variable possède une valeur qui ne change jamais on appelle ça une constante, par exemple le nombre 'PI', ou la vitesse de la lumière 'C'.

Il est à noter qu'il n'est pas toujours obligatoire de donner une valeur dès le départ. On peut par exempl écrire :
int force

dans ce cas là la valeur devra absolument être définie plus tard.

Les opérateurs

A quoi servent les opérateur ?

A faire des opérations, tout simplement.

Il y'a les opérateur mathématiques : + - * / =
les opérateurs de comparaison : > < <= >= et == et !=

un précision sur les deux derniers :
== permet de savoir si deux valeurs sont égales, il est très courant de se tromper et d'écrire = à la place et ça n'a pas du tout le même résultat.

== est une question. Par exemple :

est ce que (force de roger) == (force de zombie) ?

tandis que = est une affirmation, par exemple

oui, (force de roger) = (force du zombie) !

dans le premier cas on essaye de savoir quelques chose qu'on ne sais pas, tandis que dans le second on modifie la valeur de la force de roger pour qu'elle soit égale à celle du zombie. Donc attention à ne pas se tromper sur ce coup là.

Concernant !=, il peut être écrit comme ceci <>
La aussi c'est un choix fait par les créateurs du langage.
La signification est le contraire de ==

par exemple (force de roger) != (force du zombie) est une question dans la quelle on essaye de savoir si les deux forces sont différentes

les fonctions

les fonction sont en fait des mécanismes assez complexe. Ce sont des suite d'opérations.

on les note fréquemment comme ceci :

Citation :
int nom_de_la_fonction(paramètre_1, paramètre_2,...)
{
mécanisme de la fonction
}
par exemple :

Citation :
int addition(nombre_1, nombre_2)
{
return nombre_1 + nombre_2
}
cette fonction additionne les deux nombres et "retourne" le résultat grace au mot "return".

qu'est ce que ça veux dire ?

prenons un exemple. On veux savoir quelle est l'agilité totale d'un personnage en fonction des bonus qu'il à en ce moment. On écrira une fonction du genre :

Citation :
int calculAgilite(agilite, bonus)
{
return agilite + bonus
}
et dans notre script on pourra utiliser le resultat comme ceci :

Citation :
int agiliteTotale

agiliteTotale = calculAgilite(agilite, bonus)
comme vous pouvez le remarquer il y'a deux étape.

La première s'appelle la "déclaration" de la fonction :
Citation :
int calculAgilite(agilite, bonus)
{
return agilite + bonus
}
la seconde est son utilisation dans un script :
Citation :
agiliteTotale = calculAgilite(agilite, bonus)
quel intérêt ?

imaginons que nous avons écrit une fonction très longue, qui fait plusieurs dizaines de lignes. Si nous voulions l'utiliser plusieurs fois dans notre script il faudrait faire un copier/coller de toutes les lignes à chaque fois... on aurais alors un script extrêmement long et, si par malheur on voulais modifier la fonction on devrait aller chercher partout dans notre programme pour modifier tous les copier/ collé !

alors on va laisser l'ordinateur faire les copier/coller pour nous en déclarant la fonction une fois et en utilisant la forme simplifiée dans notre script.

Les boucles

une boucle sert à effectuer des opération en série ou, dans le cas des boucles conditionnelles, une seule fois mais uniquement dans certaine condition.

les boucles les plus généralement utilisée en programmation :

- le if

Citation :
if (force_roger < force_zombie)
{
mécanismes de la boucle
}
dans cet exemple on teste d'abord la condition (force_roger < force_zombie). Le resultat nous donnera vrai ou faux selon que la force de roger est inferieure à celle du zombie ou non.

On vois tout de suite l'interet de ce genre de boucle.

Par exemple, si le zombie est en train de pousser roger vers un précipice pour l'y faire tomber, via un script on vérifiera lequel des deux à la plus grande force et, en fonction du résultat on ferra ce qui est entre les accolades ou non.

par exemple

Citation :
if (force_roger < force_zombie)
{
roger tombe dans le précipice !
}

sinon, roger ne tombe pas et on continu le script sans passer par le programme entre les accolades
si roger et le zombie sont en train de se pousser mutuellement vers le précipice on pourra écrire quelque chose du genre :

Citation :
if (force_roger < force_zombie)
{
roger tombe dans le précipice !
}
else if (force_roger > force zombie)
{
c'est le zombie qui tombe cette fois car roger à plus de force !
}
else
{
personne ne tombe car leurs forces sont égales, à moins qu'ils ne tombent tous les deux ?
}

je m'arrete ici faute de temps, je reprendrais ce soir
superbe! très bonne base pour une première approche du scripting ^^

Il manque peu de chose pour le compléter après sa le top serais de faire 8 ou 10 exercise! Comme à l'école pour savoir si on à bien compris avec la réponse en spoil.

Exemple:

Définir la force de roger puis donner la même force au zombie + 3

Cliquez ce bouton ou survolez le contenu pour afficher le spoiler


Force_roger = 10

Force_zombie = Force_roger + 3



Ensuite il ne resterais plus qua poster les réponses et verifier si tout est juste , si il ya des fautes les dieux du script pourais expliquer pourquoi et ou.
bon, ce matin j'ai laissé roger aux prises avec un zombie. Il doit avoir des crampes a force de m'attendre au bord ce ce précipice

Mais reprenons l'histoire.

J'étais en train d'expliquer ce qu'est un if et dans le dernier bout de programme j'ai mis un else if et un else !

qu'est ce que c'est ?

reprenons l'histoire mais en français :

Citation :
si la force de roger est inférieure à celle du zombie
- roger tombe dans le précipice
sinon si la force de roger est supérieure a celle du zombie
- le zombie tombe
sinon
- personne ne tombe
et oui, if et esle ne sont finalement que les traductions anglophones de nos mots de tous les jours en français. Comme quoi, la prog c'est pas compliqué, c'est juste une hitoire de programmeur qui veulent se faire mousser avec des mots compliqués

mais pourquoi écrire la force de roger et la force du zombie ? c'est long à écrire, et comme les programmeurs sont aussi des feignants (et je suis un trés bon programmeurs... ) on va écrire par exemple for_roger et for_zombie.

traduction en langage de programmation :

Citation :
if for_roger < for_zombie
si la force de roger est inferieure à la force du zombie
à noter qu'on pourrait remplacer for_roger par iueDroAzz54r_zrtzer654____aze. L'ordinateur lui s'en balance puisse que de toute façon il ne comprend rien a ce qu'on lui raconte tant que ça n'a pas été traduit en 0110100110.
Par contre, si vous donnez ce genre de nom compliqué a toutes vos variables, c'est vous qui allez finir par ne plus rien comprendre à ce que vous avez écrit ! Sans compter ceux qui vont lire vos scripts si vous travaillez en équipe.

bon, c'est bien joli, mais c'est pas rp tout ça... même si la force compte dans cette bataille, y'a aussi l'agilité...
alors comment on fait ?

Citation :
si for_roger < for_zombie
si agi_roger < agi _zombie
- roger tombe
on peux en effet imbriquer les if et les else les uns dans les autres. Mais souvent on utilise un manière plus courte pour l'écrire :

si (for_roger < for_zombie) && (agi_roger < agi_zombie)

le terme && est un opérateur qui veux dire et.

dans ce cas la traduction est :

si force de roger < force zombie ET agilité de roger < agilité du zombie

il existe un autre operateur souvent écrit comme ceci : ||
qui veux dire ou c'est à dire soit l'un soit l'autre.

par exemple

si (for_roger < for_zombie) || (agi_roger < agi_zombie)
se traduit par
si (for_roger < for_zombie) ou (agi_roger < agi_zombie)

dans ce cas, il suffit que la force de roger ou son agilité soit inferieur a celles du zombie.

Encore un coup de boole, le mathématicien dont je parlait plus haut. On appelle tout àa "l'algèbre de boole", parce que si dans notre exemple c'est simple, imaginez si on doit comparer 10 caractéristiques :

si a > b && c < a || b == f && g != d.... tout ça peut devenir un véritable sac de noeud. Mais si vous avez compris ces histoire de if, else, &&, ||, vous avez toutes les bases pour résoudre un tel problème, le reste n'étant que de la logique pure qui va au dela de la programmation (d'ailleurs, la prog n'est là que pour laisser un ordinateur résoudre des problèmes de tous les jours à notre place).
oui redsun1, on pourrait même faire un topic avec que des exos en complément du cours. Ca plus les conseil de ceux qui maîtrisent déjà la prog et on aura plein de nouveau scripteurs fin prets pour l'arrivée de NwN2

continuation du "cours"

le if est une boucle conditionnelle, mais il en existe d'autres, notamment la boucle for

en voici une en langage C++ (qui s'écrit pareil en C, Java, Php...)

Citation :
for (i = 1; i <= max; i++)
{
mécanismes du programme
}
kézako ??

bon, imaginons que nous avons une rue avec 100 lampadaires. Nous voulons tous les allumer, mais un ordinateur ne fait qu'une seule chose à la fois. Il faut donc les allumer les uns à la suite des autres.

on commence donc par le lampadaire n°1, puis on passe au numéro deux, le trois etc... jusqu'au numéro 100.

et bien c'est une boucle for

on commence donc par écrire for
puis on dit où on commence, ici au numéro 1 : i =1
puis on dit où on va s'arrêter : i <= max; (dans notre cas, max = 100 lampadaire)
et on dit quelle est l'étape suivante : i++ (qui est pareil que i + 1, c'est a dire qu'on les les allumes les uns à la suite des autre. Bref, on ajoute 1 au numéro du lampadaire qu'on veux allumer : d'abord le N°1, puis le N°2 etc)
c'est comme si on écrivait ceci :

j'allume le lampadaire 1
j'allume le lampadaire 2
j'allume le lampadaire 3
j'allume le lampadaire 4
....
jusqu'à 100

avouez que si on devait se taper toutes les lignes on en aurait pour un moment à tout écrire, sans compter que si en suite on veux utiliser notre programme pour une rue dans laquelle il y'a 467 lampadaire, ou une autre avec 37 ?
il faudrait réécrire toutes les lignes a chaque fois. Mais en programmation on écrira simplement :

for(i = 1; i <= 467; i++)
allumer le lampadaire n° i

et

for(i = 1; i <= 37; i++)
allumer le lampadaire n° i

et si on veux en allumer qu'un sur deux ?

on remplace i++ par i + 2 et on obtiens quelque ceci :

for(i = 1; i <= 100; i + 2)
j'allume le lampadaire 1
j'allume le lampadaire 3 ( 1 + 2)
j'allume le lampadaire 5 ( 3 + 2)

et si on ne connais pas le nombre de lampadaire qu'il y'a dans la rue ?

et bien on fait avec une boucle while

while se traduit par tant que, par exemple :

tant qu'il y'a des lampadaires dans la rue, on les allumes !
tant que je gagne, je joue !
ou encore
tant qu'il y'a du riz, il y'a des fous

en fait, while fonctionne un peu comme un if :

while (for_roger > for_zombie)
- roger fait reculer le zombie d'un metre

traduction :

tant que la force de roger est supérieure à celle du zombie, roger le fait reculer d'un metre

ou alors

while (joueur empoisonné == vrai)
- joueur perd 1 pdv

une note très importante sur les boucles while, elles peuvent vous planter le PC de manière complete !
c'est ce qu'on appelle les boucles infinies.
en effet, dans une boucle for on dit où on s'arrête, mais pas dans une boucle while.

imaginer la boucle while suivante :

while( 1 > 0)
{
faire perdre un point de vie a roger
}

traduction

tant que 1 est supérieur a 0 on enlève un pdv a roger

mais 1 est toujours supérieur à 0 ! l'ordinateur va alors enlever un point de vie à roger jusqu'a ce qu'il soit mort, mais il va continuer après, parce que la condition pour que l'ordinateur arrête est que 0 soit supérieur à 1, ce qui n'arrivera jamais !
Bonne idée ce sujet, cependant, je tique particulièrement là-dessus :

Citation :
Publié par Acropole
le if est une boucle conditionnelle
If n'est pas une boucle conditionnelle, il s'agit d'une structure de contrôle de type "alternative", à ne pas confondre avec les structures de type "répétitive / itérative", appelées également communément boucles.

Je précise juste ce point de langage, histoire que les futurs concepteurs en herbe utilisent les mots adéquats.
exact kelem, dsl pour l'erreur

je continu, aprés le while, le do while...

le problème du while est que si la condition de la boucle n'est pas remplie on executera jamais ce qu'elle contient.

Or dans certains cas, il serra nécessaire de fair au moins une fois ce qui est dans la boucle :

Citation :
while ( force de roger > 20)
{
si la force de roger n'est jamais supérieure a 20 on ne passera jamais dans le code du while
}
Citation :
do
faire perdre 1 point de force a roger
while (force de roger > 20)
dans ce deuxième cas, même si la force de roger n'est pas supérieure a 20 il perdra 1 point. Il est a noter que le do while comporte les mêmes risques de boucle infinie que le while

pour finir, je vais parle dune autre "structure de contrôle" le switch/case

une exemple :

Citation :
switch (dieu de roger)
case talos :
- benediction de talos
case zeus
- benediction de zeus
case dark vador
- benediction de dark vador
default
- pas de benediction
cette structure passe en revue plusieurs cas possibles et, en fonction du cas execute un bout de code différent.
dans l'exemple ci dessus le switch(dieu de roger) dit qu'on va vérifier quel est le dieu que vénère roger, puis on passe en revue les dieux du panthéon du jeu (talos, zeus, dark vador...) et on finit par le default qui est l'action à executer si roger ne vénère aucun des dieux de la liste. cette dernière est optionnelle, car si il ne se passe rien dans le cas ou roger vénère un autre dieux le fait de laisser vide est équivalent à ne rien mettre.

il y'a une variante non négligeable qui est le break

par exemple :

Citation :
switch (dieu de roger)
case talos :
- benediction de talos
break
case zeus
- benediction de zeus
break
case dark vador
- benediction de dark vador
break
default
- pas de benediction
j'ai rajouté un break a dans chaque cas, pourquoi ? Parce qu'en fait, contrairement à ce qu'on pourrait croire au premier abord, si on rentre dans un cas on continu en exécutant les cas suivants... c'est à dire que si roger vénère zeus dans le premier switch que j'ai écrit, il bénéficiera des bénédiction de zeus, de dark vador et de tous les dieux qui suivraient dans la liste !
le break permet de sortir du switch.

Quel intérêt ?

prenons cet exemple :

Citation :
switch (dieu de roger)
case talos :
- benediction de talos
break
case zeus
- benediction de zeus
case athena
- benediction d'athena
break

case dark vador
- benediction de dark vador
break
default
- pas de benediction
il n'y a pas de break dans le case de zeus, ce qui veux dire que si roger vénère zeus il bénéficie de la bénédiction de zeus et d'athéna, mais si il vénère athéna il ne bénéficiera pas de la bénédiction de zeus, car on entre dans le switch à partir d'athéna qui se trouve aprés zeus... j'espère avoir été clair.
Les combinaisons sont nombreuse, et quelque peu risquées, d'autant plus qu'on peut imbriquer toutes les boucles que je viens de présenter, par exemple :

Citation :
if ( la nuit tombe == true)
for(i = 1; i < 100; i++)
allumer les lampadaires dans la rue
dans cet exemple on teste si la nuit tombe et si oui on allume tous les lampadaires de la rue qui sont au nombre de 100.
Vous pouvez commencer à entrevoir ce que peut être un programme de 100 000 lignes de code...

un dernier point sur le break : il peut être utilisé dans n'importe quelle boucle. Par exemple dans un while :

Citation :
while (il fait jour == true)
{
faire quelque chose

if( il y'a une éclipse == true)
break
}

dans ce cas on fait quelque chose tant qu'il fait jour, sauf si il y'a un éclipse... disont que cet exemple peut survenir si on fait quelque chose sur un vampire
voila, j'ai fait le tour des structure de contrôle et des boucles, on va pouvoir passer aux fonctions.
ha oui tiens, j'ai déjà expliqué les fonctions j'avais oublié.

où mettre les scripts ?

c'est une question de nwnscripteur ça

le but du post n'était pas d'expliquer les scripts pour nwn mais les bases de la prog, c'est a dire les briques élémentaires qui se retrouvent quasiment partout.

mais je vais te répondre quand même.

donc où met on les scripts dans nwn ? ben... une peu partout
en fait ceux qui on conçus le langage de nwn on décidé de créer des emplacement précis que l'on peut trouver dans les placeables, les zones, le module... tout dépend de ce que tu veux faire.
par exemple si tu veux faire une action qui se déclenche lorsqu'on ouvre un placeable il faut ouvrir la fenêtre d'édition du placeable et aller dans l'onglet script. Tu y trouvera l'emplacement onOpen.

y'a pleins d'endroit comme ça répartis dans nwn, mais il y'en a un qui est très utilisé : celui de "l'action conséquente" dans les dialogue. Il est utilisé parce que, souvent, malheureusement, nwn ne permet pas de programmer ce que l'on veux. On détourne alors les dialogue en lançant un dialogue du joueur avec lui même et on affiche une liste d'action dans le dialogue.
On peux aussi le faire avec les actions des objets (genre baguette magique) en donnant a l'objet la possibilité de lancer un sort de manière illimité (pouvoir unique, sur soi ou pouvoir unique, de mémoire) Le joueur n'a plus qu'a utiliser l'objet pour accomplir l'action voulue.
Citation :
Publié par Acropole
un dernier point sur le break : il peut être utilisé dans n'importe quelle boucle. Par exemple dans un while :



voila, j'ai fait le tour des structure de contrôle et des boucles, on va pouvoir passer aux fonctions.
A noter que le break, d'une maniere general fait sortir de l'endroit ou on est en nous refaisant remonter d'un niveau de structure de controle, qui est en general visible par des { }

Il faut aussi expliquer le cas du continue (qui a priori peut rendre le meme effet que le break sur un switch mais que j'avoue n'avoir jamais essaye).
Il nous fait stopper l'execution de ce qu'il y a au dessous en terme de code pour nous remettre au debut de la structure de controle et rerentrer dans la boucle.
Code PHP:

while (<= 10)
{
      if (
toto == 'titi')
      {
          
i++;
          continue;
      }
      
toto 'bonjour';
      ...

par exemple, si on rentre dans le premier test, on incremente i et on sort c-a-d qu'on ne fait pas le reste du code de la boucle, et on repart au debut de la boucle.

Une notion aussi tres importante a expliquer en terme de langage c'est la portee des variables... ;-)
Citation :
Publié par Kelem Khâl La'Ri
Bonne idée ce sujet, cependant, je tique particulièrement là-dessus :

If n'est pas une boucle conditionnelle, il s'agit d'une structure de contrôle de type "alternative"... Je précise juste ce point de langage, histoire que les futurs concepteurs en herbe utilisent les mots adéquats.
hehe comme il snobe le Kelem Khâl La'Ri !!! au passage, pour un IF, les gueux de la programmation utilisent aussi le terme bien plus simple "d'opérateur conditionnel".


J'aime bien ton post d'Acropole... mais heu pourquoi toujours Roger ?! tout ceci fonctionnerait t'il aussi avec ma prêtresse Monique ?
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés