Donner des ordres à la main d'oeuvre suppose de construire un système permettant de désigner l'ouvrier, de décrire l'action à réaliser (“- va couper du bois la bas”) et de la réaliser. Une solution consiste à créer un couple de fonctions pour chaque catégorie d'ouvrier :
bucheron_demander(entree: bucheron, entree: demande, description) bucheron_action(entree: bucheron)
La fonction demander permet au bucheron de se rappeller l'action à réaliser lors du/des prochains intervalles de temps. La fonction action réalise effectivement la demande, elle est appellée au début de chaque intervalle de temps :
declaration bucheron collecte // quantite de ressource exploitée file d'attente de demandes et d'objets etat // demande à réaliser objet // objet de la demande à réaliser fin // bucheron_demander(entree: bucheron, entree: demande, objet) ajouter la demande et l'objet à la file d'attente fin // bucheron_action(entree: bucheron) si etat=stop recuperer une demande et son objet dans la file d'attente etat= demande objet= objet de la demande fin si // réaliser la demande si etat=exploiter bucheron_exploiter(bucheron, objet) sinon si etat=deplacer bucheron_deplacer(buceron, objet) etat= stop fin si fin // exploiter le bois encore disponible bucheron_exploiter(entree: bucheron, entree: arbre)
si rendement du bucheron > quantite de bois de l'arbre collecte= quantite de bois de l'arbre quantite de bois de l'arbre= 0 sinon collecte= rendement du bucheron enlever la quantite de bois exploitée à l'arbre
// l'action est terminee, permettre de lire la demande suivante
etat= stop
fin
// deplacement == etat non productif
bucheron_deplacer(entree: bucheron, entree: destination)
// eventuellement ne rien faire ou modifier l'affichage
// l'action est terminee, permettre de lire la demande suivante
etat= stop
fin
Si chaque catégorie d'ouvrier est décrite de cette
façon, il est très simple de parcourir l'ensemble des
ouvriers et d'éxécuter leur fonction action au début
de chaque intervalle de temps. Cette solution suppose que les actions sont réalisées en un seul
intervalle de temps. Il est également envisageable de rajouter
des compteurs afin de déterminer la fin réelle d'une
action longue (il faudra probablement transmettre le temps actuel à
la fonction action).
Une question parmi d'autres : est-ce que les
ouvriers sont les seuls éléments à
"posséder" une fonction action ?
Par exemple, si vous souhaiter comptabiliser le
bois exploité lorsque le bucheron revient à la cabane, il
serait sans doute plus simple d'ajouter un comportement à la
cabane qui se chargera de collecter les ressources exploitées
par le bucheron lorsque celui-ci revient et de lui demander de
retourner travailler.
La description des coûts (de création et d'entretien) et du
rendement d'un ouvrier peut se faire de manière générale
pour chaque type de ressource pour chaque catégorie d'ouvrier. De la même manière, on peut décrire
les propriétés communes à tous les bucherons
dans une structure catégorie_bucheron et un bucheron
particulier (ses ressources collectées, sa file d'attente de
demandes, etc) dans une structure bucheron. De même pour les
catégories de ressources (bois, nourriture, etc.).
La boucle principale de gestion, en plus de faire agir les ouvriers, devra également réaliser le bilan de l'économie et accepter ou refuser les demandes du joueur.
comptabiliser les ressources produites (nourriture, etc.) comptabiliser les ressources exploitées par chaque ouvrier remettre à zéro les ressources exploitées par les ouvriers comptabiliser les couts d'entretien
payer les depenses pour l'intervalle de temps qui commence
appeler action pour tous les ouvriers (pour toutes les catégories)