Lebensspiel mit Python [ich habe es geschafft] (auf Terminal & Tkinter)

Dieses Mal habe ich Conways Spiel des Lebens anstelle einer numerischen Simulation gemacht.

Ich begann mit der Absicht, eine Pause zu machen, aber als ich es schaffte, war ich süchtig danach, also machte ich viel Versuch und Irrtum. Daher ist das fertige Produkt endlich in einer beweglichen Form. Wenn ich die Spezifikationen verstehe, denke ich, dass ich etwas besser machen könnte, aber ich hatte keine Lust, so viel zu lesen. .. ..

Life Game_007

Was ist ein Lebensspiel?

Zunächst eine kurze Erklärung der Lebensspiele. Ein Lebensspiel ist eine Art Zellautomat, der Informationen darüber enthält, dass die Gitterpunkte "lebendig" und "tot" sind. Wenn die Zeit (Generation) um eins voranschreitet, befindet sie sich gemäß den vorgegebenen Regeln entsprechend der Umgebungssituation im Inneren. Es ändert den Zustand von. In der Regel überleben Punkte in den umliegenden 8 Quadraten auf einem quadratischen Gitter, wenn 2 oder 3 am Leben sind, und wenn es 3 überlebende Gitterpunkte in der Umgebung gibt, werden sie neu geboren. Ich denke es gibt 3 etc. Da das Lebensspiel vollständig funktioniert, können Sie den Computer innerhalb des Lebensspiels reproduzieren. Für mehr Informationen

<a href = "http://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3% 83% A0 "target =" _ blank "title =" Lebensspiel - Wikipedia: "> Lebensspiel - Wikipedia: Life Game World 1 [ Komplexes System] --Niko Niko Video: GINZA:

Bitte beziehen Sie sich auf. Das Video wird besonders empfohlen.

Lebensspiel auf dem Terminal

Ich wollte mit Tkinter ein Lebensspiel machen, aber es schien schwierig zu sein, also machte ich zuerst die Regeln des Lebensspiels, damit ich es auf dem Terminal überprüfen konnte.

Das ist der nächste.

lifegame_console.py


#! /usr/bin/env python
# -*- coding:utf-8 -*-
#
# written by ssh0, June 2014.

import numpy as np
import sys
import time
import os

class LifeGame:

    def __init__(self, L=50, rule="2 3/3"):
        self.L = L # lattice size
        p = 0.2
        self.survive = [int(i) for i in rule.split("/")[0].split()]
        self.birth = [int(i) for i in rule.split("/")[1].split()]
        lattice = np.random.random([self.L+2, self.L+2])
        self.lattice = lattice<p
        self.lattice[0,:] = self.lattice[self.L+1,:] = False
        self.lattice[:,0] = self.lattice[:,self.L+1] = False

    def canvas_update(self):
        os.system("clear")
        print "\n"
        l = ""
        for y in range(1,self.L+1):
            for x in range(1,self.L+1):
                if self.lattice[x,y]:
                    l += u" ■"
                else:
                    l += u" □"
            l += "\n"
        print l
        print "\n"
        time.sleep(0.1)
                
    def progress(self):
        L = self.L
        Tmax = 2000
        t = 0
        while t < Tmax:
            try:
                self.canvas_update()
                nextsites = []
                
                #Periodische Randbedingung
                self.lattice[0,0] = self.lattice[self.L,self.L]
                self.lattice[0,self.L+1] = self.lattice[self.L,1]
                self.lattice[self.L+1,0] = self.lattice[1,self.L]
                self.lattice[self.L+1,self.L+1] = self.lattice[1,1]
                for m in range(1, self.L+1):
                    self.lattice[m, self.L+1] = self.lattice[m, 1]
                    self.lattice[m, 0] = self.lattice[m, self.L]
                    self.lattice[0, m] = self.lattice[self.L, m]
                    self.lattice[self.L+1, m] = self.lattice[1, m]
                
                #Beurteilung benachbarter Gitterpunkte
                for m in range(1,self.L+1):
                    for n in range(1,self.L+1):
                        
                        if self.lattice[m,n]:
                            neighber = np.sum(self.lattice[m-1:m+2, n-1:n+2])-1
                            if neighber in self.survive:
                                nextsites.append((m,n))
                        else:
                            neighber = np.sum(self.lattice[m-1:m+2, n-1:n+2])
                            if neighber in self.birth:
                                nextsites.append((m,n))
                                
                #Gitter aktualisieren
                self.lattice[:] = False
                for nextsite in nextsites:
                    self.lattice[nextsite] = True
                
                t += 1
                
            except KeyboardInterrupt:
                print "stopped."
                break

