كونوايز لعبة الحياة في بايثون

هذه أول مشاركة لي حيث أريد أن أخبركم عن أشهر لعبة خلوية "لعبة الحياة" ، وأكتبها أيضًا بلغة بايثون باستخدام رسومات Pygame.





Conways Game of Life (في "لعبة الحياة" الروسية) هي آلة خلوية آلية اخترعها جون كونواي في عام 1970.





القواعد بسيطة للغاية ، تجري اللعبة بأكملها في مساحة ثنائية الأبعاد (طائرة) حيث يمكن أن يكون هناك نوعان من الخلايا "مباشر" - 0 و "فارغ" -1. القواعد الأساسية لحياة الخلية هي Birth3 Survive23 ، مما يعني أن الخلية تولد مع ثلاثة جيران وتعيش مع اثنين أو ثلاثة ، وإلا تموت.





يتم تحديد عدد الجيران في حي مور.





القليل من تاريخ الخلفية من ويكيبيديا.





أصبح جون كونواي مهتمًا بمشكلة تم اقتراحها في الأربعينيات من قبل عالم الرياضيات الشهير جون فون نيومان ، الذي كان يحاول إنشاء آلة افتراضية يمكنها إعادة إنتاج نفسها. تمكن John von Neumann من إنشاء نموذج رياضي لمثل هذه الآلة بقواعد معقدة للغاية. حاول كونواي تبسيط الأفكار التي اقترحها نيومان ، وفي النهاية تمكن من وضع القواعد التي أصبحت قواعد لعبة "الحياة".





نُشر وصف هذه اللعبة لأول مرة في عدد أكتوبر (1970) من Scientific American ، تحت عنوان "ألعاب الرياضيات" لمارتن جاردنر.





أنا متأكد من أنك تعبت من كل هذه النظرية ، فلنبدأ في كتابة محاكاة بلغة Python / Pygame





Python, .





pygame "pip install pygame" "pip3 install pygame" ( "pip " , PATH Python)





,





# 
import pygame as p
from pygame.locals import *

#   RGB
BLACK = (0 , 0 , 0)
WHITE = (255 , 255 , 255)
#  
root = p.display.set_mode((1000 , 500))
#  
while 1:
    #    
    root.fill(WHITE)
    
    #  
    for i in range(0 , root.get_height() // 20):
        p.draw.line(root , BLACK , (0 , i * 20) , (root.get_width() , i * 20))
    for j in range(0 , root.get_width() // 20):
        p.draw.line(root , BLACK , (j * 20 , 0) , (j * 20 , root.get_height()))
    #        " "
    for i in p.event.get():
        if i.type==	QUIT:
          quit()
    p.display.update()
      
      



-





-
  1. system





  2. count









  3. "", counter.





  4. count









# 2      
cells=[ [0 for j in range(root.get_width()//20)] for i in range(root.get_height()//20)]
cells2=cells
#   - 
def near(pos: list , system=[[-1 , -1] , [-1 , 0] , [-1 , 1] , [0 , -1] , [0 , 1] , [1 , -1] , [1 , 0] , [1 , 1]]):
    count = 0
    for i in system:
        if cells[(pos[0] + i[0]) % len(cells)][(pos[1] + i[1]) % len(cells[0])]:
            count += 1
    return count
      
      







, .





    #    
    for i in range(len(cells)):
        for j in range(len(cells[0])):
            #   
            if cells[i][j]:
                #     2  3 
                if near([i , j]) not in (2 , 3):
                    cells2[i][j] = 0
                    continue
                #   
                cells2[i][j] = 1
                continue
            #       3     
            if near([i , j]) == 3:
                cells2[i][j] = 1
                continue
            #       
            cells2[i][j] = 0
    cells = cells2
      
      



# 
import time

import pygame as p
import random
from pygame.locals import *

#   RGB
BLACK = (0 , 0 , 0)
WHITE = (255 , 255 , 255)
#  
root = p.display.set_mode((1000 , 500))
# 2      
cells = [[random.choice([0 , 1]) for j in range(root.get_width() // 20)] for i in range(root.get_height() // 20)]


#   - 
def near(pos: list , system=[[-1 , -1] , [-1 , 0] , [-1 , 1] , [0 , -1] , [0 , 1] , [1 , -1] , [1 , 0] , [1 , 1]]):
    count = 0
    for i in system:
        if cells[(pos[0] + i[0]) % len(cells)][(pos[1] + i[1]) % len(cells[0])]:
            count += 1
    return count


#  
while 1:
    #    
    root.fill(WHITE)

    #  
    for i in range(0 , root.get_height() // 20):
        p.draw.line(root , BLACK , (0 , i * 20) , (root.get_width() , i * 20))
    for j in range(0 , root.get_width() // 20):
        p.draw.line(root , BLACK , (j * 20 , 0) , (j * 20 , root.get_height()))
   #        " "
    for i in p.event.get():
        if i.type == QUIT:
            quit()
    #    

    for i in range(0 , len(cells)):
        for j in range(0 , len(cells[i])):
            print(cells[i][j],i,j)
            p.draw.rect(root , (255 * cells[i][j] % 256 , 0 , 0) , [i * 20 , j * 20 , 20 , 20])
    #  
    p.display.update()
    cells2 = [[0 for j in range(len(cells[0]))] for i in range(len(cells))]
    for i in range(len(cells)):
        for j in range(len(cells[0])):
            if cells[i][j]:
                if near([i , j]) not in (2 , 3):
                    cells2[i][j] = 0
                    continue
                cells2[i][j] = 1
                continue
            if near([i , j]) == 3:
                cells2[i][j] = 1
                continue
            cells2[i][j] = 0
    cells = cells2
      
      







التحقق من الرمز

كل شيء يعمل ، السرعة لا تحبط أيضًا.





في المقالات القادمة سنحاول تنفيذ تعديلات على لعبة "الحياة".












All Articles