How to keep run a game in window while we are inputting in terminal python [duplicate]

早过忘川 提交于 2021-02-05 06:45:34

问题


I am new to python programming i was writing a code of snake game in which snake moves randomly on x axis. And user have to put input in terminal for the location of food and poison on x axis. And snake must be inside the food and poison.

"The main thing i want to that is while the user input any location of food and Poison the snake must move whole time without stopping"

I will be thankful to you if you provide me something that can help or do make some changes in the code given below

Thanks



import random
import turtle
import time
delay = 0.1
score = 0
s=0
#setting up screen
win = turtle.Screen()
win.title("Snake Game")
win.bgcolor("black")
win.setup(height= 480, width=480)
win.tracer(0)
#----------------------------------------------------------------------------------------------------------------------
#------------------------------------------------SNAKE-----------------------------------------------------------------
head = turtle.Turtle()
head.speed(0)
head.shape("square")
head.color("white")
head.penup()
head.goto(0,0)
head.direction = "stop"

# FOOD
f = int(input("Enter location of food on x-axis :"))
poi = int(input("Enter location of poison on x-axis :"))
if  poi == 0 and f == 0 or poi == f:
    poi = poi + 40
    f = f + 30
if poi <=0 and f <= 0:
    poi = -poi
if poi >=0 and f >=0:
    f = -f


food = turtle.Turtle()
food.speed(0)
food.shape("circle")
food.color("green")
food.penup()
food.goto(int(f),0)
# Poison
Poison = turtle.Turtle()
Poison.speed(0)
Poison.shape("turtle")
Poison.color("red")
Poison.penup()
Poison.goto(int(poi),0)
#------------------------------------------------SNAKE-----------------------------------------------------------------
#list
segments = []
pen = turtle.Turtle()
pen.speed(0)
pen.shape("square")
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(-150, 205)
pen.write("Secore: 0", align="center", font=("Courier", 24, "normal"))


pen1 = turtle.Turtle()
pen1.speed(0)
pen1.shape("square")
pen1.color("white")
pen1.penup()
pen1.hideturtle()
pen1.goto(200, -226)
pen1.write("240", align="center", font=("Courier", 14, "normal"))

pen2 = turtle.Turtle()
pen2.speed(0)
pen2.shape("square")
pen2.color("white")
pen2.penup()
pen2.hideturtle()
pen2.goto(0, -226)
pen2.write("0", align="center", font=("Courier", 14, "normal"))

pen2 = turtle.Turtle()
pen2.speed(0)
pen2.shape("square")
pen2.color("white")
pen2.penup()
pen2.hideturtle()
pen2.goto(-200, -226)
pen2.write("-240", align="center", font=("Courier", 14, "normal"))
#function
def move():
    if head.direction=="up":
        head.sety(head.ycor() + 5)
    if head.direction=="down":
        head.sety(head.ycor() - 5)
    if head.direction=="left":
        head.setx(head.xcor() - 5)
    if head.direction=="right":
        head.setx(head.xcor() + 5)
def go_right():
    head.direction = "right"
def go_left():
    head.direction = "left"
#----------------------------------------------------------------------------------------------------------------------
c = 0
print("Score: ", score)
while True:
    win.update()
    l = random.randint(-220, 220)
    r = random.randint(-220, 220)
    if l>0 and l < 220:
            head.direction="right"
    if l<0 and l >-220:
            head.direction = "left"
    #check for collison with border
    if head.xcor()>230 or head.xcor()<-230 or head.ycor()>230 or head.ycor()<-230:
        time.sleep(1)
        head.goto(0,0)
        pen.clear()
        score=0
       #hidr segment
        for segment in segments:
            segment.goto(1000,1000)
        #clear segments
        segments.clear()
    #check for collision
    if head.distance(food) < 20:
       x = random.randint(-290,290)
       y = random.randint(-290,290)
       print("Food: ")
       f = int(input("enter the x axis location of food Must be in 230 to -230 "))
       if f > 230 or f < -230:
           f = input("Invalid, enter the x axis location of food Must be in 230 to -230 ")
       p = int(input("enter location of poison on x axis Must be in 230 to -230 "))



       if p > 230 or p < -230:
           p = int(input("Invalid, enter the x axis location "))
       if p == f or p ==0 and f == 0:
           p = p + 40
           f = f + 30
       if p <= 0 and f <= 0:
               p = -p
       if p >= 0 and f >= 0:
               f = -f
       if head.distance(head) < p and head.distance(head) < f:
           f = int(input("enter the location of food again snake must be inside both "))
       if head.distance(head) > f and head.distance(head) > p:
           p = int(input("enter the location of poison again snake must be inside both "))
       Poison.goto(int(p), 0)
       food.goto(int(f), 0)
       #head.direction = "stop"
       new_segment = turtle.Turtle()
       new_segment.speed(0)
       new_segment.shape("square")
       new_segment.color("grey")
       new_segment.penup()
       segments.append(new_segment)
       #increase score
       score += 10
       pen.clear()
       pen.write("Score: {}".format(score), align="center", font=("Courier", 24, "normal"))
    if head.distance(Poison) < 20:
        print("Poison: ")
        p = int(input("enter location of poison on x axis Must be in -230 to -230 "))
        if p > 230 or p < -230:
           p = int(input("Invalid, enter the x axis location "))
        f = int(input("enter the x axis location of food "))
        if head.distance(head) < p and head.distance(head) < f:
            f = int(input("enter the location of food again snake must be inside both "))
        if head.distance(head) > f and head.distance(head) > p:
            p = int(input("enter the location of poison again snake must be inside both "))



        if p == f or p == 0 and f == 0:
            p = p + 40
            f = f + 30
        if p <= 0 and f <= 0:
            p = -p
        if p >= 0 and f >= 0:
            f = -f

        Poison.goto(int(p), 0)
        food.goto(int(f),0)
       # head.direction = "stop"
        # increase score

        score -= 10
        print(score)
        pen.clear()
        pen.write("Score: {}".format(score), align="center", font=("Courier", 24, "normal"))
    #move the end segment
    for index in range(len(segments)-1,0,-1):
        x = segments[index-1].xcor()
        y = segments[index-1].ycor()
        segments[index].goto(x+5, y-20)
     # move seg 0 to where head
    if len(segments)>0:
        segments[0].goto(head.xcor()+5, head.ycor()-20)
    move()


    time.sleep(delay)