if __name__ == '__main__':
    
    lg = LifeGame()
    lg.progress()

Die Ausgangsbedingung war, dass die Punkte unterhalb des Schwellenwerts in der Matrix, denen Zufallszahlen zugewiesen wurden, überlebten. Für die Anzeige konnte ich zuerst das Terminal löschen und die überlebenden Sites als ■ und die anderen Sites als □ drucken. Wenn die Verzögerungszeit kleiner als 0,1 ist, wird das Flimmern in meiner Umgebung schlimmer, so dass es anscheinend nicht schneller gemacht werden kann.

Ich mache also bitte ein Video

<img src = "https://i.ytimg.com/vi/7KMluy0fRq8/2.jpg " alt = "Einfach mit Python" Ich habe ein Lebensspiel (numpy) "border =" 0 "width =" 145 "height =" 109 "/> erstellt Ich habe ein einfaches Lebensspiel mit Python (numpy) gemacht

Anzeige mit Tkinter

Als nächstes werde ich vorstellen, was ich mit Tkinter's Canvas gemacht habe. Das stickigste daran war, das "Leben" und den "Tod" jedes Gitters durch Klicken ändern zu können. Mit Pygame ist das vielleicht einfacher, und soweit ich sehen kann, habe ich nur Leute gesehen, die es benutzt haben. Ich denke jedoch, dass die Grundlagen dieselben sind, deshalb habe ich mich für Tkinter selbst entschieden, das ich weiterhin verwenden werde. Alle sind unten aufgeführt.

lifegame.py


#! /usr/bin/env python
# -*- coding:utf-8 -*-
#
# written by ssh0, September 2014.

from tkinter import *
import numpy as np
import sys
# import time


class LifeGame:

    def __init__(self, L=30, rule="2 3/3", p=None, pattern=None):
        self.L = L  # lattice size
        self.survive = [int(i) for i in rule.split("/")[0].split()]
        self.birth = [int(i) for i in rule.split("/")[1].split()]

        if p:
            lattice = np.random.random([self.L + 2, self.L + 2])
            self.lattice = lattice < p
            self.lattice[0, :] = self.lattice[self.L+1, :] = False
            self.lattice[:, 0] = self.lattice[:, self.L + 1] = False
        else:
            self.lattice = np.zeros([self.L + 2, self.L + 2], dtype=bool)
            if pattern:
                for x, y in pattern:
                    self.lattice[x, y] = True

    def progress(self, canvas_update, update):
        Tmax = 2000
        t = 0
        self.loop = True
        while self.loop:
            try:
                past_lattice = self.lattice.copy()

                nextsites = []

                #Periodische Randbedingung
                self.lattice[0, 0] = self.lattice[self.L, self.L]
                self.lattice[0, self.L + 1] = self.lattice[self.L, 1]
                self.lattice[self.L + 1, 0] = self.lattice[1, self.L]
                self.lattice[self.L + 1, self.L + 1] = self.lattice[1, 1]
                for m in range(1, self.L+1):
                    self.lattice[m, self.L+1] = self.lattice[m, 1]
                    self.lattice[m, 0] = self.lattice[m, self.L]
                    self.lattice[0, m] = self.lattice[self.L, m]
                    self.lattice[self.L+1, m] = self.lattice[1, m]

                #Beurteilung benachbarter Gitterpunkte
                for m in range(1, self.L + 1):
                    for n in range(1, self.L + 1):

                        if self.lattice[m, n]:
                            neighber = np.sum(self.lattice[m-1:m+2, n-1:n+2])-1
                            if neighber in self.survive:
                                nextsites.append((m, n))
                        else:
                            neighber = np.sum(self.lattice[m-1:m+2, n-1:n+2])
                            if neighber in self.birth:
                                nextsites.append((m, n))

                #Gitter aktualisieren
                self.lattice[:] = False
                for nextsite in nextsites:
                    self.lattice[nextsite] = True

                #Zeichnungsaktualisierung
                changed_rect = np.where(self.lattice != past_lattice)
                for x, y in zip(changed_rect[0], changed_rect[1]):
                    if self.lattice[x, y]:
                        color = "green"
                    else:
                        color = "black"
                    canvas_update(x, y, color)
                update()
               # time.sleep(0.1)

                t += 1
                if t > Tmax:
                    self.loop = False

            except KeyboardInterrupt:
                print("stopped.")
                break


