需要使用线程将倒数计时器添加到游戏中

Need to Add Countdown Timer to Game using threads

提问人:Demeridianth 提问时间:10/28/2023 最后编辑:Demeridianth 更新时间:10/28/2023 访问量:58

问:

我在python上写了一个简单的骰子游戏,我想为它实现一个倒数计时器!这是一个无休止的循环!也许是某种线程生成器?我是线程模块的新手。

如果我尝试为每个玩家向游戏添加两个线程:我会收到“RuntimeError: threads can only be started once”错误

import random
import os
import time
from threading import Thread


class Player:
    def __init__(self, name) -> None:
        self.name = name
        self.score = 0

    def add_points(self, points):
        self.score += points


def roll_dice():
    min_val = 1
    max_val = 6
    dice_value = random.randint(min_val, max_val)
    return dice_value

这是我的倒计时时间


def countdown(user_time):
    while user_time >= 0 and not done:
        mins, secs = divmod(user_time, 60)
        timer = '{:02d}:{:02d}'.format(mins, secs)
        print(timer, end='\r')
        time.sleep(1)
        user_time -= 1

关键是:如果玩家不停止倒计时,他就输了


player1_name = input('enter name: ')
player2_name = input('enter name: ')
player1 = Player(player1_name)
player2 = Player(player2_name)
roll_again = 'y'



if __name__ == '__main__':
    while roll_again.lower() == 'yes' or roll_again.lower() == 'y':
        os.system('cls' if os.name == 'nt' else 'clear')


        """ Player 1 """

        print(f'Hurry up {player1_name}')

        # new thread generated here

        input('press enter to stop\n')

如果玩家没有用输入打断倒计时 - 游戏结束

        done = True
        # thread join
        player1_roll = roll_dice()
        player1.add_points(player1_roll)
        print(f'{player1.name} has {player1.score}')



        """ Player 2 """

        print(f'Hurry up {player2_name}')

        # new thread generated here

        input('press enter to stop\n')
        done = True
        #thread join
        player2_roll = roll_dice()
        player2.add_points(player2_roll)
        print(f'{player2.name} has {player2.score}')

        if player1.score >= 30:
            print(f'game over: {player1_name} has won')
            break
        elif player2.score >= 30:
            print(f'game over: {player2_name} has won')
            break

        roll_again = input('Roll Again? ')

Python 多线程 循环 while 循环

评论

1赞 Erdit 10/28/2023
您的问题几乎是基本的多线程。在“while roll_again...”中,在每次迭代中,您只需创建一个线程,该线程调用一个使用计数器进行倒计时的函数。这篇文章可以帮助你:如何制作一个在后台运行的倒数计时器,当程序用完时终止程序? - 如果你只是学习多线程在 Python 中的工作原理,你就可以让你的程序工作。
0赞 Demeridianth 10/28/2023
@Erdit我已经尝试过了,但是当第二次迭代到来时,程序使用相同的线程并且: RuntimeError:线程只能启动一次!!弹出
0赞 Erdit 10/28/2023
在 python 中,线程一旦启动并完成就无法重新启动,您需要在 while 循环的每次迭代中为每个玩家创建一个新对象。如果您尝试过此操作但没有奏效,请在上面发布您的代码。Thread
0赞 Demeridianth 10/29/2023
@Erdit我试过了,但没有成功。实际上,这正是我要问的。(也许这个问题的措辞错误)如何在 while 循环的每次迭代中为每个玩家创建一个新的 Thread 对象????(我猜写一个可以做到这一点的函数,但我不知道怎么做)
0赞 Carl HR 10/30/2023
您想将该计时器用于什么?打印“花了太多时间,现在轮到你的对手了”?或者也许结束游戏?在我看来,除非您可以在调用 .请记住,input 是一个阻塞函数,它将停止应用程序,直到用户在 stdin 上键入内容并按 Enter。因此,即使您有一个计时器(在另一个线程或相同的线程中),如果您没有办法取消阻止输入调用,计时器也毫无意义。input

答: 暂无答案