我正在尝试做我自己的生活游戏(康威),但它不起作用,模式结果是错误的。。。有人能帮我吗?

2024-09-29 03:37:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下两个文件

GOL_CORE

from random import choice
import pygame

RECT_COLOR = [200, 200, 0]

class GOL_CLASS:
    def __init__(self, SQUARED_LENGTH):
        self.SYSTEM = {(x, y):choice([False, False, False, False, True]) for x in range(SQUARED_LENGTH) for y in range(SQUARED_LENGTH)}

    def activate(self, TEMPORARY_DICTIONARY, X, Y):
        RETURN_VALUE = TEMPORARY_DICTIONARY
        RETURN_VALUE[(X, Y)] = True
        return RETURN_VALUE
    
    def deactivate(self, TEMPORARY_DICTIONARY, X, Y):
        RETURN_VALUE = TEMPORARY_DICTIONARY
        RETURN_VALUE[(X, Y)] = False
        return RETURN_VALUE
    
    def check(self, X, Y):
        Counter = 0
        a = [(X+1,Y+1),(X,Y+1),(X-1,Y+1),(X+1,Y),(X-1,Y),(X+1,Y-1),(X,Y-1),(X-1,Y-1)]
        for i in range(8):
            if a[i] in self.SYSTEM:
                if self.SYSTEM[a[i]] == True:
                    Counter += 1
        return Counter

    def step(self, SCREEN):
        TEMPORARY_DICTIONARY = self.SYSTEM
        for x, y in self.SYSTEM:
            TEMP = self.check(x, y)
            if self.SYSTEM[(x, y)] == False:
                if TEMP == 3:                       #Rule 4
                    TEMPORARY_DICTIONARY = self.activate(TEMPORARY_DICTIONARY, x, y)
            else:
                if TEMP < 2:                        #Rule 1
                    TEMPORARY_DICTIONARY = self.deactivate(TEMPORARY_DICTIONARY, x, y)
                elif (TEMP == 2) or (TEMP == 3):    #Rule 2
                    pass
                elif TEMP > 3:                      #Rule 3
                    TEMPORARY_DICTIONARY = self.deactivate(TEMPORARY_DICTIONARY, x, y)
                else:
                    raise Exception("You found a bug, congratulation!")
        self.apply(SCREEN, TEMPORARY_DICTIONARY)    
    
    def apply(self, SCREEN, DICT):
        for x, y in  DICT:
            if self.SYSTEM[(x, y)] == True:
                pygame.draw.rect(SCREEN, RECT_COLOR, [(x*10), (y*10), 9, 9], 0)

main

import GOL_CORE as CORE
import pygame, time, random

MAIN_SYSTEM = CORE.GOL_CLASS(100)

pygame.init()

WIDTH, HEIGHT = 1000, 1000
screen = pygame.display.set_mode((WIDTH, HEIGHT))

RUNNING = True
while RUNNING:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            RUNNING = False

    MAIN_SYSTEM.step(screen)

    pygame.display.update()
    screen.fill([0, 0, 0])
    time.sleep(2)
pygame.quit()

当我试着做一个眼罩时,我发现了这个错误。如果你不知道那是什么,它是一个1乘3的旋转体。可悲的是,它总是以立方体结束。但是为什么呢?我改变了很多东西,重写了我所有的代码,但都不起作用


Tags: inselffalsetruefordictionaryreturnif
1条回答
网友
1楼 · 发布于 2024-09-29 03:37:26

TEMPORARY_DICTIONARY = self.SYSTEM不创建系统的副本。它只是创建对同一对象的引用。您必须创建数据的副本:

TEMPORARY_DICTIONARY = self.SYSTEM.copy()

执行算法后,副本是新系统(self.SYSTEM = TEMPORARY_DICTIONARY):

class GOL_CLASS:
    # [...]

    def step(self, SCREEN):
        TEMPORARY_DICTIONARY = self.SYSTEM.copy()
        for x, y in self.SYSTEM:
            TEMP = self.check(x, y)
            if self.SYSTEM[(x, y)] == False:
                if TEMP == 3:                       #Rule 4
                    TEMPORARY_DICTIONARY = self.activate(TEMPORARY_DICTIONARY, x, y)
            else:
                if TEMP < 2:                        #Rule 1
                    TEMPORARY_DICTIONARY = self.deactivate(TEMPORARY_DICTIONARY, x, y)
                elif (TEMP == 2) or (TEMP == 3):    #Rule 2
                    pass
                elif TEMP > 3:                      #Rule 3
                    TEMPORARY_DICTIONARY = self.deactivate(TEMPORARY_DICTIONARY, x, y)
                else:
                    raise Exception("You found a bug, congratulation!")
        self.SYSTEM = TEMPORARY_DICTIONARY
        self.apply(SCREEN)    
    
    def apply(self, SCREEN):
        for x, y in  self.SYSTEM:
            if self.SYSTEM[(x, y)] == True:
                pygame.draw.rect(SCREEN, RECT_COLOR, [(x*10), (y*10), 9, 9], 0)

另见Pygame is running game of life very slowlyGame of life

相关问题 更多 >