class Draw_canvas:

    def __init__(self, lg, L):

        self.lg = lg
        self.L = L
        default_size = 640  # default size of canvas
        self.r = int(default_size / (2 * self.L))
        self.fig_size = 2 * self.r * self.L
        self.margin = 10
        self.sub = Toplevel()
        self.sub.title("Life Game")
        self.canvas = Canvas(self.sub, width=self.fig_size + 2 * self.margin,
                             height=self.fig_size + 2 * self.margin)
        self.c = self.canvas.create_rectangle
        self.update = self.canvas.update
        self.rects = dict()
        for y in range(1, self.L + 1):
            for x in range(1, self.L + 1):
                if self.lg.lattice[x, y]:
                    live = True
                else:
                    live = False
                tag = "%d %d" % (x, y)
                self.rects[tag] = Rect(x, y, live, tag, self)
        self.canvas.pack()

    def canvas_update(self, x, y, color):
        v = self.rects["%d %d" % (x, y)]
        v.root.canvas.itemconfig(v.ID, fill=color)


class Rect:

    def __init__(self, x, y, live, tag, root):
        self.root = root
        self.x = x
        self.y = y
        self.live = bool(live)
        if live:
            color = "green"
        else:
            color = "black"
        self.ID = self.root.c(2*(x-1)*self.root.r + self.root.margin,
                              2*(y-1)*self.root.r + self.root.margin,
                              2*x*self.root.r + self.root.margin,
                              2*y*self.root.r + self.root.margin,
                              outline="#202020", fill=color, tag=tag)
        self.root.canvas.tag_bind(self.ID, '<Button-1>', self.pressed)

    def pressed(self, event):
        if self.live:
            self.live = False
            color = "black"
        else:
            self.live = True
            color = "green"
        self.root.lg.lattice[self.x, self.y] = self.live
        self.root.canvas.itemconfig(self.ID, fill=color)


class TopWindow:

    def show_window(self, title="title", *args):
        self.root = Tk()
        self.root.title(title)
        frames = []
        for i, arg in enumerate(args):
            frames.append(Frame(self.root, padx=5, pady=5))
            for k, v in arg:
                Button(frames[i], text=k, command=v).pack(expand=YES, fill='x')
            frames[i].pack(fill='x')
        self.root.mainloop()


class Main:

    def __init__(self):
        L = 100
        rule = "2 3/3"
        self.top = TopWindow()
        c = L / 2
        #Stirb langsam
        pattern = [(c-1, c+1), (c, c+1), (c, c+2), (c+4, c+2),
                   (c+5, c), (c+5, c+2), (c+6, c+2)]

        self.lg = LifeGame(L, rule, p=None, pattern=pattern)
        self.top.show_window("Life game", (('set', self.init),),
                             (('start', self.start),
                              ('pause', self.pause)),
                             (('save', self.pr),),
                             (('quit', self.quit),))

    def init(self):
        self.DrawCanvas = Draw_canvas(self.lg, self.lg.L)

    def start(self):
        self.lg.progress(self.DrawCanvas.canvas_update, self.DrawCanvas.update)

    def pause(self):
        self.lg.loop = False

    def pr(self):
        import tkinter.filedialog
        import os
        if self.DrawCanvas is None:
            return 1
        fTyp = [('eps file', '*eps'), ('all files', '*')]
        filename = tkinter.filedialog.asksaveasfilename(filetypes=fTyp,
                                                  initialdir=os.getcwd(),
                                                  initialfile='figure_1.eps')
        if filename is None:
            return 0
        self.DrawCanvas.canvas.postscript(file=filename)

    def quit(self):
        self.pause()
        sys.exit()

if __name__ == '__main__':

    app = Main()

