【问题标题】:Is there a way to access my guesses_left variable from the TimeToGuess class for when I need to check if they run out of guesses有没有办法从 TimeToGuess 类访问我的guesses_left 变量,以便我需要检查它们是否用完猜测
【发布时间】:2019-11-08 16:22:02
【问题描述】:

我正在 Kivy 中构建一个基本的猜谜游戏应用程序来学习它的基础知识,但还没有完全理解它。当我进入下一个屏幕(TimeToGuess)时,我需要访问guesses_left,以便在我编写删除猜测的逻辑时,如果他们猜错了,如果他们用完最终会失败。

我已经尝试将 TimeToGuess 类属性设置为 Guesses 以便以这种方式访问​​它,但是在按钮释放上使用 canvas.clear() 也切换到 TimeToGuess 对我不起作用。

这里是python文件代码:

from kivy import *
import random
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import ScreenManager, Screen

guesses_left = int()
computer_num = random.randint(1, 10)
user_guess = int()

class WannaPlay(Screen):
    pass


class Guesses(Screen):
    guesses_left = int()


class TimeToGuess(Screen):
        def user_is_guessing(self):
        if user_guess != computer_num:
            guesses_left -= 1


class Winner(Screen):
    pass


class Loser(Screen):
    pass


class ScreenManage(ScreenManager):
    pass


kv = Builder.load_file('guessinggame.kv')


class GuessingGameApp(App):
    def build(self):
        return kv


if __name__ == '__main__':
    GuessingGameApp().run()

和.kv:

ScreenManage:
    WannaPlay:
    Guesses:
    TimeToGuess:
    Winner:
    Loser:


<WannaPlay>:
    name: 'start'
    GridLayout:
        cols: 1

        Label:
            text: 'Want to Play the Guessing Game?'

        GridLayout:
            cols: 2

            Button:
                name: 'yes'
                text: 'Yes'
                on_release:
                    root.manager.transition.duration = 0
                    root.manager.current = 'guess_choice'

            Button:
                name: 'no'
                text: 'No'
                on_release:
                    app.stop()


<Guesses>
    name: 'guess_choice'
    id: guesses_choice
    GridLayout:
        cols: 1

        Label:
            text: 'How Many Guesses Would You Like?'

        GridLayout:
            cols: 4

            Button:
                name: 'guess_amount_one'
                text: '1'
                on_release:
                    root.manager.transition.duration = 0
                    root.manager.current = 'time_to_guess'
                    guesses_left = 1
                    print(guesses_left)



            Button:
                name: 'guess_amount_two'
                text: '2'
                on_release:
                    root.manager.transition.duration = 0
                    root.manager.current = 'time_to_guess'
                    guesses_left = 2
                    print(guesses_left)

            Button:
                name: 'guess_amount_three'
                text: '3'
                on_release:
                    root.manager.transition.duration = 0
                    root.manager.current = 'time_to_guess'
                    guesses_left = 3
                    print(guesses_left)

            Button:
                name: 'guess_amount_four'
                text: '4'
                on_release:
                    root.manager.transition.duration = 0
                    root.manager.current = 'time_to_guess'
                    guesses_left = 4
                    print(guesses_left)


<TimeToGuess>
    name: 'time_to_guess'
    GridLayout:
        cols: 1

        Label:
            text: 'Guess a number between 1 and 10'

        GridLayout:
            cols: 5

            Button:
                name: 'guess_1'
                text: '1'
            Button:
                name: 'guess_2'
                text: '2'
            Button:
                name: 'guess_3'
                text: '3'
            Button:
                name: 'guess_4'
                text: '4'
            Button:
                name: 'guess_5'
                text: '5'
            Button:
                name: 'guess_6'
                text: '6'
            Button:
                name: 'guess_7'
                text: '7'
            Button:
                name: 'guess_8'
                text: '8'
            Button:
                name: 'guess_9'
                text: '9'
            Button:
                name: 'guess_10'
                text: '10'

提前感谢您的帮助

这是更新的代码,以显示检查的答案实际上如何帮助解决至少该问题(我相信我会遇到更多问题。哈哈)

Python 代码:

from kivy import *
import random
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import ScreenManager, Screen

guesses_left = int()
user_guess = int()
computer_num = random.randint(1, 10)


class WannaPlay(Screen):
    pass


class Guesses(Screen):
    pass


def user_is_guessing(guesses_amount=guesses_left, computer_num=computer_num):
    if user_guess != computer_num and guesses_amount == 0:
        #subtract from  guesses_left go to lose page
        pass
    elif guesses_amount == computer_num:
        #go to win page
        pass
    elif guesses_amount != computer_num:
        #subtract from guesses_left and have the user guess again
        pass