win.mainloop()

回答1:


If you just want to do this simply, I would read a text-file rather than from the console. If the new values read are different from the previous-read, assume they have been changed.

Something like:

food_x = -1
food_y = -1
...  # in main loop

try:
    # try to read the content of "user_input.txt", which we expect to be two numbers
    user_input = open( 'user_input.txt', 'rt' ).read()
    user_input = user_input.split( ' ' )             # split input into words
    user_input = list( filter( None, user_input ) )  # throw away any empty strings
    new_food_x = int( user_input[0] )
    new_food_y = int( user_input[1] )

    # We read 2 integers from the file
    # but are they different to last time?
    if ( new_food_x >= 0      and new_food_y >= 0     and
         new_food_x != food_x and new_food_y != food_y ):
        food_x = new_food_x
        food_y = new_food_y
        # TODO: whatever else is needed to flag a new food item
except:
    pass # file not found, typos, not numbers, etc.  ignore any/all errors

Another alternative is to read from the console in a thread, and using PyGame events post the result back to the main GUI thread. This is much more involved. I thought I answered this before, but I am unable to find it ... so maybe not.

Below is some example code which reads stdin in a thread, posting events back to the main thread. This example reads numbers, or the word "quit".

import threading
import pygame
import enum

# Window size
WINDOW_WIDTH  = 200
WINDOW_HEIGHT = 200

DARK    = (  50, 50, 50 )
WHITE   = ( 255,255,255 )
RED     = ( 255, 55, 55 )
GREEN   = (   5,255, 55 )
BLUE    = (   5, 55,255 )


colour_cycle = [ DARK, WHITE, RED, GREEN, BLUE ]

# Enumerated type for messages
class UserEvents( enum.IntEnum ):
    CLIENT_NUMBER = pygame.USEREVENT + 1
    CLIENT_QUIT   = pygame.USEREVENT + 2
    # ...

# Thread function/class to handle threaded console input
class ConsoleInputThread( threading.Thread ):
    """ A thread that handles user input on the console.
        Waits for user input, then posts messages
        to the main PyGame thread for processing """
    def __init__( self, prompt ):
        threading.Thread.__init__(self)
        self.daemon         = True # exit with parent
        self.done           = False
        self.prompt         = prompt

    def stop( self ):
        self.done = True

    def run( self ):
        """ Loops until the user hangs-up """
        while ( not self.done ):
            # Get some input from the user
            user_input = input( self.prompt ).strip()
            new_event = None
            if ( user_input == 'quit' ):
                new_event = pygame.event.Event( UserEvents.CLIENT_QUIT, { } )
            else:
                try:
                    user_input = int( user_input )
                    new_event = pygame.event.Event( UserEvents.CLIENT_NUMBER, { "value":user_input } )
                except:
                    print( "Syntax Error" )
            # If we received valid input post it to the main thread
            if ( new_event ):
                pygame.event.post( new_event )



###
### MAIN
###

# Create the window
pygame.init()
pygame.display.set_caption("Console Messages")
SURFACE = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE
window  = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), SURFACE )

# Start the connection-listener thread
input_thread = ConsoleInputThread( "Enter numbers or quit: " )
input_thread.start()

# Main paint / update / event loop
done = False
clock = pygame.time.Clock()
colour_index = 0
while ( not done ):

    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == UserEvents.CLIENT_QUIT ):          # from thread
            print("\nCLIENT ASKED TO QUIT " )
            done = True

        elif ( event.type == UserEvents.CLIENT_NUMBER ):         # from thread
            print( "\nVALUE WAS INPUT: %d " % ( event.value, ) )

    window.fill( colour_cycle[colour_index] )
    # rotate the colours, just so the screen changes
    colour_index += 1
    if ( colour_index >= len( colour_cycle ) ):
        colour_index = 0

    pygame.display.flip()
    clock.tick_busy_loop(30)

input_thread.stop()
pygame.quit()


来源:https://stackoverflow.com/questions/59868580/how-to-keep-run-a-game-in-window-while-we-are-inputting-in-terminal-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!