9

Just like in the movies and in games, the location of a place comes up on screen as if it's being typed live. I want to make a game about escaping a maze in python. At the start of the game it gives the background information of the game:

line_1 = "You have woken up in a mysterious maze"
line_2 = "The building has 5 levels"
line_3 = "Scans show that the floors increase in size as you go down"

Under the variables, I tried to do a for loop for each line similar to this:

from time import sleep

for x in line_1:
    print (x)
    sleep(0.1)

The only problem with this is that it print one letter per line. The timing of it is ok, but how can I get it to go on one line?

0

8 Answers 8

14

Because you tagged your question with python 3 I will provide a python 3 solution:

  1. Change your end character of print to an empty string: print(..., end='')
  2. Add sys.stdout.flush() to make it print instantly (because the output is buffered)

Final code:

from time import sleep
import sys

for x in line_1:
    print(x, end='')
    sys.stdout.flush()
    sleep(0.1)

Making it random is also very simple.

  1. Add this import:

    from random import uniform
    
  2. Change your sleep call to the following:

    sleep(uniform(0, 0.3))  # random sleep from 0 to 0.3 seconds
    
Sign up to request clarification or add additional context in comments.

1 Comment

An alternative is print(x, end='', flush=True). It's a bit easier to read.
13
lines = ["You have woken up in a mysterious maze",
         "The building has 5 levels",
         "Scans show that the floors increase in size as you go down"]

from time import sleep
import sys

for line in lines:          # for each line of text (or each message)
    for c in line:          # for each character in each line
        print(c, end='')    # print a single character, and keep the cursor there.
        sys.stdout.flush()  # flush the buffer
        sleep(0.1)          # wait a little to make the effect look good.
    print('')               # line break (optional, could also be part of the message)

9 Comments

The comma will add a space between characters
Not in Python3, it won't. And the question is tagged python3.
For me, it doesn't make a difference, and when I use NPE's answer to shorten the amount of code, it prints each line with the delay.
Made it loop the lines for you.
I tested this on Python 3.4.3 / Ubuntu Linux, and observed that 1) all the output is glued together, with no line breaks or other whitespace between the lines, and 2) no output actually appears before the program exits, presumably because Python is buffering the printed text. You might want to fix these issues.
|
1

To iterate over the lines, change the loop to:

for x in (line_1, line_2, line_3):

2 Comments

Thank you, that will save me a lot of time when writing the loops.
or possibly for x in '\n'.join(line_1, line_2, line_3):
1

You can change the end of line character automatically added by print with print("", end=""). To printfoobar, you could do this:

print("foo", end="")
print("bar", end="")

From the documentation:

All non-keyword arguments are converted to strings like str() does and written to the stream, separated by sep and followed by end. Both sep and end must be strings; they can also be None, which means to use the default values.

Comments

1

Python Typewriter Effect

For every letter in the string, my answer provides 0.1 of a second to wait, so the text would appear one by one. Python 3 allows the use of sys.stdout.write.

import time, sys

def anything(str):


for letter in str:
  sys.stdout.write(letter)
  sys.stdout.flush()
  time.sleep(0.1)

anything("Blah Blah Blah...")

Your full code will look like this:

import time, sys

def anything(str):


  for letter in str:
    sys.stdout.write(letter)
    sys.stdout.flush()
    time.sleep(0.1)

anything("You have woken up in a 
mysterious maze")

anything("The building has five 
levels")

anything("Scans show that the floors 
increase in size as you go down")

1 Comment

It would be good to give a more in-depth explanation in your answer so OP understands why how and/or why that solves their problem.
1

It can be solved by:

import time
def tt(text, delay):
    for i in text:
        print(end = i)
        time.sleep(delay)
print(tt("sample text", 0.2)

2 Comments

That looks like a great solution but could you please edit the answer to include some explanation for the code?
yes, i import time for sleeping, then it prints i in the end of line, then sleep and again and again before end
0

Here is 1 way.

from time import sleep

line_1 = "You have woken up in a mysterious maze"
line_2 = "The building has 5 levels"
line_3 = "Scans show that the floors increase in size as you go down"

a = [b for b in line_1]
for i in range(0, len(a)):
    print(a[i], end='')
    sleep(0.25)
print('')

1 Comment

Your a and your for loop can be replaced by for letter in line_1. That's actually the more "pythonic" way of looping over strings and other iterables. See Iterating each character in a string using Python
-1

This solution will not change ur algorithm

   from time import sleep

   line_1 = "You have woken up in a mysterious maze"
   line_2 = "The building has 5 levels"
   line_3 = "Scans show that the floors increase in size as you go down"

   for x in line_1:
       print(x, end='')
       sleep(0.05)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.