首页 > 解决方案 > 为什么分数实例变量在python中应该减少时没有减少

问题描述

我已经开始学习 oop 并且我很难让它做我需要的事情。我正在使用海龟模块构建一个简单的游戏,其中一个圆圈被丢弃,每次圆圈从屏幕上掉下来时,分数应该会降低。我将添加射击功能和速度配置等等。但目前我被困在这个循环中。

问题是分数没有正确改变。我有两个班级 Circle 和 Player。分数是 Player 类的实例变量,但 Circle 类中的 drop() 函数会统计分数。

我可以使用程序化的编程风格使其工作,但 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()

标签: pythonoopvariables

解决方案


每次打电话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()

推荐阅读