class TimeToGuess(Screen):
    pass


class Winner(Screen):
    pass


class Loser(Screen):
    pass


class ScreenManage(ScreenManager):
    pass


kv = Builder.load_file('guessinggame.kv')


class GuessingGameApp(App):
    def build(self):
        return kv


if __name__ == '__main__':
    GuessingGameApp().run()

.kv:

ScreenManage:
    WannaPlay:
    Guesses:
    TimeToGuess:
    Winner:
    Loser:


<WannaPlay>:
    name: 'start'
    GridLayout:
        cols: 1

        Label:
            text: 'Want to Play the Guessing Game?'

        GridLayout:
            cols: 2

            Button:
                name: 'yes'
                text: 'Yes'
                on_release:
                    root.manager.transition.duration = 0
                    root.manager.current = 'guess_choice'

            Button:
                name: 'no'
                text: 'No'
                on_release:
                    app.stop()


<Guesses>
    name: 'guess_choice'
    id: guesses_choice
    GridLayout:
        cols: 1

        Label:
            text: 'How Many Guesses Would You Like?'

        GridLayout:
            cols: 4

            Button:
                name: 'guess_amount_one'
                text: '1'
                on_release:
                    root.manager.transition.duration = 0
                    root.manager.current = 'time_to_guess'
                    guesses_left = 1
                    print(guesses_left)



            Button:
                name: 'guess_amount_two'
                text: '2'
                on_release:
                    root.manager.transition.duration = 0
                    root.manager.current = 'time_to_guess'
                    guesses_left = 2
                    print(guesses_left)

            Button:
                name: 'guess_amount_three'
                text: '3'
                on_release:
                    root.manager.transition.duration = 0
                    root.manager.current = 'time_to_guess'
                    guesses_left = 3
                    print(guesses_left)

            Button:
                name: 'guess_amount_four'
                text: '4'
                on_release:
                    root.manager.transition.duration = 0
                    root.manager.current = 'time_to_guess'
                    guesses_left = 4
                    print(guesses_left)


<TimeToGuess>
    name: 'time_to_guess'
    GridLayout:
        cols: 1

        Label:
            text: 'Guess a number between 1 and 10'

        GridLayout:
            cols: 5

            Button:
                name: 'guess_1'
                text: '1'
            Button:
                name: 'guess_2'
                text: '2'
            Button:
                name: 'guess_3'
                text: '3'
            Button:
                name: 'guess_4'
                text: '4'
            Button:
                name: 'guess_5'
                text: '5'
            Button:
                name: 'guess_6'
                text: '6'
            Button:
                name: 'guess_7'
                text: '7'
            Button:
                name: 'guess_8'
                text: '8'
            Button:
                name: 'guess_9'
                text: '9'
            Button:
                name: 'guess_10'
                text: '10'

