当我们在终端 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()
我是 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()