Aller au contenu

le jeu de Sowing

Le cadre

Le jeu de Sowing a été inventé par le mathématicien anglais John Horton Conway, qui l'a décrit en 1994 lors d'un atelier international sur la théorie des jeux combinatoires organisé par le Mathematical Sciences Research Institute (MSRI) à Berkeley, en Californie. Il s'agit d'un jeu de mancala 1 à un tour et à un rang.

Les règles

Un plateau est constitué d'une rangée de pots dans lesquels il y a initialement des graines.

Un plateau de 1x24 avec trois graines dans chaque pot peut être une bonne taille si le jeu est joué par des humains.

  • Deux joueurs se font face,
  • à chaque tour, un joueur :
    • choisit un pot non vide,
    • prend tout ce qu'il y a dans le pot,
    • sème ces graines une à une :
      • vers sa droite, dans les cases suivantes,
      • sans sortir du jeu,
      • et sans finir sur une case vide.
  • Le dernier joueur qui est en mesure de faire un mouvement légal gagne.

Exemples de partie

On modélise le plateau par une liste Python contenant le nombre de graines dans chaque pot.

On désigne par :

  • le joueur Sud : il est en bas de la liste, il joue vers notre droite.
  • le joueur Nord : il est en face, en haut de la liste, il joue vers notre gauche, (mais vers sa droite).

On choisit ici d'étudier toutes les parties où

  • [2, 2, 2, 2] est la condition initiale,
  • Sud commence à jouer.
  • [0, 3, 3, 2] : le joueur Sud a joué à l'indice 0
  • [0, 4, 4, 0] : le joueur Nord ne pouvait jouer qu'à l'indice 3
  • le joueur Sud a perdu, il ne peut plus jouer !

Sud n'aurait pas dû commencer à jouer en 0 !

  • [2, 0, 3, 3] : le joueur Sud a joué à l'indice 1
  • [3, 1, 4, 0] : le joueur Nord ne pouvait jouer qu'à l'indice 3
  • [3, 0, 5, 0] : le joueur Sud ne pouvait jouer qu'à l'indice 1
    • le joueur Nord a perdu, il ne peut plus jouer !

Si le joueur Sud commence en 1, il gagne !

Bilan avec un départ en [2, 2, 2, 2]

Il existe une stratégie gagnante pour le joueur qui commence dans la configuration [2, 2, 2, 2].

Exercice

Coder une fonction un_tour

  • qui prend en paramètres :
    • joueur : ou bien "Sud", ou bien "Nord", ou bien un intrus (à vérifier), le nom du joueur qui joue.
    • plateau : une liste d'entiers naturels qui indique le nombre de graines par pôt.
    • j : un entier, l'indice du coup à jouer, il devrait être positif et valide (à vérifier).
  • et qui, si le coup est valide, renvoie un nouveau plateau à l'issue de ce coup.
  • ou sinon qui provoque une erreur, la première dans l'ordre, parmi :
    1. raise KeyError("Joueur inconnu !") ; seuls "Nord" et "Sud" peuvent jouer.
    2. raise IndexError("Début hors des limites du plateau !") ; indices positifs obligatoires.
    3. raise ValueError("Début sur case vide !") ; interdit, voir règles.
    4. raise IndexError("Sorti du plateau !") ; interdit, voir règles.
    5. raise ValueError("Fin sur une case vide !") ; interdit, voir règles.

👍 On garantit que tableau ne contient que des entiers naturels. (Inutile de le vérifier donc.)

👍 Ne pas avoir peur des tests, il n'est pas nécessaire de comprendre la gestion des erreurs. C'est pourtant, ici, une très bonne occasion de découvrir une manière d'attraper une erreur.

Gestion des erreurs (facultatif)

Il n'est pas ici nécessaire de comprendre (même vaguement) la gestion des erreurs proposées, ni même de les créer. Voici, toutefois, des clés simples pour comprendre les tests.

🐍 Script Python
try:
    instruction_s()
except TrucError:
    action_si_erreur()
else:
    action_si_aucune_erreur()
  • try : On essaie d'exécuter une ou des instruction(s).
  • except TrucError : le cas où une erreur de type Truc est provoquée, on peut alors faire une action dédiée. En effet, le programme ne s'arrête pas ; l'erreur a été attrapée.
  • else : sinon, on peut réagir autrement.

Dans les tests ce cet exercice, on attend que les essais (try) conduisent aux erreurs spécifiques indiquées, et donc aux messages print("OK..."). Entrer dans la clause else n'est pas le comportement attendu.

Dans cet exercice, les différents types d'erreurs utilisés sont :

  • KeyError : une erreur liée à une clé (key).
  • IndexError : une erreur liée à un indice (index).
  • ValueError : une erreur liée à une valeur (value).

Il en existe bien d'autres !

Ainsi, quand votre fonction sera prête, vous aurez la sortie