Der Unterschied zur vorherigen Datei lifegame_console.py besteht darin, dass LifeGame .__ init__ kleine Variablen verarbeitet, canvas_update auf eine andere Klasse Draw_canvas festgelegt ist und der Teil, der das Raster zeichnet, in eine andere Klasse Rect unterteilt ist. Infolgedessen kann jeder Gitterpunkt als unabhängiger behandelt werden. Wenn Sie auf den Gitterpunkt drücken, können Sie zwischen "Leben" und "Tod" wechseln. Bitte werfen Sie einen Blick auf die tatsächliche Ausführung (die zweite Hälfte dient nur dazu, der Codeverbindung zu folgen. Wenn Sie also nicht interessiert sind, können Sie sie überspringen).

<img src = "https://i.ytimg.com/vi/1M9sc5TlWQg/3.jpg " alt = "Leben mit Python" Ich habe ein Spiel [Tkinter] "border =" 0 "width =" 145 "height =" 109 "/> gemacht Ich habe ein Lebensspiel mit Python [Tkinter] gemacht

Zusammenfassung

Dieses Mal spiele ich hauptsächlich, aber ich habe neue Dinge gelernt und ich denke, dass das Spektrum der Simulationen in Zukunft erweitert wird. Außerdem sollten Sie dem Video Untertitel und Erklärungen hinzufügen. .. .. Ich würde es gerne etwas mehr anfassen.

Recommended Posts

Lebensspiel mit Python [ich habe es geschafft] (auf Terminal & Tkinter)
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ich habe mit Tkinter of Python ein Puzzlespiel (wie) gemacht
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe mit Python ein schurkenhaftes Spiel gemacht
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe versucht, mit tkinter mit dem Taschenrechner zu spielen
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Ich habe etwas mit Python gemacht, das sich JETZT LADEN auf dem Terminal von links nach rechts bewegt
Ich habe versucht, Mine Sweeper auf dem Terminal mit Python zu implementieren
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe einen Blackjack mit Python gemacht!
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
Ich habe mit Python einen Blackjack gemacht.
Ich habe Wordcloud mit Python gemacht.
[Python] Ich habe das Spiel von pip installiert und versucht zu spielen
[Ich habe es mit Python gemacht] Tool für die Stapelausgabe von XML-Daten
Ich habe mit Python eine Lotterie gemacht.
Othello-Spieleentwicklung mit Python
Lebensspiel mit Python! (Conways Spiel des Lebens)
Ich mochte den Tweet mit Python. ..
Ich habe mit Python einen Daemon erstellt
CUM_plot, das ich oft am Produktionsstandort sehe, ist nicht ins Netz gefallen, also habe ich es mit Python gemacht
Ich habe einen Pokerspielserver Chat-Holdem mit Websocket mit Python erstellt
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
Ich habe mit Python einen Zeichenzähler erstellt
Laden Sie mit Python Dateien im Web herunter
Ich habe mit Python eine Hex-Map erstellt
[Python] Ein Fortschrittsbalken auf dem Terminal
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe mit Python einen Neuronensimulator erstellt
[Python] Ich habe versucht, die Nacht der Galaxienbahn mit WordCloud zu visualisieren!
Ich möchte Twitter mit Python twittern, bin aber süchtig danach
Ich habe Umgebungsvariablen in Docker festgelegt und in Python angezeigt.
Ich habe es mit den Top 100 PyPI-Paketen versucht.> Ich habe versucht, die auf Python installierten Pakete grafisch darzustellen
[Python] Ich habe das Tagebuch eines Mannes im ersten Jahr des Arbeitslebens analysiert und das Arbeitsleben positiv / negativ beurteilt.
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
GUI-Bildschneidewerkzeug mit Python + Tkinter
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
Ich möchte ein Spiel mit Python machen
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Einführung in Python mit Atom (unterwegs)
Mattermost Bot mit Python gemacht (+ Flask)
Ich habe Pygame mit Python 3.5.1 in der Umgebung von pyenv unter OS X installiert
Ich konnte das Python-Modul nicht mit VSCODE importieren, aber ich konnte es auf jupyterlab tun, also suchte ich nach der Ursache (2)
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
〇✕ Ich habe ein Spiel gemacht
Ganz rechts Koordinaten des Etiketts mit tkinter erstellt
Ich habe Python zum ersten Mal auf dem Mac ausprobiert.