{"id":113,"date":"2011-02-14T03:12:30","date_gmt":"2011-02-14T02:12:30","guid":{"rendered":"http:\/\/blog.lookee.it\/?p=113"},"modified":"2024-02-09T21:30:28","modified_gmt":"2024-02-09T19:30:28","slug":"john-conways-game-of-life-in-python","status":"publish","type":"post","link":"https:\/\/www.lucaamore.com\/?p=113","title":{"rendered":"John Conway&#8217;s Game of Life in Python"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2023\/01\/lukelv_steampunk_fractals_into_a_monitor_d0f00a93-7856-4fcc-aa97-ba3e3b774a99.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1024\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2023\/01\/lukelv_steampunk_fractals_into_a_monitor_d0f00a93-7856-4fcc-aa97-ba3e3b774a99-1024x1024.png\" alt=\"\" class=\"wp-image-1603\" srcset=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2023\/01\/lukelv_steampunk_fractals_into_a_monitor_d0f00a93-7856-4fcc-aa97-ba3e3b774a99.png 1024w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2023\/01\/lukelv_steampunk_fractals_into_a_monitor_d0f00a93-7856-4fcc-aa97-ba3e3b774a99-300x300.png 300w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2023\/01\/lukelv_steampunk_fractals_into_a_monitor_d0f00a93-7856-4fcc-aa97-ba3e3b774a99-150x150.png 150w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2023\/01\/lukelv_steampunk_fractals_into_a_monitor_d0f00a93-7856-4fcc-aa97-ba3e3b774a99-768x768.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n<p>Come primo progetto in Python, ho deciso di realizzare una semplice versione del famosissimo automa cellulare di Conway: &#8220;Game of Life&#8221;.<\/p>\n<div id=\"attachment_135\" style=\"width: 282px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/jaGOF1.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-135\" class=\"size-full wp-image-135 \" title=\"jaGOF\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/jaGOF1.png\" alt=\"jaGOF - just another Game of Life screenshoot\" width=\"272\" height=\"242\" \/><\/a><p id=\"caption-attachment-135\" class=\"wp-caption-text\">screenshot di jaGOF<\/p><\/div>\n<p><strong>Quick start<\/strong><\/p>\n<p>Per maggiori informazioni su Life vi rimando alla pagina di Wikipedia in <a title=\"Gioco della vita\" href=\"http:\/\/it.wikipedia.org\/wiki\/Gioco_della_vita\">italiano<\/a> oppure in <a title=\"Game of Life\" href=\"http:\/\/en.wikipedia.org\/wiki\/Conway%27s_Game_of_Life\">inglese<\/a> ed ai vari riferimenti ed approfondimenti che citer\u00f2 al termine di questo articolo.<\/p>\n<p>Se utilizzate un browser che supporta l&#8217;HTML5 potete provare velocemente <a title=\"Game of Life HTML5\" href=\"http:\/\/pmav.eu\/stuff\/javascript-game-of-life-v3.1.1\/\">gameoflife<\/a>.<\/p>\n<p><strong>The Game of Life<\/strong><\/p>\n<p>The Game of Life, concepito al termine degli anni 60 dal matematico britannico John Horton Conway, \u00e8 un automa cellulare che simula l&#8217;evoluzione di una popolazione tramite regole che stabiliscono vita, nascita, morte di ogni singolo individuo<em>.<br \/><\/em><\/p>\n<p>La magia di questo gioco sta nella sua semplicit\u00e0 contrapposta alla profondit\u00e0 e complessit\u00e0 dell&#8217;esplorazione dei risultati; piccole variazioni di un solo individuo nella distribuzione della popolazione iniziale possono condurre ad evoluzioni totalmente diverse.<\/p>\n<p>Ogni cella di una popolazione, transitando dallo stato di vita o morte, condiziona l&#8217;evoluzione delle celle confinanti; queste interazioni provocano evoluzioni estremamente complesse ed interessanti anche a partire da configurazioni apparentemente banali.<\/p>\n<p>In molti si sono cimentati nella ricerca di configurazioni iniziali con determinate propriet\u00e0 o nella classificazione sistematica dei possibili schemi o pattern ricorrenti.<\/p>\n<p><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_a_small_cyberpunk_planet_lived_by_robots_d41b14f7-9ae2-4a14-961c-1c676d9f500c.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-1604\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_a_small_cyberpunk_planet_lived_by_robots_d41b14f7-9ae2-4a14-961c-1c676d9f500c-1024x1024.png\" alt=\"\" width=\"584\" height=\"584\" srcset=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_a_small_cyberpunk_planet_lived_by_robots_d41b14f7-9ae2-4a14-961c-1c676d9f500c.png 1024w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_a_small_cyberpunk_planet_lived_by_robots_d41b14f7-9ae2-4a14-961c-1c676d9f500c-300x300.png 300w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_a_small_cyberpunk_planet_lived_by_robots_d41b14f7-9ae2-4a14-961c-1c676d9f500c-150x150.png 150w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_a_small_cyberpunk_planet_lived_by_robots_d41b14f7-9ae2-4a14-961c-1c676d9f500c-768x768.png 768w\" sizes=\"auto, (max-width: 584px) 100vw, 584px\" \/><\/a><\/p>\n<p><strong>Descrizione formale dell&#8217;algoritmo di evoluzione<br \/><\/strong><\/p>\n<p>Il mondo \u00e8 costituito da una griglia rettangolare di N x M celle le quali possono essere in due possibili stati: vive o morte.<\/p>\n<p>Due celle si definiscono confinanti se sono connesse in una delle 8 direzioni possibili (anche in diagonale); i confini del mondo sono tra loro connessi come in un pianeta perfettamente sferico.<\/p>\n<p>Definita una configurazione iniziale di celle, l&#8217;automa simula l&#8217;evoluzione della vita. In intervalli di tempo discreti tutte le cellule del mondo vengono aggiornate simultaneamente (ogni aggiornamento \u00e8 definito generazione o epoca) seguendo queste regole:<\/p>\n<ul>\n<li>una cella viva rimane in vita se esistono 2 o 3 celle vive confinanti (<em>sopravvivenza<\/em>)<\/li>\n<li>una cella viva muore se confina con meno di due celle vive (<em>isolamento<\/em>)<\/li>\n<li>una cella viva muore se esistono piu&#8217; di 3 celle confinanti (<em>sovraffollamento<\/em>)<\/li>\n<li>una cella morta con esattamente 3 celle vive confinanti nasce e diventa viva (<em>riproduzione<\/em>)<\/li>\n<\/ul>\n<p><strong>Evoluzione e classificazione di alcuni schemi<\/strong><\/p>\n<p>L&#8217;evoluzione della popolazione pu\u00f2 giungere verso l&#8217;estinzione totale della specie oppure verso varie tipologie di configurazioni ricorrenti che possono essere di:<\/p>\n<ul>\n<li>tipo statico (<em>blocco, barca<\/em>)<\/li>\n<li>oscillante (<em>lampeggiatore, rospo<\/em>)<\/li>\n<li>in movimento o navicelle spaziali (<em>aliante, astronave leggera LWSS<\/em>)<\/li>\n<\/ul>\n<p>Altri schemi estremamente interessanti sono:<\/p>\n<ul>\n<li><em>fucili<\/em>: stazionari che sparano alianti o navicelle spaziali<\/li>\n<li><em>fumatori<\/em>: si muovono lasciando in coda frammenti di vita<\/li>\n<li><em>rastrelli<\/em>: si muovono ed emettono navicelle<\/li>\n<li><em>reattore<\/em>: lascia una coda di fucili (tasso di crescita quadratico)<\/li>\n<\/ul>\n<p>Su Wikipedia sono disponibili le configurazioni di questi schemi base oppure su <a title=\"Conway Life iki\" href=\"http:\/\/www.conwaylife.com\/wiki\">ConwayLife Wiki<\/a> o su\u00a0 <a title=\"Life Wiki\" href=\"http:\/\/www.conwaylife.com\/wiki\">Life Lexicon<\/a> \u00e8 possibile trovare una classificazione ancora pi\u00f9 accurata ed estesa.<\/p>\n<p><strong>jaGof: just another Game of Life (la mia realizzazione)<br \/><\/strong><\/p>\n<p>Per realizzare Life in Python ho utilizzato la libreria Pygame (python-pygame) che si basa su SDL. Potete scaricare i sorgenti di jaGof, rilasciati sotto licenza GNU\/GPL v.3, e siete incoraggiati a farne quello che desiderate.<\/p>\n<p>Nella directory seeds sono stati inclusi pi\u00f9 di 400 pattern iniziali in formato .cell scaricati da Life Lexicon.<\/p>\n<p><a href=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_with_lists_and_more_details_f6afab62-c358-4926-9008-926fc009948f.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-1641\" src=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_with_lists_and_more_details_f6afab62-c358-4926-9008-926fc009948f-1024x1024.png\" alt=\"\" width=\"584\" height=\"584\" srcset=\"https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_with_lists_and_more_details_f6afab62-c358-4926-9008-926fc009948f.png 1024w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_with_lists_and_more_details_f6afab62-c358-4926-9008-926fc009948f-300x300.png 300w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_with_lists_and_more_details_f6afab62-c358-4926-9008-926fc009948f-150x150.png 150w, https:\/\/www.lucaamore.com\/wp-content\/uploads\/2011\/02\/lukelv_with_lists_and_more_details_f6afab62-c358-4926-9008-926fc009948f-768x768.png 768w\" sizes=\"auto, (max-width: 584px) 100vw, 584px\" \/><\/a><\/p>\n<p>Ricordo che si tratta del mio primo progetto in Python.<\/p>\n<p><a title=\"jaGOF\" href=\"https:\/\/github.com\/lookee\/jaGOF\">Visualizza o scarica i sorgenti dal repository su github<\/a><\/p>\n<p><strong>Futuri sviluppi<\/strong><\/p>\n<p>Mi piacerebbe sviluppare un algoritmo automatico per la ricerca di qualche configurazione con determinate propriet\u00e0.<\/p>\n<p><strong>Riferimenti<\/strong><\/p>\n<p><a title=\"Game of Life HTML5\" href=\"http:\/\/pmav.eu\/stuff\/javascript-game-of-life-v3.1.1\/\">gameoflife<\/a><a title=\"Life Wiki\" href=\"http:\/\/www.conwaylife.com\/wiki\">Wikipedia(it): &#8220;Gioco della vita&#8221;<br \/>LifeWiki<br \/>Life Lexicon Home Page<\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Come primo progetto in Python, ho deciso di realizzare una semplice versione del famosissimo automa cellulare di Conway: &#8220;Game of Life&#8221;. Quick start Per maggiori informazioni su Life vi rimando alla pagina di Wikipedia in italiano oppure in inglese ed &hellip; <a href=\"https:\/\/www.lucaamore.com\/?p=113\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":1605,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_sitemap_exclude":false,"_sitemap_priority":"","_sitemap_frequency":"","footnotes":""},"categories":[10,15,32,166,13,11,14],"tags":[74,90,89,65],"class_list":["post-113","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cellular-automata","category-life","category-freesoftware","category-programming","category-pygame","category-python","category-sdl","tag-cellular-automata","tag-conway","tag-life","tag-python"],"_links":{"self":[{"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/posts\/113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=113"}],"version-history":[{"count":40,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/posts\/113\/revisions"}],"predecessor-version":[{"id":2064,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/posts\/113\/revisions\/2064"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=\/wp\/v2\/media\/1605"}],"wp:attachment":[{"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lucaamore.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}