Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改类内的变量?用python_Python - Fatal编程技术网

如何更改类内的变量?用python

如何更改类内的变量?用python,python,Python,我已经开始编写一个空闲的游戏,但稍后我会输入一些类型的输入 我的问题是我的类库存没有将defchop/mine中的int添加到我的变量“SP_wood/SP_stone”,它只是将变量替换为它从defchop/mine获得的数字。我曾尝试将int直接指定给defaddwood/addstone,但这对我来说不起作用。+=应该可以工作,并将两者相加。我是否应该将变量置于类之外,并将其设为全局 import random import time idle = True class Taskass

我已经开始编写一个空闲的游戏,但稍后我会输入一些类型的输入

我的问题是我的
库存没有将
def
chop/mine中的
int
添加到我的
变量
“SP_wood/SP_stone”,它只是将
变量
替换为它从
def
chop/mine获得的数字。我曾尝试将int直接指定给
def
addwood/addstone,但这对我来说不起作用。
+=
应该可以工作,并将两者相加。我是否应该将
变量
置于
之外,并将其设为
全局

import random
import time
idle = True


class Taskassigner:
    def __init__(self, tasknum):
        self.tasknum = tasknum
    def choosejob(self):
        if self.tasknum == 1:
            self.chop()
        if self.tasknum == 2:
            self.mine()
    def chop(self):
        wood = random.randint(1, 10)
        print('chopping wood')
        time.sleep(1.5)
        print('you got', wood)
        Stockpile(wood, 0)
        time.sleep(0.75)
    def mine(self):
        stone = random.randint(1, 10)
        print('mining for stone')
        time.sleep(1.5)
        print('you got', stone)
        Stockpile(0, stone)
        time.sleep(0.75)

class Stockpile:
    def __init__(self, wood, stone):
        self.wood = wood
        self.stone = stone
        self.SP_wood = 0
        self.SP_stone = 0
        self.Addwood(self.wood)
        self.Addstone(self.stone)
        self.check_wood()
        self.check_stone()
    def Addwood(self, addwood):
        self.addwood = addwood
        self.SP_wood += self.addwood
    def Addstone(self, addstone):
        self.addstone = addstone
        self.SP_stone += self.addstone
    def check_wood(self):
        print(self.SP_wood)
    def check_stone(self):
        print(self.SP_stone)


while idle:
    taskchance = random.randint(0, 100)
    if taskchance < 50:
        tasknum = random.randint(0, 2)
        job = Taskassigner(tasknum)
        job.choosejob()

    else:
        print('idle')
        time.sleep(0.5)
随机导入
导入时间
空闲=真
类任务分配程序:
定义初始化(self,tasknum):
self.tasknum=tasknum
def choosejob(自我):
如果self.tasknum==1:
self.chop()
如果self.tasknum==2:
self.mine()
def印章(自我):
wood=random.randint(1,10)
打印(‘劈柴’)
时间。睡眠(1.5)
打印(“你得到了”,木头)
库存(木材,0)
睡眠时间(0.75)
def地雷(自我):
斯通=随机。随机数(1,10)
打印(‘为石头采矿’)
时间。睡眠(1.5)
打印(“你得到了”,斯通)
料堆(0,石)
睡眠时间(0.75)
类别储存:
定义初始(自身、木材、石头):
self.wood=木头
self.stone=石头
self.SP_wood=0
self.SP_stone=0
self.Addwood(self.wood)
self.Addstone(self.stone)
self.check_wood()
self.check_ústone()
def Addwood(self,Addwood):
self.addwood=addwood
self.SP_wood+=self.addwood
def Addstone(自身,Addstone):
self.addstone=addstone
self.SP_stone+=self.addstone
def检查(自身):
打印(self.SP_wood)
def检查石(自身):
打印(self.SP_stone)
空闲时:
taskchance=random.randint(01100)
如果taskchance<50:
tasknum=random.randint(0,2)
作业=任务指派者(tasknum)
job.choosejob()
其他:
打印(“空闲”)
睡眠时间(0.5)

您需要将库存分开(但您可能应该将其传递出去,而不是使其全球化)

