Próbuję zakodować atak na tekstową grę przygodową, w której gracz może zadawać obrażenia mieczem. W konsoli wyświetlana jest losowa liczba, a gracz musi wpisać tę liczbę tak szybko, jak to możliwe. Im szybciej to robią, tym więcej zadają obrażeń. Jak dotąd mam to:

import random
import time
from threading import Timer


def damage(timeAmount, baseDamage):
    damageTotal = baseDamage - timeAmount


def sword():
    t = 0
    timerAmount = 0
    randomNumber = random.randint(0, 1000000)
    print('Type the following as fast as you can: \n' + str(randomNumber))
    swordAttack = input('> ')
    while t == 0:
        timerAmount = timerAmount + 1
        time.sleep(1)
        if swordAttack == randomNumber:
            t = 1
            damage(timerAmount, 10)
            print(timerAmount)


sword()

Pierwszą kwestią jest to, że nie mogę wymyślić, jak ustawić licznik czasu, aby zliczał, a następnie uzyskać ten ostatni czas do użycia w formułach obrażeń. Funkcja timera z wątków tylko odlicza w dół i nie mogłem wymyślić, jak dokładnie to przepracować, chociaż gdybyś mógł mi to wyjaśnić w prostych słowach, może to zadziałać.

Drugą kwestią jest to, że muszę to również zrobić, aby licznik czasu aktywował się, gdy tylko dane wejściowe zostaną wyświetlone na ekranie, ale po uruchomieniu instrukcji wejściowej zatrzymuje kod do momentu podania danych wejściowych.

0
Herobrine 20 listopad 2019, 18:21
Może zmierz czas na początku - start = time.time() - i na końcu - end = time.time() - i oblicz end - start, aby uzyskać, ile czasu to zajmie.
 – 
furas
20 listopad 2019, 18:34
Jeśli musisz użyć input() z inną rzeczą, musisz uruchomić input() lub inną rzecz w oddzielnym wątku.
 – 
furas
20 listopad 2019, 18:36

1 odpowiedź

Ok, więc spróbuję w sposób, który wykorzystuje licznik czasu. Jeśli i tak masz obrażenia miecza równe 10, nie ma potrzeby przechodzenia przez 10 do „negatywów”, po prostu wyniesie 0, więc po prostu odlicz od tego, jakie są obrażenia mieczy. Więc jeśli wpiszą to w 2 sekundy, w tym przypadku będzie to 8 obrażeń. Oto kod, który mam do pracy przy użyciu odliczania. Wszystko, co musisz zrobić, to ustawić licznik czasu na jakiekolwiek obrażenia mieczy.

import random
import time
from threading import Timer


def damage(timeAmount, baseDamage):
    damageTotal = baseDamage - timeAmount
    print(format(damageTotal, '.0f'))


def sword():
    user_sword_max_damage = 10
    randomNumber = random.randint(0, 10)
    timeout = user_sword_max_damage
    t = Timer(timeout, print, ['Damage dealt = 0'])
    start_time = time.time()
    t.start()
    while True:
        try:
            prompt = int(input('Enter ' + str(randomNumber) + ' as fast as you can: '))
            if prompt == randomNumber:
                t.cancel()
                final_time = time.time()-start_time
                print(format(final_time, '.0f'))
                damage(final_time, user_sword_max_damage)
                break
            elif prompt != randomNumber:
                continue
        except:
            continue
sword()

Może to również potencjalnie wskazać ci właściwy kierunek, jeśli później dodasz więcej przedmiotów obrażeń. Jedyną częścią, której nie dodałem, jest logika ustawiania wartości szkody ogółem na 0, jeśli skończy się czas, który powinieneś być w stanie umieścić w instrukcji if w pętli while (bądź uprzejmy, to moja pierwsza próba odpowiedzi ha, ale Mam nadzieję, że to pomoże)

0
David Sorrell 20 listopad 2019, 19:24