今天,咱用Python的turtle来做贪吃蛇。
首先,导入包~~~
import turtle #主包
import time #换帧
import random #随机
因为在本代码中,内置turtle只是个克隆机,因此隐藏~~~
#Set turtle
turtle.clear()
turtle.ht()
在本程序中,蛇是有生命值的、分数的,生命值在15~25条命之间。本程序中每秒10帧,因此Delay = 0.1。
#Lives
lives = random.randint(15,25)
#Delay
delay = 0.1
# Score
score = 0
high_score = 0
接下来,初始化开始,包括主角们和配角们;medicineif是决定medicine的是否存在的变量~~~
#Medicineif
medicineif = 0
# Set up the screen
wn = turtle.Screen()
wn.title("The Hungry Snake Game By 胡辰")
wn.bgcolor("#008000")
wn.setup(width=600, height=600)
wn.tracer(0) # Turns off the screen updates
# Snake head
head = turtle.Turtle()
head.speed(0)
head.shape("square")
head.color("purple")
head.penup()
head.goto(0, 0)
head.direction = "stop"
# Snake foods
rasberry = turtle.Turtle()
rasberry.speed(0)
rasberry.shape("circle")
rasberry.color("red")
rasberry.penup()
rasberry.goto(0, 100)
strawberry = turtle.Turtle()
strawberry.speed(0)
strawberry.shape("triangle")
strawberry.left(270)
strawberry.color("#BB0000")
strawberry.penup()
strawberry.goto(20,190)
blueberry = turtle.Turtle()
blueberry.speed(0)
blueberry.shape("circle")
blueberry.color("#5050FF")
blueberry.penup()
blueberry.goto(100, 100)
#Bombs
bomb = turtle.Turtle()
bomb.speed(0)
bomb.shape('circle')
bomb.color('black')
bomb.penup()
bomb.goto(random.randint(-100,100),random.randint(-100,100))
bomb2 = turtle.Turtle()
bomb2.speed(0)
bomb2.shape('circle')
bomb2.color('black')
bomb2.penup()
bomb2.goto(random.randint(-100,100),random.randint(-100,100))
bomb3 = turtle.Turtle()
bomb3.speed(0)
bomb3.shape('circle')
bomb3.color('black')
bomb3.penup()
bomb3.goto(random.randint(-100,100),random.randint(-100,100))
bomb4 = turtle.Turtle()
bomb4.speed(0)
bomb4.shape('circle')
bomb4.color('black')
bomb4.penup()
bomb4.goto(random.randint(-100,100),random.randint(-100,100))
#Life medicine
turtle.begin_poly()
turtle.color('#00FFC8')
turtle.begin_fill()
turtle.circle(15)
turtle.end_fill()
turtle.goto(-7,20)
turtle.begin_fill()
turtle.goto(-7,50)
turtle.goto(7,50)
turtle.goto(7,20)
turtle.end_fill()
turtle.end_poly()
medicine=turtle.get_poly()
turtle.register_shape('medicine',medicine)
turtle.clear()
medicine = turtle.Turtle()
medicine.shape('medicine')
medicine.color('#00FFC8')
medicine.turtlesize(0.625)
medicine.lt(90)
medicine.ht()
#Segments
segments = []
# Pen
pen = turtle.Turtle()
pen.speed(0)
pen.shape("square")
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(0, 230)
pen.write("Score: 0 Highest Score: 0 \n Lives: {}".format(lives), align="center",
font=("Courier", 18, "normal"))
接下来慢慢进入主场了!
定义蛇的移动并键盘监听:
# Functions
def go_up():
if head.direction != "down":
head.direction = "up"
def go_down():
if head.direction != "up":
head.direction = "down"
def go_left():
if head.direction != "right":
head.direction = "left"
def go_right():
if head.direction != "left":
head.direction = "right"
def move():
if head.direction == "up":
y = head.ycor()
head.sety(y + 20)
if head.direction == "down":
y = head.ycor()
head.sety(y - 20)
if head.direction == "left":
x = head.xcor()
head.setx(x - 20)
if head.direction == "right":
x = head.xcor()
head.setx(x + 20)
# Keyboard bindings
wn.listen()
wn.onkeypress(go_up, "Up")
wn.onkeypress(go_down, "Down")
wn.onkeypress(go_left, "Left")
wn.onkeypress(go_right, "Right")
现在,进入主循环~~~
while True:
lives = random.randint(15, 25)
# Main game loop
while lives > 0:
wn.update()
if random.randint(0,100)>99:
medicine.pu()
medicine.goto(random.randint(-290,290),random.randint(-290,290))
medicine.st()
medicineif = 1
# Check for a collision with the border
if head.xcor() > 290 or head.xcor() < -290 or head.ycor() > 290 or head.ycor() < -290 or head.distance(bomb) < 20 or head.distance(bomb2) < 20 or head.distance(bomb3) < 20 or head.distance(bomb4) < 20:
time.sleep(1)
head.goto(0, 0)
head.direction = "stop"
lives -= 1
x = random.randint(-290,290)
y = random.randint(-290, 290)
bomb.goto(x,y)
x = random.randint(-290, 200)
y = random.randint(-290, 200)
bomb2.goto(x, y)
x = random.randint(-290, 290)
y = random.randint(-290, 290)
bomb3.goto(x, y)
x = random.randint(-290, 290)
y = random.randint(-290, 290)
bomb4.goto(x, y)
# Hide the segments
for segment in segments:
segment.goto(1000, 1000)
# Clear the segments list
segments.clear()
# Reset the score
score = 0
# Reset the delay
delay = 0.1
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score,lives),
align="center", font=("Courier", 18, "normal"))
# Check for a collision with the food
if head.distance(rasberry) < 20:
# Move the food to a random spot
x = random.randint(-290, 290)
y = random.randint(-290, 290)
rasberry.goto(x, y)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#FF0070")
new_segment.penup()
segments.append(new_segment)
# Shorten the delay
delay -= 0.001
# Increase the score
score += 10
if score > high_score:
high_score = score
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score, lives),
align="center", font=("Courier", 18, "normal"))
# Check for a collision with the food
if head.distance(blueberry) < 20:
# Move the food to a random spot
x = random.randint(-290, 290)
y = random.randint(-290, 290)
blueberry.goto(x, y)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#0000FF")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#0000FF")
new_segment.penup()
segments.append(new_segment)
# Shorten the delay
delay -= 0.001
# Increase the score
score += 50
if score > high_score:
high_score = score
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score,lives),
align="center", font=("Courier", 18, "normal"))
if head.distance(strawberry) < 20:
# Move the food to a random spot
x = random.randint(-290, 290)
y = random.randint(-290, 290)
strawberry.goto(x, y)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#BB002E")
new_segment.penup()
segments.append(new_segment)
delay -= 0.001
# Increase the score
score += 20
if score > high_score:
high_score = score
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score, lives),
align="center", font=("Courier", 18, "normal"))
if medicineif == 1 and head.distance(medicine) < 25:
#Add lives
lives += 1
# Move the medicine to a random spot
x = random.randint(-290, 290)
y = random.randint(-290, 290)
medicine.goto(x, y)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment) # Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
delay -= 0.005
score+=100
if score > high_score:
high_score = score
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score, lives),
align="center", font=("Courier", 18, "normal"))
# Move the end segments first in reverse order
for index in range(len(segments) - 1, 0, -1):
x = segments[index - 1].xcor()
y = segments[index - 1].ycor()
segments[index].goto(x, y)
# Move segment 0 to where the head is
if len(segments) > 0:
x = head.xcor()
y = head.ycor()
segments[0].goto(x, y)
move()
# Check for head collision with the body segments
for segment in segments:
if segment.distance(head) < 20:
time.sleep(1)
head.goto(0, 0)
head.direction = "stop"
# Hide the segments
for segment in segments:
segment.goto(1000, 1000)
# Clear the segments list
segments.clear()
# Reset the score
score = 0
# Reset the delay
delay = 0.1
# Update the score display
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score, lives),
align="center", font=("Courier", 18, "normal"))
time.sleep(delay)
pen.clear()
pen.write("Your Highest Score: {}".format(high_score),
align="center", font=("Courier", 24, "normal"))
wn.mainloop()
总代码:
# Simple Snake Game in Python 3 for Beginners
import turtle
import time
import random
#Set turtle
turtle.clear()
turtle.ht()
#Lives
lives = random.randint(15,25)
#Delay
delay = 0.1
# Score
score = 0
high_score = 0
#Medicineif
medicineif = 0
# Set up the screen
wn = turtle.Screen()
wn.title("The Hungry Snake Game By 胡辰")
wn.bgcolor("#008000")
wn.setup(width=600, height=600)
wn.tracer(0) # Turns off the screen updates
# Snake head
head = turtle.Turtle()
head.speed(0)
head.shape("square")
head.color("purple")
head.penup()
head.goto(0, 0)
head.direction = "stop"
# Snake foods
rasberry = turtle.Turtle()
rasberry.speed(0)
rasberry.shape("circle")
rasberry.color("red")
rasberry.penup()
rasberry.goto(0, 100)
strawberry = turtle.Turtle()
strawberry.speed(0)
strawberry.shape("triangle")
strawberry.left(270)
strawberry.color("#BB0000")
strawberry.penup()
strawberry.goto(20,190)
blueberry = turtle.Turtle()
blueberry.speed(0)
blueberry.shape("circle")
blueberry.color("#5050FF")
blueberry.penup()
blueberry.goto(100, 100)
#Bombs
bomb = turtle.Turtle()
bomb.speed(0)
bomb.shape('circle')
bomb.color('black')
bomb.penup()
bomb.goto(random.randint(-100,100),random.randint(-100,100))
bomb2 = turtle.Turtle()
bomb2.speed(0)
bomb2.shape('circle')
bomb2.color('black')
bomb2.penup()
bomb2.goto(random.randint(-100,100),random.randint(-100,100))
bomb3 = turtle.Turtle()
bomb3.speed(0)
bomb3.shape('circle')
bomb3.color('black')
bomb3.penup()
bomb3.goto(random.randint(-100,100),random.randint(-100,100))
bomb4 = turtle.Turtle()
bomb4.speed(0)
bomb4.shape('circle')
bomb4.color('black')
bomb4.penup()
bomb4.goto(random.randint(-100,100),random.randint(-100,100))
#Life medicine
turtle.begin_poly()
turtle.color('#00FFC8')
turtle.begin_fill()
turtle.circle(15)
turtle.end_fill()
turtle.goto(-7,20)
turtle.begin_fill()
turtle.goto(-7,50)
turtle.goto(7,50)
turtle.goto(7,20)
turtle.end_fill()
turtle.end_poly()
medicine=turtle.get_poly()
turtle.register_shape('medicine',medicine)
turtle.clear()
medicine = turtle.Turtle()
medicine.shape('medicine')
medicine.color('#00FFC8')
medicine.turtlesize(0.625)
medicine.lt(90)
medicine.ht()
#Segments
segments = []
# Pen
pen = turtle.Turtle()
pen.speed(0)
pen.shape("square")
pen.color("white")
pen.penup()
pen.hideturtle()
pen.goto(0, 230)
pen.write("Score: 0 Highest Score: 0 \n Lives: {}".format(lives), align="center",
font=("Courier", 18, "normal"))
# Functions
def go_up():
if head.direction != "down":
head.direction = "up"
def go_down():
if head.direction != "up":
head.direction = "down"
def go_left():
if head.direction != "right":
head.direction = "left"
def go_right():
if head.direction != "left":
head.direction = "right"
def move():
if head.direction == "up":
y = head.ycor()
head.sety(y + 20)
if head.direction == "down":
y = head.ycor()
head.sety(y - 20)
if head.direction == "left":
x = head.xcor()
head.setx(x - 20)
if head.direction == "right":
x = head.xcor()
head.setx(x + 20)
# Keyboard bindings
wn.listen()
wn.onkeypress(go_up, "Up")
wn.onkeypress(go_down, "Down")
wn.onkeypress(go_left, "Left")
wn.onkeypress(go_right, "Right")
while True:
lives = random.randint(15, 25)
# Main game loop
while lives > 0:
wn.update()
if random.randint(0,100)>99:
medicine.pu()
medicine.goto(random.randint(-290,290),random.randint(-290,290))
medicine.st()
medicineif = 1
# Check for a collision with the border
if head.xcor() > 290 or head.xcor() < -290 or head.ycor() > 290 or head.ycor() < -290 or head.distance(bomb) < 20 or head.distance(bomb2) < 20 or head.distance(bomb3) < 20 or head.distance(bomb4) < 20:
time.sleep(1)
head.goto(0, 0)
head.direction = "stop"
lives -= 1
x = random.randint(-290,290)
y = random.randint(-290, 290)
bomb.goto(x,y)
x = random.randint(-290, 200)
y = random.randint(-290, 200)
bomb2.goto(x, y)
x = random.randint(-290, 290)
y = random.randint(-290, 290)
bomb3.goto(x, y)
x = random.randint(-290, 290)
y = random.randint(-290, 290)
bomb4.goto(x, y)
# Hide the segments
for segment in segments:
segment.goto(1000, 1000)
# Clear the segments list
segments.clear()
# Reset the score
score = 0
# Reset the delay
delay = 0.1
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score,lives),
align="center", font=("Courier", 18, "normal"))
# Check for a collision with the food
if head.distance(rasberry) < 20:
# Move the food to a random spot
x = random.randint(-290, 290)
y = random.randint(-290, 290)
rasberry.goto(x, y)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#FF0070")
new_segment.penup()
segments.append(new_segment)
# Shorten the delay
delay -= 0.001
# Increase the score
score += 10
if score > high_score:
high_score = score
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score, lives),
align="center", font=("Courier", 18, "normal"))
# Check for a collision with the food
if head.distance(blueberry) < 20:
# Move the food to a random spot
x = random.randint(-290, 290)
y = random.randint(-290, 290)
blueberry.goto(x, y)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#0000FF")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#0000FF")
new_segment.penup()
segments.append(new_segment)
# Shorten the delay
delay -= 0.001
# Increase the score
score += 50
if score > high_score:
high_score = score
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score,lives),
align="center", font=("Courier", 18, "normal"))
if head.distance(strawberry) < 20:
# Move the food to a random spot
x = random.randint(-290, 290)
y = random.randint(-290, 290)
strawberry.goto(x, y)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#BB002E")
new_segment.penup()
segments.append(new_segment)
delay -= 0.001
# Increase the score
score += 20
if score > high_score:
high_score = score
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score, lives),
align="center", font=("Courier", 18, "normal"))
if medicineif == 1 and head.distance(medicine) < 25:
#Add lives
lives += 1
# Move the medicine to a random spot
x = random.randint(-290, 290)
y = random.randint(-290, 290)
medicine.goto(x, y)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment) # Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
# Add a segment
new_segment = turtle.Turtle()
new_segment.speed(0)
new_segment.shape("square")
new_segment.color("#00FFC8")
new_segment.penup()
segments.append(new_segment)
delay -= 0.005
score+=100
if score > high_score:
high_score = score
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score, lives),
align="center", font=("Courier", 18, "normal"))
# Move the end segments first in reverse order
for index in range(len(segments) - 1, 0, -1):
x = segments[index - 1].xcor()
y = segments[index - 1].ycor()
segments[index].goto(x, y)
# Move segment 0 to where the head is
if len(segments) > 0:
x = head.xcor()
y = head.ycor()
segments[0].goto(x, y)
move()
# Check for head collision with the body segments
for segment in segments:
if segment.distance(head) < 20:
time.sleep(1)
head.goto(0, 0)
head.direction = "stop"
# Hide the segments
for segment in segments:
segment.goto(1000, 1000)
# Clear the segments list
segments.clear()
# Reset the score
score = 0
# Reset the delay
delay = 0.1
# Update the score display
pen.clear()
pen.write("Score: {} Highest Score: {} \n Lives: {}".format(score, high_score, lives),
align="center", font=("Courier", 18, "normal"))
time.sleep(delay)
pen.clear()
pen.write("Your Highest Score: {}".format(high_score),
align="center", font=("Courier", 24, "normal"))
wn.mainloop()
由于我三升四,不大知道咋解读易懂,因此大家看注释就好了~~~~
下期预告:升级版Python turtle贪吃蛇