随机导入
导入时间
空闲=真
类任务分配程序:
定义初始值(自我、任务数、库存):
self.tasknum=tasknum
self.stock=库存
def choosejob(自我):
如果self.tasknum==1:
self.chop()
如果self.tasknum==2:
self.mine()
def印章(自我):
wood=random.randint(1,10)
打印(‘劈柴’)
时间。睡眠(1.5)
打印(“你得到了”,木头)
自行储存添加木材(木材)
睡眠时间(0.75)
def地雷(自我):
斯通=随机。随机数(1,10)
打印(‘为石头采矿’)
时间。睡眠(1.5)
打印(“你得到了”,斯通)
自堆添加石头(石头)
睡眠时间(0.75)
类别储存:
定义初始(自身、木材、石头):
self.wood=木头
self.stone=石头
self.SP_wood=0
self.SP_stone=0
self.Addwood(self.wood)
self.Addstone(self.stone)
self.check_wood()
self.check_ústone()
def Addwood(self,Addwood):
self.addwood=addwood
self.SP_wood+=self.addwood
def Addstone(自身,Addstone):
self.addstone=addstone
self.SP_stone+=self.addstone
def检查(自身):
打印(self.SP_wood)
def检查石(自身):
打印(self.SP_stone)
玩家库存=库存(0,0)
空闲时:
taskchance=random.randint(01100)
如果taskchance<50:
tasknum=random.randint(0,2)
#一定要把玩家的储备传进来
作业=任务分配者(任务数量、玩家库存)
job.choosejob()
其他:
打印(“空闲”)
睡眠时间(0.5)

我想改变一些事情,主要是因为你让这件事变得更加困难。它看起来不像您的
任务分配程序
真的需要保持状态,所以让我们对它进行一些重构,使其基本上成为一个函数工厂。然后,让我们更改这些函数,以便它们可以在我们新重构的
stock
类上工作。但是封装工作做得很好

def taskassigner(tasknum):
    """Function factory for tasks

    taskassigner(1) --> mine
    taskassigner(2) --> chop
    """

    def mine(stockpile):
        stockpile.stone += random.randint(1,10)
    def chop(stockpile):
        stockpile.wood += random.randint(1,10)

    tasks = [None, chop, mine]
    return tasks[tasknum]

class Stockpile(object):
    def __init__(self, wood, stone):
        self.wood = wood
        self.stone = stone
        # it's not really clear what SP_wood and SP_stone do
        # so I'm not sure if you actually need them!
由于
taskassigner
现在是一个函数工厂而不是一个类,因此我们的调用签名看起来也有点不同

STARTING_WOOD, STARTING_STONE = 10, 10  # or whatever...
idle = True

player_stockpile = Stockpile(STARTING_WOOD, STARTING_STONE)
while idle:
    if random.randint(0, 1):  # since it's a coinflip, this is easier
        task_num = random.randint(1, 2)
        task = taskassigner(task_num)  # task is now one of your functions
        task(player_stockpile)
    else:
        time.sleep(0.5)
尽管如此,您似乎应该使用单独的模块来实现这一点

# /main.py
import tasks
import time

STARTING_STONE, STARTING_WOOD = 10, 10
idle = True


class Stockpile(object):
    # defined as above


player_stockpile = Stockpile(STARTING_WOOD, STARTING_STONE)
while idle:
    if random.choice((True, False)):
        task = random.choice(tasks.tasklist)
        task(player_stockpile)
    else:
        time.sleep(0.5)


这是一个非常好的代码,用于14 y/o,请继续:)欢迎使用SO和编码!我对这个问题做了一些清理,确保我没有删掉任何重要的内容。谢谢。对不起,如果我有点违反规则,我应该先读一读。(如果有的话)另外,问题可以是更详细的描述,可能类似于“如何访问python类中的变量并增加变量”。请注意,
random.randint
包括两个端点,因此您可能认为coinflip实际上是向“No”加权的<你能告诉我你在那里做了什么吗?我不明白。对不起,玩家储备在循环前初始化。。。然后传给任务分配者。。。每次你只是在现有的库存中添加木头或石头,而不是创建一个新的库存,那么我还需要库存类吗?如果是这样,为什么?哈哈,显然我真的需要去吃点东西。。。我的大脑正在关闭:Pit说没有名为tasks的模块。我搞不清楚我该做什么?你能帮我一下吗?每个底部代码片段顶部的注释行都是文件名。如果你有一些根目录
../
,你应该有
../main.py
导入
任务
,也就是
../tasks.py
你能帮我把它们都放在一个大段落里吗?我不明白,非常感谢你。我喜欢你对我的想法所做的。
# /main.py
import tasks
import time

STARTING_STONE, STARTING_WOOD = 10, 10
idle = True


class Stockpile(object):
    # defined as above


player_stockpile = Stockpile(STARTING_WOOD, STARTING_STONE)
while idle:
    if random.choice((True, False)):
        task = random.choice(tasks.tasklist)
        task(player_stockpile)
    else:
        time.sleep(0.5)
# /tasks.py
def mine(stockpile):
    stockpile.stone += random.randint(1,10)

def chop(stockpile):
    stockpile.wood += random.randint(1,10)

tasklist = [mine, chop]