Почему переменная экземпляра Score не уменьшается, а должна в python - PullRequest
0 голосов
/ 18 июня 2020

Я начал изучать oop, и мне трудно заставить его делать то, что мне нужно. Я создаю простую игру, используя модуль черепахи, где кружок опускается, и каждый раз, когда круг выпадает с экрана, счет должен уменьшаться. Я добавляю функции стрельбы, настройки скорости и все такое. Но на данный момент я застрял на этом круге l oop.

Проблема в том, что счет не меняется правильно. У меня есть два класса Circle и Player. Оценка - это переменная экземпляра класса Player, но функция drop () в классе Circle подсчитывает счет.

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

import turtle as t
import random

class Circle:

    def __init__(self,size):
        self.size = size
        #self.speed = speed
        self.circle = t.Turtle()
        self.ypos = 300



    def size_color(self):
        self.circle.color('red')
        self.circle.shape('circle')
        self.circle.shapesize(self.size,self.size,1)

    #positions circle random x top y
    def posit(self):
        number = random.randint(-340,340)
        self.circle.ht()
        self.circle.penup()

        self.size_color()
        self.circle.goto(number,self.ypos)
        self.circle.st()


    #substracts from y position for falling effect
    #should substract from score as well
    def drop(self):
        self.posit()
        while True:

            self.ypos = self.ypos- 4
            self.circle.sety(self.ypos)
            if self.ypos <= -300:
                Player().score = Player().score - 10
                print(Player().score)
                self.ypos = 300
                self.posit()



class Player:
    def __init__(self,score=200):
        self.score = score

def display_screen():
    window = t.Screen()
    window.bgcolor('black')

display_screen()
c = Circle(2)
c.drop()

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Каждый раз, когда вы звоните Player(), вы создаете нового игрока. Итак, когда вы выполняете

Player().score = Player().score - 10
print(Player().score)

, это примерно эквивалентно:

temp_player1 = Player()
temp_player2 = Player()
temp_player1.score = temp_player2.score - 10
temp_player3 = Player()
print(temp_player3.score)

Как вы можете видеть из этого, есть 3 разных игрока, поэтому вы никогда не уменьшаете счет любого игрока, а затем вы печатаете счет другого игрока.

Вам нужно добавить атрибут player к Circle, тогда он может использовать self.player вместо того, чтобы каждый раз создавать нового игрока.

import turtle as t
import random

class Circle:

    def __init__(self,size):
        self.size = size
        #self.speed = speed
        self.circle = t.Turtle()
        self.ypos = 300
        this.player = Player()

    def size_color(self):
        self.circle.color('red')
        self.circle.shape('circle')
        self.circle.shapesize(self.size,self.size,1)

    #positions circle random x top y
    def posit(self):
        number = random.randint(-340,340)
        self.circle.ht()
        self.circle.penup()

        self.size_color()
        self.circle.goto(number,self.ypos)
        self.circle.st()

    #substracts from y position for falling effect
    #should substract from score as well
    def drop(self):
        self.posit()
        while True:
            self.ypos = self.ypos- 4
            self.circle.sety(self.ypos)
            if self.ypos <= -300:
                self.player.score = self.player.score - 10
                print(self.player.score)
                self.ypos = 300
                self.posit()

class Player:
    def __init__(self,score=200):
        self.score = score

def display_screen():
    window = t.Screen()
    window.bgcolor('black')

display_screen()
c = Circle(2)
c.drop()
0 голосов
/ 18 июня 2020

Бармар украл мой ответ. Используйте то, что он сказал, но не забудьте изменить this.player на self.player, поскольку он допустил крошечную ошибку, вероятно, из-за других языков программирования.

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