【问题标题】:How do I keep track of score increments in Python?如何在 Python 中跟踪分数增量?
【发布时间】:2013-08-29 17:01:02
【问题描述】:

我正在用 Python 编写一个简单的游戏程序,提示用户从杂货店的“健康”和“不健康”商品中进行选择。用户每次选择健康项目时,他们的“健康评分(最初为 100)都会上升。每次他们从不健康的项目中选择时,他们的评分都会下降。

我的代码在初始健康评分 100 中加减,但在每次选择后不跟踪最新的评分。我想在每次交易后给用户他们的新总数(new_hscore)和最后的总数(final_score),但我不知道该怎么做。

列表完成了吗?我使用 .append 吗?任何帮助将不胜感激!提前致谢!

这是我的代码:http://pastebin.com/TvyURsMb

当您向下滚动到“def inner():”函数时,您可以立即看到我正在尝试执行的操作。

编辑:我让它工作了!感谢所有贡献的人。我学到了很多。我最后的“记分”工作代码在这里:http://pastebin.com/BVVJAnKa

【问题讨论】:

  • 您的问题不清楚。你想给用户他们的最高分吗?或者他们获得的所有分数的历史?
  • @bitgarden - 我认为他的意思是他想在比赛结束时给出任何剩余的数字。所以,如果我从 100 开始,输 20,获得 30,然后结束游戏,他希望它返回 110。
  • @bitgarden - 是的,我想在每次交易后给他们新的总数(new_hscore)和最后的总数(final_score)。

标签: python python-2.7 pygame


【解决方案1】:

你可以做一些简单的事情:

hp_history = [10]

def initial_health():
    return hp_history[0]

def cur_health():
    return hp_history[-1]

def affect_health(delta):
    hp_history.append(cur_health() + delta)
    return cur_health()

演示:

>>> cur_health()
10
>>> affect_health(20)
30
>>> affect_health(-5)
25
>>> affect_health(17)
42
>>> cur_health()
42
>>> print hp_history
[10, 30, 25, 42]

【讨论】:

  • 太棒了!这段代码工作得很好 --> +1 我唯一需要修改的是'“你的新健康分数是:%d”% cur_score'到'你的新健康分数是:',cur_score()'因为它期待一个变量而不是一个定义。非常感谢,克劳迪乌!
【解决方案2】:

您不能像那样存储模块级变量。任何写入该变量的尝试都将创建一个局部变量。检查此脚本的行为:

s = 0
def f():
    s = 10
    print s

f()
print s

输出:

10
0

相反,您应该转向面向对象的方法。开始将您的代码放在一个类中:

class HeathlyGame():

    def __init__(self):
        self.init_hscore = 100
        self.final_score = 0

    # Beginning. Proceed or quit game.
    def start(self):
            print "Your shopping habits will either help you live longer or they will help you die sooner. No kidding! Wanna find out which one of the two in your case?", yn

            find_out = raw_input(select).upper()

...

game = HeathlyGame()
game.start()

这将允许您一次在内存中创建游戏的多个版本,并且每个版本都可以存储自己的分数副本。

有关课程的更多信息,请尝试此链接:http://en.wikibooks.org/wiki/A_Beginner%27s_Python_Tutorial/Classes

【讨论】:

    【解决方案3】:

    问题似乎是你总是从init_hp开始,忘记了你的cur_hp在做什么

    init_hp = 10
    while True:
        food = choose_food()
        if "cereal" in food:
            cur_hp = init_hp - 5
    
    # ..
    

    但你需要:

    init_hp = 10
    cur_hp = init_hp
    
    while True:
        food = choose_food()
        if "cereal" in food:
            cur_hp -= 5
    
    # ..
    

    【讨论】:

    • Monkey,这将是一个非常好的解决方案(而且可能是),但我一定做错了什么......当我尝试它时,我得到“局部变量 'cur_hp' 在赋值之前引用” .
    【解决方案4】:

    您可以使用生成器!

    生成器基本上是一个函数,即使在您离开该函数并再次调用它之后,它也会跟踪其对象的状态。而不是使用'return'和结束,你使用'yield'。试试这样的:

    def HealthScore(add):
        score = 100
        while 1:
            score += add
            yield score
    

    如果您调用 HealthScore(-5),它将返回 95。如果您随后调用 HealthScore(5),它将返回 100。

    【讨论】:

    • @CMDoolitle - 我喜欢生成器的想法。但是,当我尝试这样调用当前分数时: print "Your starting Health Score is: %d" % HealthScore(0) 它告诉我“..a number is required not a generator”。换句话说,如何将 HealthScore() 设置为变量?当我尝试“%分数”时,它告诉我“分数”没有定义。很抱歉这个基本问题 :-) 而且,非常感谢您的帮助!!!
    • 是的,这是出乎意料的......你能不能去 var = HealthScore(8) print "%d" % var ?
    • 所有事情都考虑到了,如果你不知道如何使用类,你需要。
    • 好像是这样。我正在从 Zed Shaw 的 Learn Python The Hard Way 中学习 Python,我正在上一节课,我必须创建自己的游戏。 “模块、类和对象”课是前面三课。我还会查看下面的@DrRobotNinja 链接。
    • 嗯这不是真正的发电机的地方
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    相关资源
    最近更新 更多