【问题标题】:Using threading to create a game in python在python中使用线程创建游戏
【发布时间】:2019-01-10 03:43:21
【问题描述】:

我正在尝试创建一个滚动条(游戏中玩家似乎跑了无限距离直到他们死去)。

我知道存在库和模块(例如pygame),这使得创建游戏变得更加容易,但我试图在没有任何外部模块的情况下做到这一点。我正在控制台窗口中运行我的代码。

我的代码:

import os, time, threading, keyboard

key = False
def checkForJump(i, key, character):
    while True:
        if key:
            character = " xo                                                                                                                     "
            print(character)
            key = False
        time.sleep(0.05)
        i, character = printScreen(i, character)


i = 1
character = "  x                                                                                                                     "
def printScreen(i, character):

    sky1 =  "               *                                       *                               oooo                (())         "
    sky2 = "                           ____                                                     oooo                *                "
    space1 = "                                                                                                                        "
    space2 = "                                                                                                                        "

    land = "------------------------------------------------------------------------------------------------------------------------"


    os.system("cls")
    print((sky1[i:] + sky1[:i] +  "\n" + sky2[i:] + sky2[:i] + "\n") * 3)
    print("\n\n")
    print(space1)
    print(space2)
    print(character)
    print(land)
    i += 1
    i = i % 120

    return i, character


t = threading.Thread(target=checkForJump, args=(i, key, character))
t.daemon = True
t.start()

while True:
    key = keyboard.is_pressed('q')

我的问题:我正在使用线程(我完全是初学者),因为我需要在检查任何用户输入时保持背景移动。在这种情况下,我正在检查是否按下了“q”。如果是,我希望我的角色变成“xo”而不是“x”。但是,当我按“q”时,没有任何变化。

【问题讨论】:

    标签: python multithreading console keyboard


    【解决方案1】:

    问题是您将key 作为参数传递给checkForJump 函数,该函数为该函数制作key 的本地副本,因此在checkForJump 中key 始终为False。您应该访问全局键变量:

    import os, time, threading, keyboard
    
    key = False
    def checkForJump(i, character):
        global key
        while True:
            if key:
                character = " xo                                                                                                                     "
                print(character)
                key = False
            time.sleep(0.05)
            i, character = printScreen(i, character)
    
    
    i = 1
    character = "  x                                                                                                                     "
    def printScreen(i, character):
    
        sky1 =  "               *                                       *                               oooo                (())         "
        sky2 = "                           ____                                                     oooo                *                "
        space1 = "                                                                                                                        "
        space2 = "                                                                                                                        "
    
        land = "------------------------------------------------------------------------------------------------------------------------"
    
    
        os.system("cls")
        print((sky1[i:] + sky1[:i] +  "\n" + sky2[i:] + sky2[:i] + "\n") * 3)
        print("\n\n")
        print(space1)
        print(space2)
        print(character)
        print(land)
        i += 1
        i = i % 120
    
        return i, character
    
    
    t = threading.Thread(target=checkForJump, args=(i, character))
    t.daemon = True
    t.start()
    
    while True:
        key = keyboard.is_pressed('q')
    

    虽然这应该适用于这个简单的示例,但使用全局变量在线程之间传递消息并不是一个好主意,而且很容易变得混乱。您可能想看看queue library,这是一种更好的线程间通信方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 2015-01-22
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      相关资源
      最近更新 更多