当我们在终端 python 中输入时,如何在 window 中保持 运行 游戏

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

我是 python 编程新手 我正在编写蛇游戏代码,其中蛇在 x 轴上随机移动。并且用户必须在终端中输入 x 轴上食物和毒药的位置。而且蛇一定是在食物和毒药里面。

"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"

如果您能提供一些可以帮助我或对下面给出的代码进行一些更改的东西,我将不胜感激

谢谢



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()

如果您只想简单地执行此操作,我会读取文本文件而不是从控制台读取。如果读取的新值与先前读取的值不同,则假设它们已被更改。

类似于:

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

另一种方法是在线程中从控制台读取,并使用 PyGame 事件 post 将结果返回到主 GUI 线程。这涉及更多。我以为我以前回答过这个问题,但我找不到...所以也许没有。

下面是一些示例代码,它在线程中读取 stdin,将事件发回主线程。此示例读取数字或单词 "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()