chronobio


Namechronobio JSON
Version 0.0.1 PyPI version JSON
download
home_pageNone
SummaryChronobio programming game
upload_time2024-04-05 08:17:41
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseBSD-3-Clause
keywords chronobio game
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Chronobio

## But du jeu

- Dominer le monde ! Devenir le meilleur producteur de soupe bio, en cultivant des légumes, en fabriquant des soupes, en les vendant.
- Cultivez plusieurs sortes de légumes : pomme de terre, poireau…
- Employez des ouvriers.
- Négociez avec la banque.
- Subissez l’économie de marché.
- Attention aux aléas climatiques.
- Ne faites pas banqueroute.

![screenshot](chronobio.png)

Le record du monde a été établi par l’équipe des Aigrisculteurs, avec un score de 8 426 796.

![record](world_record.jpeg)

## Communication

### Échanges

À chaque début de tour de jeu (un tour de jeu équivaut à un jour), un dictionnaire en JSON avec les informations sur le jeu et toutes les fermes en exploitation est envoyé.

Chaque ferme doit envoyer au moins une commande (dont la syntaxe est détaillée ensuite) par jour de jeu.

### Début du jeu

Une exploitation démarre sans culture, et avec un apport financier initial de 100 000 euros. Le jeu dure 5 ans (en temps simulé).

### Chaque jour

L’exploitation reçoit les aides pour les exploitations biologiques : 5  euros par champ cultivé accompagnés de 30 euros pour l’exploitation.

Attention, il est possible de mécaniser l’exploitation agricole, mais chaque tracteur (y compris ceux des autres joueurs) émet des gaz à effets de serre. Plus la quantité de gaz émise depuis le début du jeu est importante, plus la probabilité qu’un évènement climatique se déclenche augmente. Nous risquons :

- canicules : les champs doivent être arrosés 2 fois plus que prévu initialement,
- grêle, ou gel : la culture des champs est détruite,
- inondations : la production de soupe est arrêtée 20 jours. Si la production est déjà arrêtée, les 20 jours s’ajoutent au temps d’arrêt actuel,
- incendies : la culture des champs est détruite, la production de soupe est arrêtée 40 jours. Si la production est déjà arrêtée, les 40 jours s’ajoutent au temps d’arrêt actuel.

Chaque champ ou usine a un risque sur deux d’être touché par un événement climatique lorsqu’il se produit.

### Déplacement

Lorsqu’un employé se déplace à pied, il peut se déplacer d’un lieu au lieu adjacent. S’il veut aller plus loin, il mettra un jour supplémentaire à chaque lieu traversé.

Lorsqu’un employé se déplace en tracteur, il peut se déplacer d’un lieu à un lieu adjacent, le lieu suivant ou encore le lieu d’après. S’il veut aller plus loin, il mettra un jour supplémentaire pour chaque trois lieus traversés.

Pour monter dans un tracteur, un employé doit se déplacer jusqu’au tracteur. S’il est déjà sur le même lieu, il peut directement monter dans le tracteur.

La carte d’une exploitation est la suivante :

- La ferme où sont livrés les tracteurs et où les employés sont embauchés
- Le champ 1
- Le champ 2
- Le champ 3
- Le champ 4
- Le champ 5
- L’usine à soupe

### Actions possibles

Il faut envoyer une ligne par action.
Chaque employé peut réaliser au maximum une action par jour.

Les champs entre accolades sont à remplacer par leurs valeurs.

- `{GÉRANT}` : numéro du gérant (0)
- `{OUVRIER}` : numéro de l’ouvrier (supérieur ou égal à 1)
- `{LÉGUME}` : un légume parmi `PATATE`, `POIREAU`, `TOMATE`, `OIGNON`, `COURGETTE`
- `{CHAMP}` : numéro du champ (de 1 à 5)
- `{SOMME}` : un montant entier en euros
- `{TRACTEUR}` : numéro du tracteur (supérieur ou égal à 1)

#### Acheter un champ

`{GÉRANT} ACHETER_CHAMP`

