Различное поведение класса после импорта - PullRequest
1 голос
/ 06 апреля 2019

Я написал простую игру со змеями. Код здесь:

import pygame
import random
from collections import deque
import time

DISPLAY_WIDTH = 100
DISPLAY_HEIGHT = 100
HEAD_SIZE = 10
FOOD_SIZE = HEAD_SIZE
TAIL_SIZE = 5

BLACK = (0,0,0)
WHITE = (255,255,255)
ONE_MOVE = 5

pygame.init()
gameDisplay = pygame.display.set_mode((DISPLAY_WIDTH, DISPLAY_HEIGHT))
pygame.display.set_caption("Snake")
clock = pygame.time.Clock()


class Snake:
    def __init__(self):
        self.x = 0
        self.y = 0
        self.snake_lenght = 0
        self.tail = []
    def draw_head(self):
        pygame.draw.rect(gameDisplay, BLACK, [self.x, self.y, HEAD_SIZE, HEAD_SIZE])

    def draw_tail(self):
        self.tail.append([self.x, self.y])
        for i in self.tail:
            pygame.draw.rect(gameDisplay, BLACK, [int(i[0]), int(i[1]), TAIL_SIZE, TAIL_SIZE])

    def rise(self):
        foodx = random.randrange(ONE_MOVE, DISPLAY_WIDTH - ONE_MOVE, 5) # random food in a distance from the wall
        foody = random.randrange(ONE_MOVE, DISPLAY_HEIGHT - ONE_MOVE, 5)
        for i in self.tail:
            if foodx == i[0] and foody == i[1]: # avoid food in tail
                self.rise()
                break
        self.snake_lenght += 20
        return foodx, foody, self.snake_lenght


    def direction_of_movement(self, direction):
        if direction == "turn_right":
            return [ONE_MOVE, 0, 0, 0]

        elif direction == "turn_left":
            return [0, ONE_MOVE, 0, 0]

        elif direction == "turn_down":
            return [0, 0, ONE_MOVE, 0]

        elif direction == "turn_up":
            return [0, 0, 0, ONE_MOVE]

    def crash(self):    # restart game after failing
        time.sleep(2)
        self.game_loop()

    def game_loop(self):
        self.x = (DISPLAY_WIDTH * 0.5)
        self.y = (DISPLAY_HEIGHT * 0.5)
        start = 0
        self.snake_lenght = 10      # reset snake's lenght after calling game_loop again
        self.tail = deque([], maxlen=self.snake_lenght) 

        while True:

            if start == 0:                          # start to move
                speed = self.direction_of_movement("turn_right")
                foodx, foody, self.snake_lenght = self.rise()
                start += 1

            for event in pygame.event.get():        # quit if exit pressed
                if event.type == pygame.QUIT:
                    quit()

                if event.type == pygame.KEYDOWN:        # arrow navigation
                    if event.key == pygame.K_RIGHT:
                        speed = self.direction_of_movement("turn_right")

                    elif event.key == pygame.K_LEFT:
                        speed = self.direction_of_movement("turn_left")

                    elif event.key == pygame.K_DOWN:
                        speed = self.direction_of_movement("turn_down")

                    elif event.key == pygame.K_UP:
                        speed = self.direction_of_movement("turn_up")

            # game logic
            self.x += speed[0] #moving directions
            self.x -= speed[1]
            self.y += speed[2]
            self.y -= speed[3]

            if self.x < 0 or self.x + ONE_MOVE > DISPLAY_WIDTH: # hit into wall
                self.crash()

            elif self.y < 0 or self.y + ONE_MOVE > DISPLAY_HEIGHT:
                self.crash()

            for i in self.tail: # bite itself
                if self.x == i[0]:
                    if self.y == i[1]:
                        self.crash()

            if self.x == foodx and self.y == foody:
                foodx, foody, self.snake_lenght = self.rise()
                self.tail = deque(self.tail, maxlen=self.snake_lenght)


            # draw
            gameDisplay.fill(WHITE)
            self.draw_head()
            self.draw_tail()
            pygame.draw.rect(gameDisplay, BLACK, [foodx, foody, FOOD_SIZE, FOOD_SIZE])
            pygame.display.update()
            clock.tick(10) # game speed


snake = Snake()
snake.game_loop()

В другом файле я импортирую весь класс, добавляю константы и запускаю его. Ярлык:

from snake_file import Snake

class Snake_for_AI(Snake):
    def __init__(self):
        pass
    def trying(self):
        print("hey")

thing = Snake_for_AI()
thing.trying()

Вот мой вопрос. Это никогда не печатает "эй". Более того, он запускает game_loop и запускает игру, когда я создаю объект класса thing = Snake_for_AI, не нужно вызывать thing.game_loop(). Зачем? Любой обзор кода тоже очень ценится.

1 Ответ

2 голосов
/ 06 апреля 2019

При импорте вы выполните две строки внизу файла.Если это нежелательное поведение, окружите их следующим образом:

if __name__ == "__main__":
    snake = Snake()
    snake.game_loop()

Это приведет к их интерпретации только в том случае, если вы действительно запустите этот файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...