📤 Sortie
OK. 'Autre' joueur n'a pas été autorisé à jouer.
OK. 'Sud' n'a pas été autorisé à jouer sur une case vide.
OK. 'Sud' n'a pas été autorisé à jouer hors du plateau.
OK. 'Sud' n'a pas été autorisé à jouer en finissant sur une case vide.
OK. 'Sud' n'a pas été autorisé à jouer en sortant du plateau.
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : /
.128013x/.r;nbylaeu)dV6J3m(P+02-],59f!7}K8 N_o={pcwgv4F1kRIéhtsSàj[Di:E050o0l0%0k0.0j0(0K0R0j0k0(0(0O010%0.0Q010406050(0m0t0t0k0e0i040)0N0j0m140N0g050c1b1d1f1h190Q04051x1q1A0c1x190o0.0U0|0~10120$0.0T0$0j1O0$0%17050@0h0j0l1J0 11011N1P1R1P0%1X1Z1V0%0e1y0%0$1#1L010E0_0l0g0k0t0l010|1k0(0Q0k0g120y1V26281_1%1|1Z1 21170a0K0v0e0N0Q0N0(0.1n0g0K0=240e0e0l0R2v1q2d0g1y0c1@2I1;1?1=1W0o2f121R0g1~2s1V1G1I0}1$2S0.2U0g0N2Y1V0Q2B1y2G2I2:1a272w2!1`2)0e1e0j170K0X2F2@182?2e2_1%2{2}2 0y3228342G2R01390k2~040K0s3d2H193g37123j3l0K0V3p3f2@3h3v2 0C3z3r3B3t3i0N2|3k2 0q3G352^1K383L3a3m0G3Q3s3T3u3V3N3m0J3Z3I3#3K3M3w0D3+363-3D040X0x3=3S2#3.3W0X311r333H3?3~3^0X3c433e453}2`3%3l0X3o4b3q3R3C4g170X3y4k3A464f3/4p3F4s4d4n4w3_3P4z4m3J483Y4F3!474o3_3*4K3,4M4C0X3;4Q4u3U4C0y3{4W4e4Y3W0y422:4A4H4N0y4a4,4G3@4/4j4=4L4v4)4r4`4R4|3(0y4y4 4X3$4Z4E554%574)4J5a4B4)4P5f4.4Z4V5j4@4C0s4#2=1D2.1q2Y2L0o1?2Q3J0R2*221y5w1z5u5s2=5C0=2/501%0Y170=0E3z4?3~0S2 5U4{380E170m0g0M0%0N0m0e5Z5O1216040u5/563i170+5,0l5-5^5b015=0/3z0K5V2`0h170(1;603h5=0B656738171.0l0k0m6d3J636h5!3u69041R6b6p3-5=0,6z476v2%0%6D1`5=0A6g4s666t5`040+6I1%6r6N6i6u176G6T5;170n6s5:010N170z020T0%0f6)5_0g6v6x6H4s6X62176C6|6P6^6Z0g6{2=6P6K644z0K7c6O6*0(2b04010Z1~0U0N0.1!1Z0K2)0m0U6m0m0K0Q0~0%7v0K0*0K0j000.100m1!0o005(240m0Q2x7w5|7J5-7C7E7G0g1G0R1!0+013G7d7e6@5R0.2B2D0.1o6?616,040O7?6e170P6#017g17010L3L0o7(716*6V2:7+7@6-7 0t0.4p7 6f7{3J817i0)0m868j177a8b6}7^0w8f8h3_8s040H7)7d6}5Q040.5T6W725{5}5 8M6*0N5X042)76338c3h8T748l3@7-7/2E885_8a447*7*8H170e0^0(0l8%475E0I0l0i0:2A3L8C5@8,618n010r8P0e0K2%5C0g0g7w0F8777896%3G068;8N6w1o0T7U5.8R5_7^7`9x61736w1~947 0g6k0k1Y7v8C6(7b8G6P8I8K8{1`8#8V0N8X3e6}5=959l5_8g175r8Y8w17020j6;9A8v9r6S9B8!9/9;6=9`4H170j9t9v9N8u8/8:7c8=048@7H8`9 3@5E0!7Z0l0b912p9w9(619$7 980-0#0h1m0K0$3L0{0=0{1R8g7AaB7w7y0k7A6n0K9j9N9o9q6*9I041b2uae9@8S179?9-9r6l6n7 7^0d9H175C0Q0i949O4,aR7,8V0h0M0Tac2U0(9U1%9zb13u6a0maW8C70ap3C5{8C0A8Fa99R6Z8LaYa_6^a|a~0lb0af3~9za#3e8Z3J9*049,9!788tbg8:aaac8_b43i5E0p3k7Jam93967|5?as7h01auaw0%0K1b9c0R0 1!0U0.2yaObS6q9n4z9p9QaSb6b8b/6A6 a-6RbebKb3bs1`bzbB3qa^9C6Zc1a!bKaT9_a@b@a_1Gcb7_cd8)2C8+bbb:04ba336}ce9bc09Pbh6*8I0S1N1Zcma`bo0^a ck6/6;bKc58Ca64ca8cAa_0.ck0wbv2Hbx8(04cjczbGbi8Jbka$9mbUb{47cac3b2a!cZ3mcva1a35~aocubD04a?c.9y8UbRblaq179%d1b^8JcL9}cO8Ac65N8-6%cRc7cTc83h8IbIaXd59Cahajal92d0bCc/dcdD5_981j0e147R7x7z7Bb.cqb|d3aQcTc|aUb77Ab9b~cWc;6J17bfc@128xc`c#3~bz4+a7a8dWbna}cJbqck0zd.6}d;dUcU619Sc-bwdWaVdZd%6Ub}ebb5dfee6~04d*d99{7_d 6Pe1eh8.cSdVc+ducdbMbO0lbQdC2H9#dbbV820W2%b#7V5(1!b(8_0Kb+b-9kdddmdTb=dr3Jdt0?5-1pd+6Qe9dv4c1q5L0l2I2-e/5v1H5x2L2O2J9K1Z2I5w190c0=0@0_0(04.

  1. Mancala : ou jeu de semis, est le nom générique donné à une famille de jeux de société traditionnels principalement joués en Afrique, mais également dans le sud de l'Asie, dans les Caraïbes ainsi que sur la côte est de l'Amérique du Sud.