কম্পিউটার টিউটোরিয়াল

পাইথনে কনওয়ের গেম অফ লাইফ (Conway's Game of Life)

১৯৭০usele একজন ব্রিটিশ গণিতজ্ঞ তার "গেম অফ লাইফ" তৈরি করেন—যা মূলত একটি কোলোনির কায়াéticos উত্থানের বিস্তারিত規則। "গেম অফ লাইফ" হলো একটি দ্বিমাত্রিক গ্রিড যা "জীবিত" এবং "মৃত" কোষ নিয়ে গঠিত।

গেম অফ লাইফের নিয়মাবলী

  • অতিজনসংখ্যা (Overpopulation): একটি কোষ মরে যায় যদি সেটি তিনটির বেশি জীবিত কোষ দ্বারা ঘেরা থাকে।
  • স্থিতিশীল (Static): একটি কোষ জীবিত থাকে যদি সেটি দুই বা তিনটি জীবিত কোষ দ্বারা ঘেরা থাকে।
  • অনুজনসংখ্যা (Underpopulation): একটি কোষ মরে যায় যদি সেটি দুটির কম জীবিত কোষ দ্বারা ঘেরা থাকে।
  • প্রজনন (Reproduction): একটি মৃত কোষ জীবিত হয়ে ওঠে যদি সেটি ঠিক তিনটি জীবিত কোষ দ্বারা ঘেরা থাকে।

পাইথনে কনওয়ের গেম অফ লাইফ (Conway s Game of Life)

পাইথনে কনওয়ের গেম অফ লাইফ (Conway s Game of Life) পরবর্তী টাইমস্ট্যাম্পে কোষ মরে যাবে

পাইথনে কনওয়ের গেম অফ লাইফ (Conway s Game of Life) পরবর্তী টাইমস্ট্যাম্পে কোষ জীবিত থাকবে

পাইথনে কনওয়ের গেম অফ লাইফ (Conway s Game of Life) কোষ জীবিত

পাইথনে কনওয়ের গেম অফ লাইফ (Conway s Game of Life) কোষ মৃত

উপরের নিয়মাবলী ক্রমিকভাবে প্রয়োগ করলে সুন্দর এবং অপ্রত্যাশিত প্যাটার্ন দেখা যায়।

বাস্তবায়নের ধাপসমূহ

i. খালি ইউনিভার্স ইনিশিয়ালাইজ করুন
ii. ইউনিভার্সকে বীজ (seed) দিয়ে পূরণ করুন
iii. প্রতিটি কোষের প্রতিবেশীদের ভিত্তিতে পরবর্তী টাইমস্ট্যাম্পে বাঁচবে কিনা তা গণনা করুন
iv. এই বাঁচার ফাংশন (ধাপ iii) ইউনিভার্সের সব কোষের ওপর রিপিট করুন
v. ইচ্ছামতো জেনারেশনের জন্য ধাপ iii-iv রিপিট করুন

ইনস্টলেশন

কনওয়ের গেম অফ লাইফের জন্য matplotlib এবং numpy অ্যারে লাইব্রেরি ব্যবহার করা হবে। পিপ দিয়ে ইন্সটল করুন:

$pip install numpy, matplotlib

প্রোগ্রাম বাস্তবায়ন

এখন উপরের নিয়মাবলী অনুযায়ী প্রোগ্রাম লিখুন। নিচে সম্পূর্ণ কোড দেওয়া হলো:

# প্রয়োজনীয় লাইব্রেরি ইম্পোর্ট করুন
import numpy as np
import matplotlib.pyplot as plt
import argparse
import time

#-------------------------------------------------------------------------
class Board(object):
    def __init__(self, size, seed='Random'):
        if seed == 'Random':
            self.state = np.random.randint(2, size=size)
        self.engine = Engine(self)
        self.iteration = 0
    
    def animate(self):
        i = self.iteration
        im = None
        plt.title("Conway's Game of Life")
        while True:
            if i == 0:
                plt.ion()
                im = plt.imshow(self.state, vmin=0, vmax=2, cmap=plt.cm.gray)
            else:
                im.set_data(self.state)
            i += 1
            self.engine.applyRules()
            print('Life Cycle: {} Birth: {} Survive: {}'.format(i, self.engine.nBirth, self.engine.nSurvive))
            plt.pause(0.01)
            yield self

#-------------------------------------------------------------------------
class Engine(object):
    def __init__(self, board):
        self.state = board.state
    
    def countNeighbors(self):
        state = self.state
        n = (state[0:-2, 0:-2] + state[0:-2, 1:-1] + state[0:-2, 2:] +
             state[1:-1, 0:-2] + state[1:-1, 2:] + state[2:, 0:-2] +
             state[2:, 1:-1] + state[2:, 2:])
        return n
    
    def applyRules(self):
        n = self.countNeighbors()
        state = self.state
        birth = (n == 3) & (state[1:-1, 1:-1] == 0)
        survive = ((n == 2) | (n == 3)) & (state[1:-1, 1:-1] == 1)
        state[...] = 0
        state[1:-1, 1:-1][birth | survive] = 1
        nBirth = np.sum(birth)
        self.nBirth = nBirth
        nSurvive = np.sum(survive)
        self.nSurvive = nSurvive
        return state

#-------------------------------------------------------------------------
def main():
    ap = argparse.ArgumentParser(add_help=False)  # আর্গুমেন্ট পার্সার ইনিশিয়ালাইজ
    ap.add_argument('-h', '--height', help='Board Height', default=256)
    ap.add_argument('-w', '--width', help='Board Width', default=256)
    args = vars(ap.parse_args())  # আর্গুমেন্ট সংগ্রহ
    bHeight = int(args['height'])
    bWidth = int(args['width'])
    board = Board((bHeight, bWidth))
    for _ in board.animate():
        pass

#-------------------------------------------------------------------------
if __name__ == '__main__':
    main()

আউটপুট

Console:
Life Cycle: 1 Birth: 7166 Survive: 10621
Life Cycle: 2 Birth: 7930 Survive: 8409
Life Cycle: 3 Birth: 7574 Survive: 8756
Life Cycle: 4 Birth: 7114 Survive: 8406
Life Cycle: 5 Birth: 7005 Survive: 8126
Life Cycle: 6 Birth: 6644 Survive: 7926
Life Cycle: 7 Birth: 6266 Survive: 7711
Life Cycle: 8 Birth: 6132 Survive: 7427
Life Cycle: 9 Birth: 5957 Survive: 7322
Life Cycle: 10 Birth: 5769 Survive: 7290
Life Cycle: 11 Birth: 5585 Survive: 6937
Life Cycle: 12 Birth: 5381 Survive: 6791
Life Cycle: 13 Birth: 5208 Survive: 6686
Life Cycle: 14 Birth: 5063 Survive: 6563
...

টার্মিনালে Ctrl-C চাপা পর্যন্ত ফলাফল আসতে থাকবে।

গ্রাফিক্যাল ডিসপ্লে

পাইথনে কনওয়ের গেম অফ লাইফ (Conway s Game of Life)

কোষগুলো পরিবর্তন হতে থাকবে এবং খুব সুন্দর প্যাটার্ন সিমুলেট করবে।

সেটিংস পরিবর্তন করে ও স্লাইডার মান বদলিয়ে উপরের সাবপ্লট পরিবর্তন করা যায়:

পাইথনে কনওয়ের গেম অফ লাইফ (Conway s Game of Life)

  1. পাইথনে Unittest মডিউল ব্যবহার করে ইউনিট টেস্টিং

  2. পাইথনে লিনাক্স টার্মিনালে ফরম্যাটেড টেক্সট প্রিন্ট করা

  3. পাইথন Tkinter-এ কালার গেম তৈরি

  4. পাইথনে cx_Freeze ব্যবহার করে এক্সিকিউটেবল বানানো