Un nouveau champ est acheté, 10 000 euros est enlevé du solde. Le premier champ qui sera acheté sera le champ 1. Si le champ 1 est déjà acheté, la tentative d’achat se portera sur le prochain champ disponible, dans l’ordre des numéros de champs.

#### Semer

`{OUVRIER} SEMER {LÉGUME} {CHAMP}`

Semer sur un champ préalablement acheté remplace la culture existante sur le champ.

#### Arroser

`{OUVRIER} ARROSER {CHAMP}`

Il faut normalement arroser au moins 10 fois un champ avant qu’il soit récoltable. Mais attention aux aléas climatiques.

#### Vendre des légumes

`{GÉRANT} VENDRE {CHAMP}`

Les légumes du champ ne peuvent être vendus que si, au début de la journée, le champ ne nécessite plus d’arrosage.

Les légumes sont vendus après récolte, la récolte dure deux jours : le gérant ne pourra pas faire d’action aux deux prochains jours.

Les légumes sont vendus au prix du marché, c’est-à-dire que la récolte est vendue pour la somme de 3 000 euros - 50 fois le nombre d’autres champs cultivant au moment de la vente la même espèce de légume en comptant toutes les fermes.

Un champ peut être impacté par un aléa climatique pendant les deux jours que prend la récolte. La vente sera alors ignorée/annulée.

#### Acheter un tracteur

`{GÉRANT} ACHETER_TRACTEUR`

Un tracteur coute 30 000 euros. Un tracteur émet 100 kg eqCO₂ par mois.

On ne peut pas acheter plus de 50 tracteurs dans une partie.

#### Stocker des légumes

`{OUVRIER} STOCKER {CHAMP} {TRACTEUR}`

Les légumes du champ ne peuvent être stockés que si, au début de la journée, le champ ne nécessite plus d’arrosage.

Les légumes du champ récoltable sont stockés dans l’usine de fabrication de soupe.

Après le transport, le stock de l’usine est augmenté de 2000 pour l’espèce de légume du champ.

#### Fabriquer des soupes et les vendre

`{OUVRIER} CUISINER`

Un ouvrier fabrique chaque jour 100 soupes si les ingrédients sont disponibles. Pour chaque soupe, il piochera dans les stocks de l’usine. Il essaiera de mettre le plus grand nombre de légumes différents dans une soupe.

La soupe est vendue :

- 1 euros la soupe de 1 légume
- 2 euros la soupe de 2 légumes
- 4 euros la soupe de 3 légumes
- 6 euros la soupe de 4 légumes
- 8 euros la soupe de 5 légumes

Les soupes sont livrées automatiquement au magasin qui s’occupe de tout (transport, vente aux clients finaux).

#### Employer un ouvrier

`{GÉRANT} EMPLOYER`

Le gérant emploie en CDI un ouvrier supplémentaire. Un employé est payé 1 000 euros le premier mois (tous les mois font 30 jours !). Chaque mois, il est augmenté de 1 % (l’augmentation est arrondie à l’entier supérieur). L’employé est payé le premier jour du mois, pour le travail du mois précédent (salaire complet même si le salarié n’a pas travaillé un mois complet).

On ne peut pas employer plus de 300 personnes dans une partie.

#### Licencier un ouvrier

`{GÉRANT} LICENCIER {OUVRIER}`

Le gérant se sépare d’un ouvrier (c’est un plan de sauvegarde de l’emploi…). Le gérant doit payer une indemnité de licenciement égale au salaire du prochain mois de l’ouvrier. Cela vient en surplus du salaire normal au pro rata du temps travaillé dans le mois.

#### Emprunter

`{GÉRANT} EMPRUNTER {SOMME}`

Le gérant emprunte une somme à la banque. Un emprunt dure 2 ans. La somme à rembourser est la somme empruntée multipliée par 1,10 soit environ 5 % par an. Cette somme est remboursée à parts égales chaque mois de l’emprunt.

La somme empruntée doit être positive et inférieure à 1 000 000 000.

Au maximum 10 emprunts peuvent être faits lors d’une partie.