【问题讨论】:

    标签: python python-3.x kivy kivy-language


    【解决方案1】:

    我有一段时间没有接触 Kivy,所以我不完全确定这是否可行,但如果遵守基本的 OOP,那么这应该可行。

    您可以在特定类之外声明guesses_left 变量,使其可供所有类访问。即:

    from kivy import *
    import random
    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.screenmanager import ScreenManager, Screen
    
    # Initilize here
    guesses_left = int()
    
    class WannaPlay(Screen):
        pass
    
    
    class Guesses(Screen):
        # instead of here
        pass
    
    
    class TimeToGuess(Screen):
        pass
    
    
    class Winner(Screen):
        pass
    
    
    class Loser(Screen):
        pass
    
    
    class ScreenManage(ScreenManager):
        pass
    
    
    kv = Builder.load_file('guessinggame.kv')
    
    
    class GuessingGameApp(App):
        def build(self):
            return kv
    
    
    if __name__ == '__main__':
        # Or initilize here
        # guesses_left = int()
        GuessingGameApp().run()
    

    如果这不起作用,请发表评论,我会在可能的情况下进一步研究。

    【讨论】:

    • 好的,起初这似乎有点工作,但现在它不允许我在函数中回调该变量,这就是现在开始出现问题的地方。我已经更新了上面的代码以反映这一点
    • 您尝试从哪个“函数”调用它,错误消息是什么?
    • 我实际上认为我解决了我的问题,这要归功于这个问题,并感谢 pycharm 关于我应该做什么的小提示。我非常感谢您的帮助!我将添加评论以显示我目前所做的事情
    【解决方案2】:

    这是更新的代码,以显示上述答案实际上如何帮助解决至少该问题(我相信我会遇到更多问题。哈哈)

    Python 代码:

    from kivy import *
    import random
    from kivy.app import App
    from kivy.lang import Builder
    from kivy.uix.floatlayout import FloatLayout
    from kivy.uix.gridlayout import GridLayout
    from kivy.uix.screenmanager import ScreenManager, Screen
    
    guesses_left = int()
    user_guess = int()
    computer_num = random.randint(1, 10)
    
    
    class WannaPlay(Screen):
        pass
    
    
    class Guesses(Screen):
        pass
    
    
    def user_is_guessing(guesses_amount=guesses_left, computer_num=computer_num):
        if user_guess != computer_num and guesses_amount == 0:
            #subtract from  guesses_left go to lose page
            pass
        elif guesses_amount == computer_num:
            #go to win page
            pass
        elif guesses_amount != computer_num:
            #subtract from guesses_left and have the user guess again
            pass
    
    
    class TimeToGuess(Screen):
        pass
    
    
    class Winner(Screen):
        pass
    
    
    class Loser(Screen):
        pass
    
    
    class ScreenManage(ScreenManager):
        pass
    
    
    kv = Builder.load_file('guessinggame.kv')
    
    
    class GuessingGameApp(App):
        def build(self):
            return kv
    
    
    if __name__ == '__main__':
        GuessingGameApp().run()
    

    .kv:

    ScreenManage:
        WannaPlay:
        Guesses:
        TimeToGuess:
        Winner:
        Loser:
    
    
    <WannaPlay>:
        name: 'start'
        GridLayout:
            cols: 1
    
            Label:
                text: 'Want to Play the Guessing Game?'
    
            GridLayout:
                cols: 2
    
                Button:
                    name: 'yes'
                    text: 'Yes'
                    on_release:
                        root.manager.transition.duration = 0
                        root.manager.current = 'guess_choice'
    
                Button:
                    name: 'no'
                    text: 'No'
                    on_release:
                        app.stop()
    
    
    <Guesses>
        name: 'guess_choice'
        id: guesses_choice
        GridLayout:
            cols: 1
    
            Label:
                text: 'How Many Guesses Would You Like?'
    
            GridLayout:
                cols: 4
    
                Button:
                    name: 'guess_amount_one'
                    text: '1'
                    on_release:
                        root.manager.transition.duration = 0
                        root.manager.current = 'time_to_guess'
                        guesses_left = 1
                        print(guesses_left)
    
    
    
                Button:
                    name: 'guess_amount_two'
                    text: '2'
                    on_release:
                        root.manager.transition.duration = 0
                        root.manager.current = 'time_to_guess'
                        guesses_left = 2
                        print(guesses_left)
    
                Button:
                    name: 'guess_amount_three'
                    text: '3'
                    on_release:
                        root.manager.transition.duration = 0
                        root.manager.current = 'time_to_guess'
                        guesses_left = 3
                        print(guesses_left)
    
                Button:
                    name: 'guess_amount_four'
                    text: '4'
                    on_release:
                        root.manager.transition.duration = 0
                        root.manager.current = 'time_to_guess'
                        guesses_left = 4
                        print(guesses_left)
    
    
    <TimeToGuess>
        name: 'time_to_guess'
        GridLayout:
            cols: 1
    
            Label:
                text: 'Guess a number between 1 and 10'
    
            GridLayout:
                cols: 5
    
                Button:
                    name: 'guess_1'
                    text: '1'
                Button:
                    name: 'guess_2'
                    text: '2'
                Button:
                    name: 'guess_3'
                    text: '3'
                Button:
                    name: 'guess_4'
                    text: '4'
                Button:
                    name: 'guess_5'
                    text: '5'
                Button:
                    name: 'guess_6'
                    text: '6'
                Button:
                    name: 'guess_7'
                    text: '7'
                Button:
                    name: 'guess_8'
                    text: '8'
                Button:
                    name: 'guess_9'
                    text: '9'
                Button:
                    name: 'guess_10'
                    text: '10'
    

    【讨论】:

    • 您可能应该将此添加到问题的底部,作为对问题的编辑,以便人们稍后查看时更容易理解。引用诸如“上述答案”之类的内容会随着时间而变化,因为可能会出现不同的答案,被投票等。您可以将我的答案简单地引用为“标记的答案”或@TopherBuckley 的答案。干杯!
    • 会的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2020-10-24
    • 2011-02-21
    • 1970-01-01
    相关资源
    最近更新 更多