python - 为什么分数实例变量在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()
解决方案
每次打电话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()
推荐阅读
- c# - 使用 CancelIoEx 取消读取键也会中断下一次读取
- c# - 修改 WinForms Form1.resx 文件中的属性序列化/反序列化
- php - 重定向到 URL(通过标题)与在浏览器中复制粘贴 URL
- kdb - 在给定时间戳列表的情况下获得 asof 价格的最佳方式
- dynamics-365 - 在 Dynamics 365 中哪里可以找到业务中心 API 的环境名称
- javascript - 你如何让球弹到 Y 位置
- powershell - PowerShell 哈希表引用返回 null
- session - 通过 google-apps-script 获取 errorCode":"E0000005","errorSummary":"Invalid session"
- amazon-web-services - Sagemaker 上的自定义训练 Tensorflow:警告 keras.py:603 在使用 tf.function 前向传递期间无法保存层值
- python - Discord bot 命令有时有效