## Conditions de victoire ou défaite

La victoire se décide à la fin des 5 ans de simulation.

- Une action invalide entraîne le blocage du joueur : il ne peut plus faire d’actions jusqu’à la fin du jeu.
- Un achat sans l’argent disponible entraîne le blocage du joueur.
- Un joueur ne pouvant pas payer ses dépenses est bloqué.
- Le joueur ayant le plus d’argent disponible à la fin (coût total des emprunts déduits) gagne.

## Comment jouer

- Créez un dépôt privé, en me donnant les accès (au moins en lecture, https://github.com/vpoulailleau)
- Créez un client pour vous connecter au serveur de jeu
  - En vous inspirant de l’exemple fourni
  - Votre projet devra pouvoir être lancé en ligne de commande (avec `argparse`)
    - `-a` : adresse IP du serveur
    - `-p` : port du serveur
    - Commencez par faire un code le plus basique possible qui se connecte au serveur (genre il achète un champ, puis plus aucune action), puis faites les étapes ci-dessous, et enfin améliorez votre code.
  - Votre projet devra contenir au moins une documentation minimaliste pour permettre à l’utilisateur d’installer et d’utiliser votre logiciel
- Mettez en place de l’intégration continue
  - Tests (`pytest`) automatiques (`GitHub actions`) avec mesure de couverture de test (qui doit avoisiner 100 %)
  - Qualimétrie (avec `flake8` et des plugins, ou `ruff`) pour faire un logiciel de bon niveau de qualité
  - Vérification des annotations de type (avec `mypy`)
  - Avec les mesures de couverture, qualimétrie et annotations de type, faites en sorte de refuser une pull request qui abaisserait le niveau de qualité de votre logiciel
- Éventuellement, mettez en place des hooks de pré-commit (https://pre-commit.com/)
- Codez votre stratégie
  - Partez d’abord sur une stratégie simpliste : cultivez des légumes sur un champ et vendez-les
  - Assurez-vous, tout le long du projet, de maintenir un niveau élevé de qualité (couverture de test proche de 100 %, rapport de linter sans erreur, annotations de type vérifiées)
  - Améliorez votre stratégie : utilisez tous les champs, optimisez votre production de légumes, utilisez des tracteurs, fabriquez de la soupe

## Auto-évaluation

Voici un barème pour évaluer le projet :

| Critère                                                                       | Points |
| ----------------------------------------------------------------------------- | ------ |
| Projet lançable en ligne de commande                                          | 0,5    |
| Documentation (installation des dépendances, lancement)                       | 1      |
| Acheter un champ                                                              | 0,5    |
| Acheter un tracteur                                                           | 0,5    |
| Employer                                                                      | 0,5    |
| Semer                                                                         | 1      |
| Arroser                                                                       | 1      |
| Vendre des légumes                                                            | 1      |
| Stocker                                                                       | 1,5    |
| Cuisiner                                                                      | 1      |
| Licencier                                                                     | 1      |
| Emprunter                                                                     | 0,5    |
| Écriture de tests (`pytest`)                                                  | 2      |
| Mesure de la couverture de test                                               | 1      |
| Pourcentage de couverture de test                                             | 2      |
| Qualimétrie (`flake8` et plugins)                                             | 1      |
| GitHub action                                                                 | 1      |
| Refus de pull request / push si baisse de couverture ou qualité               | 1      |
| Classement compétition                                                        | 2      |
| Bonus (pré-commit, annotations de type, vérification des annotations de type) | 3      |

## Commandes

### Installation

```shell
python3.11 -m venv venv
. venv/bin/activate
# pour jouer
pip install --upgrade chronobio
# pour développer
pip install --upgrade chronobio[dev]
```

### Lancer le jeu

```shell
# Dans un environnement virtuel activé

# choisir un port non utilisé
PORT=12345
# lancer le serveur
python -m chronobio.game.server -p $PORT &
# lancer le viewer
python -m chronobio.viewer -p $PORT &
# lancer un joueur
python -m mon_code -p $PORT
```

### Terminer tous les programmes lancés

```shell
# Pour Linux et Mac, dans un environnement virtuel activé
python -m chronobio.killall
```

### Publier

```shell
python -m build
python -m twine upload dist/*
```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "chronobio",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": null,
    "keywords": "chronobio, game",
    "author": null,
    "author_email": "Vincent Poulailleau <vpoulailleau@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/cd/96/5f1080b0daf5f60384ed0548a7d3d3bacb9d22b615dadd5ace12ef9ceae3/chronobio-0.0.1.tar.gz",
    "platform": null,
    "description": "# Chronobio\n\n## But du jeu\n\n- Dominer le monde\u00a0! Devenir le meilleur producteur de soupe bio, en cultivant des l\u00e9gumes, en fabriquant des soupes, en les vendant.\n- Cultivez plusieurs sortes de l\u00e9gumes\u00a0: pomme de terre, poireau\u2026\n- Employez des ouvriers.\n- N\u00e9gociez avec la banque.\n- Subissez l\u2019\u00e9conomie de march\u00e9.\n- Attention aux al\u00e9as climatiques.\n- Ne faites pas banqueroute.\n\n![screenshot](chronobio.png)\n\nLe record du monde a \u00e9t\u00e9 \u00e9tabli par l\u2019\u00e9quipe des Aigrisculteurs, avec un score de 8\u00a0426\u00a0796.\n\n![record](world_record.jpeg)\n\n## Communication\n\n### \u00c9changes\n\n\u00c0 chaque d\u00e9but de tour de jeu (un tour de jeu \u00e9quivaut \u00e0 un jour), un dictionnaire en JSON avec les informations sur le jeu et toutes les fermes en exploitation est envoy\u00e9.\n\nChaque ferme doit envoyer au moins une commande (dont la syntaxe est d\u00e9taill\u00e9e ensuite) par jour de jeu.\n\n### D\u00e9but du jeu\n\nUne exploitation d\u00e9marre sans culture, et avec un apport financier initial de 100\u00a0000\u00a0euros. Le jeu dure 5\u00a0ans (en temps simul\u00e9).\n\n### Chaque jour\n\nL\u2019exploitation re\u00e7oit les aides pour les exploitations biologiques\u00a0: 5\u00a0 euros par champ cultiv\u00e9 accompagn\u00e9s de 30\u00a0euros pour l\u2019exploitation.\n\nAttention, il est possible de m\u00e9caniser l\u2019exploitation agricole, mais chaque tracteur (y compris ceux des autres joueurs) \u00e9met des gaz \u00e0 effets de serre. Plus la quantit\u00e9 de gaz \u00e9mise depuis le d\u00e9but du jeu est importante, plus la probabilit\u00e9 qu\u2019un \u00e9v\u00e8nement climatique se d\u00e9clenche augmente. Nous risquons\u00a0:\n\n- canicules\u00a0: les champs doivent \u00eatre arros\u00e9s 2 fois plus que pr\u00e9vu initialement,\n- gr\u00eale, ou gel\u00a0: la culture des champs est d\u00e9truite,\n- inondations\u00a0: la production de soupe est arr\u00eat\u00e9e 20\u00a0jours. Si la production est d\u00e9j\u00e0 arr\u00eat\u00e9e, les 20\u00a0jours s\u2019ajoutent au temps d\u2019arr\u00eat actuel,\n- incendies\u00a0: la culture des champs est d\u00e9truite, la production de soupe est arr\u00eat\u00e9e 40\u00a0jours. Si la production est d\u00e9j\u00e0 arr\u00eat\u00e9e, les 40\u00a0jours s\u2019ajoutent au temps d\u2019arr\u00eat actuel.\n\nChaque champ ou usine a un risque sur deux d\u2019\u00eatre touch\u00e9 par un \u00e9v\u00e9nement climatique lorsqu\u2019il se produit.\n\n### D\u00e9placement\n\nLorsqu\u2019un employ\u00e9 se d\u00e9place \u00e0 pied, il peut se d\u00e9placer d\u2019un lieu au lieu adjacent. S\u2019il veut aller plus loin, il mettra un jour suppl\u00e9mentaire \u00e0 chaque lieu travers\u00e9.\n\nLorsqu\u2019un employ\u00e9 se d\u00e9place en tracteur, il peut se d\u00e9placer d\u2019un lieu \u00e0 un lieu adjacent, le lieu suivant ou encore le lieu d\u2019apr\u00e8s. S\u2019il veut aller plus loin, il mettra un jour suppl\u00e9mentaire pour chaque trois lieus travers\u00e9s.\n\nPour monter dans un tracteur, un employ\u00e9 doit se d\u00e9placer jusqu\u2019au tracteur. S\u2019il est d\u00e9j\u00e0 sur le m\u00eame lieu, il peut directement monter dans le tracteur.\n\nLa carte d\u2019une exploitation est la suivante\u00a0:\n\n- La ferme o\u00f9 sont livr\u00e9s les tracteurs et o\u00f9 les employ\u00e9s sont embauch\u00e9s\n- Le champ 1\n- Le champ 2\n- Le champ 3\n- Le champ 4\n- Le champ 5\n- L\u2019usine \u00e0 soupe\n\n### Actions possibles\n\nIl faut envoyer une ligne par action.\nChaque employ\u00e9 peut r\u00e9aliser au maximum une action par jour.\n\nLes champs entre accolades sont \u00e0 remplacer par leurs valeurs.\n\n- `{G\u00c9RANT}`\u00a0: num\u00e9ro du g\u00e9rant (0)\n- `{OUVRIER}`\u00a0: num\u00e9ro de l\u2019ouvrier (sup\u00e9rieur ou \u00e9gal \u00e0 1)\n- `{L\u00c9GUME}`\u00a0: un l\u00e9gume parmi `PATATE`, `POIREAU`, `TOMATE`, `OIGNON`, `COURGETTE`\n- `{CHAMP}`\u00a0: num\u00e9ro du champ (de 1 \u00e0 5)\n- `{SOMME}`\u00a0: un montant entier en euros\n- `{TRACTEUR}`\u00a0: num\u00e9ro du tracteur (sup\u00e9rieur ou \u00e9gal \u00e0 1)\n\n#### Acheter un champ\n\n`{G\u00c9RANT} ACHETER_CHAMP`\n\nUn nouveau champ est achet\u00e9, 10\u00a0000\u00a0euros est enlev\u00e9 du solde. Le premier champ qui sera achet\u00e9 sera le champ 1. Si le champ 1 est d\u00e9j\u00e0 achet\u00e9, la tentative d\u2019achat se portera sur le prochain champ disponible, dans l\u2019ordre des num\u00e9ros de champs.\n\n#### Semer\n\n`{OUVRIER} SEMER {L\u00c9GUME} {CHAMP}`\n\nSemer sur un champ pr\u00e9alablement achet\u00e9 remplace la culture existante sur le champ.\n\n#### Arroser\n\n`{OUVRIER} ARROSER {CHAMP}`\n\nIl faut normalement arroser au moins 10 fois un champ avant qu\u2019il soit r\u00e9coltable. Mais attention aux al\u00e9as climatiques.\n\n#### Vendre des l\u00e9gumes\n\n`{G\u00c9RANT} VENDRE {CHAMP}`\n\nLes l\u00e9gumes du champ ne peuvent \u00eatre vendus que si, au d\u00e9but de la journ\u00e9e, le champ ne n\u00e9cessite plus d\u2019arrosage.\n\nLes l\u00e9gumes sont vendus apr\u00e8s r\u00e9colte, la r\u00e9colte dure deux jours\u00a0: le g\u00e9rant ne pourra pas faire d\u2019action aux deux prochains jours.\n\nLes l\u00e9gumes sont vendus au prix du march\u00e9, c\u2019est-\u00e0-dire que la r\u00e9colte est vendue pour la somme de 3\u00a0000\u00a0euros - 50 fois le nombre d\u2019autres champs cultivant au moment de la vente la m\u00eame esp\u00e8ce de l\u00e9gume en comptant toutes les fermes.\n\nUn champ peut \u00eatre impact\u00e9 par un al\u00e9a climatique pendant les deux jours que prend la r\u00e9colte. La vente sera alors ignor\u00e9e/annul\u00e9e.\n\n#### Acheter un tracteur\n\n`{G\u00c9RANT} ACHETER_TRACTEUR`\n\nUn tracteur coute 30\u00a0000\u00a0euros. Un tracteur \u00e9met 100\u00a0kg\u00a0eqCO\u2082 par mois.\n\nOn ne peut pas acheter plus de 50\u00a0tracteurs dans une partie.\n\n#### Stocker des l\u00e9gumes\n\n`{OUVRIER} STOCKER {CHAMP} {TRACTEUR}`\n\nLes l\u00e9gumes du champ ne peuvent \u00eatre stock\u00e9s que si, au d\u00e9but de la journ\u00e9e, le champ ne n\u00e9cessite plus d\u2019arrosage.\n\nLes l\u00e9gumes du champ r\u00e9coltable sont stock\u00e9s dans l\u2019usine de fabrication de soupe.\n\nApr\u00e8s le transport, le stock de l\u2019usine est augment\u00e9 de 2000 pour l\u2019esp\u00e8ce de l\u00e9gume du champ.\n\n#### Fabriquer des soupes et les vendre\n\n`{OUVRIER} CUISINER`\n\nUn ouvrier fabrique chaque jour 100 soupes si les ingr\u00e9dients sont disponibles. Pour chaque soupe, il piochera dans les stocks de l\u2019usine. Il essaiera de mettre le plus grand nombre de l\u00e9gumes diff\u00e9rents dans une soupe.\n\nLa soupe est vendue\u00a0:\n\n- 1\u00a0euros la soupe de 1 l\u00e9gume\n- 2\u00a0euros la soupe de 2 l\u00e9gumes\n- 4\u00a0euros la soupe de 3 l\u00e9gumes\n- 6\u00a0euros la soupe de 4 l\u00e9gumes\n- 8\u00a0euros la soupe de 5 l\u00e9gumes\n\nLes soupes sont livr\u00e9es automatiquement au magasin qui s\u2019occupe de tout (transport, vente aux clients finaux).\n\n#### Employer un ouvrier\n\n`{G\u00c9RANT} EMPLOYER`\n\nLe g\u00e9rant emploie en CDI un ouvrier suppl\u00e9mentaire. Un employ\u00e9 est pay\u00e9 1\u00a0000\u00a0euros le premier mois (tous les mois font 30\u00a0jours\u00a0!). Chaque mois, il est augment\u00e9 de 1\u00a0% (l\u2019augmentation est arrondie \u00e0 l\u2019entier sup\u00e9rieur). L\u2019employ\u00e9 est pay\u00e9 le premier jour du mois, pour le travail du mois pr\u00e9c\u00e9dent (salaire complet m\u00eame si le salari\u00e9 n\u2019a pas travaill\u00e9 un mois complet).\n\nOn ne peut pas employer plus de 300\u00a0personnes dans une partie.\n\n#### Licencier un ouvrier\n\n`{G\u00c9RANT} LICENCIER {OUVRIER}`\n\nLe g\u00e9rant se s\u00e9pare d\u2019un ouvrier (c\u2019est un plan de sauvegarde de l\u2019emploi\u2026). Le g\u00e9rant doit payer une indemnit\u00e9 de licenciement \u00e9gale au salaire du prochain mois de l\u2019ouvrier. Cela vient en surplus du salaire normal au pro rata du temps travaill\u00e9 dans le mois.\n\n#### Emprunter\n\n`{G\u00c9RANT} EMPRUNTER {SOMME}`\n\nLe g\u00e9rant emprunte une somme \u00e0 la banque. Un emprunt dure 2\u00a0ans. La somme \u00e0 rembourser est la somme emprunt\u00e9e multipli\u00e9e par 1,10 soit environ 5\u00a0% par an. Cette somme est rembours\u00e9e \u00e0 parts \u00e9gales chaque mois de l\u2019emprunt.\n\nLa somme emprunt\u00e9e doit \u00eatre positive et inf\u00e9rieure \u00e0 1\u00a0000\u00a0000\u00a0000.\n\nAu maximum 10 emprunts peuvent \u00eatre faits lors d\u2019une partie.\n\n## Conditions de victoire ou d\u00e9faite\n\nLa victoire se d\u00e9cide \u00e0 la fin des 5\u00a0ans de simulation.\n\n- Une action invalide entra\u00eene le blocage du joueur\u00a0: il ne peut plus faire d\u2019actions jusqu\u2019\u00e0 la fin du jeu.\n- Un achat sans l\u2019argent disponible entra\u00eene le blocage du joueur.\n- Un joueur ne pouvant pas payer ses d\u00e9penses est bloqu\u00e9.\n- Le joueur ayant le plus d\u2019argent disponible \u00e0 la fin (co\u00fbt total des emprunts d\u00e9duits) gagne.\n\n## Comment jouer\n\n- Cr\u00e9ez un d\u00e9p\u00f4t priv\u00e9, en me donnant les acc\u00e8s (au moins en lecture, https://github.com/vpoulailleau)\n- Cr\u00e9ez un client pour vous connecter au serveur de jeu\n  - En vous inspirant de l\u2019exemple fourni\n  - Votre projet devra pouvoir \u00eatre lanc\u00e9 en ligne de commande (avec `argparse`)\n    - `-a`\u00a0: adresse IP du serveur\n    - `-p`\u00a0: port du serveur\n    - Commencez par faire un code le plus basique possible qui se connecte au serveur (genre il ach\u00e8te un champ, puis plus aucune action), puis faites les \u00e9tapes ci-dessous, et enfin am\u00e9liorez votre code.\n  - Votre projet devra contenir au moins une documentation minimaliste pour permettre \u00e0 l\u2019utilisateur d\u2019installer et d\u2019utiliser votre logiciel\n- Mettez en place de l\u2019int\u00e9gration continue\n  - Tests (`pytest`) automatiques (`GitHub actions`) avec mesure de couverture de test (qui doit avoisiner 100\u00a0%)\n  - Qualim\u00e9trie (avec `flake8` et des plugins, ou `ruff`) pour faire un logiciel de bon niveau de qualit\u00e9\n  - V\u00e9rification des annotations de type (avec `mypy`)\n  - Avec les mesures de couverture, qualim\u00e9trie et annotations de type, faites en sorte de refuser une pull request qui abaisserait le niveau de qualit\u00e9 de votre logiciel\n- \u00c9ventuellement, mettez en place des hooks de pr\u00e9-commit (https://pre-commit.com/)\n- Codez votre strat\u00e9gie\n  - Partez d\u2019abord sur une strat\u00e9gie simpliste\u00a0: cultivez des l\u00e9gumes sur un champ et vendez-les\n  - Assurez-vous, tout le long du projet, de maintenir un niveau \u00e9lev\u00e9 de qualit\u00e9 (couverture de test proche de 100\u00a0%, rapport de linter sans erreur, annotations de type v\u00e9rifi\u00e9es)\n  - Am\u00e9liorez votre strat\u00e9gie\u00a0: utilisez tous les champs, optimisez votre production de l\u00e9gumes, utilisez des tracteurs, fabriquez de la soupe\n\n## Auto-\u00e9valuation\n\nVoici un bar\u00e8me pour \u00e9valuer le projet\u00a0:\n\n| Crit\u00e8re                                                                       | Points |\n| ----------------------------------------------------------------------------- | ------ |\n| Projet lan\u00e7able en ligne de commande                                          | 0,5    |\n| Documentation (installation des d\u00e9pendances, lancement)                       | 1      |\n| Acheter un champ                                                              | 0,5    |\n| Acheter un tracteur                                                           | 0,5    |\n| Employer                                                                      | 0,5    |\n| Semer                                                                         | 1      |\n| Arroser                                                                       | 1      |\n| Vendre des l\u00e9gumes                                                            | 1      |\n| Stocker                                                                       | 1,5    |\n| Cuisiner                                                                      | 1      |\n| Licencier                                                                     | 1      |\n| Emprunter                                                                     | 0,5    |\n| \u00c9criture de tests (`pytest`)                                                  | 2      |\n| Mesure de la couverture de test                                               | 1      |\n| Pourcentage de couverture de test                                             | 2      |\n| Qualim\u00e9trie (`flake8` et plugins)                                             | 1      |\n| GitHub action                                                                 | 1      |\n| Refus de pull request / push si baisse de couverture ou qualit\u00e9               | 1      |\n| Classement comp\u00e9tition                                                        | 2      |\n| Bonus (pr\u00e9-commit, annotations de type, v\u00e9rification des annotations de type) | 3      |\n\n## Commandes\n\n### Installation\n\n```shell\npython3.11 -m venv venv\n. venv/bin/activate\n# pour jouer\npip install --upgrade chronobio\n# pour d\u00e9velopper\npip install --upgrade chronobio[dev]\n```\n\n### Lancer le jeu\n\n```shell\n# Dans un environnement virtuel activ\u00e9\n\n# choisir un port non utilis\u00e9\nPORT=12345\n# lancer le serveur\npython -m chronobio.game.server -p $PORT &\n# lancer le viewer\npython -m chronobio.viewer -p $PORT &\n# lancer un joueur\npython -m mon_code -p $PORT\n```\n\n### Terminer tous les programmes lanc\u00e9s\n\n```shell\n# Pour Linux et Mac, dans un environnement virtuel activ\u00e9\npython -m chronobio.killall\n```\n\n### Publier\n\n```shell\npython -m build\npython -m twine upload dist/*\n```\n",
    "bugtrack_url": null,
    "license": "BSD-3-Clause",
    "summary": "Chronobio programming game",
    "version": "0.0.1",
    "project_urls": {
        "Documentation": "https://github.com/vpoulailleau/chronobio/README.md",
        "Repository": "https://github.com/vpoulailleau/chronobio",
        "Source code": "https://github.com/vpoulailleau/chronobio"
    },
    "split_keywords": [
        "chronobio",
        " game"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "c95f8a3359410cf58d98e724791a7de2b04d8569ecd95dc53ddd2937fd840b47",
                "md5": "063396f851e3909264b3c5b7c349a25e",
                "sha256": "6c74b8a1ad75e466b10aee6bb3d1189e4614c4b3269aa44266d8d5dc7670d2fe"
            },
            "downloads": -1,
            "filename": "chronobio-0.0.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "063396f851e3909264b3c5b7c349a25e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 1189106,
            "upload_time": "2024-04-05T08:17:37",
            "upload_time_iso_8601": "2024-04-05T08:17:37.806995Z",
            "url": "https://files.pythonhosted.org/packages/c9/5f/8a3359410cf58d98e724791a7de2b04d8569ecd95dc53ddd2937fd840b47/chronobio-0.0.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "cd965f1080b0daf5f60384ed0548a7d3d3bacb9d22b615dadd5ace12ef9ceae3",
                "md5": "9c255d52e18390cf9a5a02a1b987b459",
                "sha256": "ca7c146b2557616cca8c1d43582242522aa2b25d042210bcdf8d0e30651c69a0"
            },
            "downloads": -1,
            "filename": "chronobio-0.0.1.tar.gz",
            "has_sig": false,
            "md5_digest": "9c255d52e18390cf9a5a02a1b987b459",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 2685711,
            "upload_time": "2024-04-05T08:17:41",
            "upload_time_iso_8601": "2024-04-05T08:17:41.339908Z",
            "url": "https://files.pythonhosted.org/packages/cd/96/5f1080b0daf5f60384ed0548a7d3d3bacb9d22b615dadd5ace12ef9ceae3/chronobio-0.0.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-04-05 08:17:41",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "vpoulailleau",
    "github_project": "chronobio",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "chronobio"
}
        
Elapsed time: 0.26430s