分享相关知识
2023-12-28 20:09:15
直接使用海龟图进行创作移动动态的游戏
这段代码是一个简单的turtle模块实现的小游戏,主要功能包括:
-
窗口和无人机初始化:
- 创建了一个turtle窗口,设置了窗口的背景颜色和标题。
- 创建了一个表示无人机的turtle,形状为正方形,蓝色,大小为(2 * 5)。
- 创建了四个表示旋翼的turtle,形状为圆形,红色,大小根据半径计算。
-
障碍物的创建和初始化:
- 创建了三个初始位置随机的障碍物,其中两个形状为圆形,一个形状为三角形。
-
碰撞检测和处理:
- 使用
is_collision
函数检测无人机和障碍物之间的碰撞。 handle_collision
函数用于处理碰撞,根据障碍物的形状进行分数和死亡次数的更新,并根据分数动态改变无人机的宽度。- 障碍物的位置在碰撞后会重新设置。
- 使用
-
按键事件和无人机移动:
- 使用
wn.listen()
启用键盘事件监听。 - 定义了四个移动函数
move_up
、move_down
、move_left
、move_right
,分别控制无人机的上下左右移动。 move_rotors
函数用于移动旋翼。
- 使用
-
动态增加新的障碍物:
add_obstacle
函数根据分数的不同,动态地增加新的三角形障碍物,并且仅在之前没有创建过相应障碍物的情况下执行。
-
计时和异常处理:
- 计时程序记录了游戏的运行时间。
- 在主循环中加入异常处理,避免窗口关闭时出现错误。
-
更新分数和死亡次数的显示:
update_score_display
函数用于更新分数和死亡次数的显示,并在需要时增加新的障碍物。
-
游戏结束提示:
- 在死亡次数达到三次时,输出游戏结束提示。
这个小游戏通过键盘操作无人机,避开圆形障碍物,触碰三角形障碍物会导致死亡。分数在碰撞到圆形障碍物时增加,死亡次数在碰撞到三角形障碍物时增加。同时,游戏会动态地增加新的三角形障碍物。
import turtle
import random
import math
import time
# 设置窗口
wn = turtle.Screen()
wn.bgcolor("white")
wn.title("无人机")
# 创建飞行器
drone = turtle.Turtle()
drone.shape("square")
drone.color("blue")
drone.shapesize(stretch_wid=2, stretch_len=5)
# 创建圆形的旋翼
rotor_radius = 20
def draw_rotor(rotor, x, y):
rotor.speed(0)
rotor.shape("circle")
rotor.color("red")
rotor.shapesize(rotor_radius / 10)
rotor.penup()
rotor.goto(x, y)
# 创建旋翼
rotor1 = turtle.Turtle()
draw_rotor(rotor1, -50, 50)
rotor2 = turtle.Turtle()
draw_rotor(rotor2, 50, 50)
rotor3 = turtle.Turtle()
draw_rotor(rotor3, -50, -50)
rotor4 = turtle.Turtle()
draw_rotor(rotor4, 50, -50)
# 创建障碍物(圆形和三角形)
obstacle_size = 20
def draw_obstacle(obstacle, shape, x, y):
obstacle.speed(0)
obstacle.shape(shape)
obstacle.color("black")
obstacle.penup()
obstacle.goto(x, y)
# 随机初始位置
obstacle1_initial_pos = (random.randint(-200, 200), random.randint(-200, 200))
obstacle2_initial_pos = (random.randint(-200, 200), random.randint(-200, 200))
obstacle3_initial_pos = (random.randint(-200, 200), random.randint(-200, 200))
# 创建障碍物
obstacle1 = turtle.Turtle()
obstacle_shape1 = "circle"
draw_obstacle(obstacle1, obstacle_shape1, *obstacle1_initial_pos)
obstacle2 = turtle.Turtle()
obstacle_shape2 = "circle"
draw_obstacle(obstacle2, obstacle_shape2, *obstacle2_initial_pos)
obstacle3 = turtle.Turtle()
obstacle_shape3 = "triangle"
draw_obstacle(obstacle3, obstacle_shape3, *obstacle3_initial_pos)
obstacle4 = None
obstacle5 = None
obstacle6 = None
# 记录分值和死亡次数
score = 0
death_count = 0
# 分数和死亡次数显示
score_display = turtle.Turtle()
score_display.hideturtle()
score_display.penup()
score_display.goto(-200, 200)
score_display.write(f"分数: {score} 死亡次数: {death_count}", align="left", font=("Arial", 16, "normal"))
# 移动无人机及旋翼
def move_up():
y = drone.ycor()
drone.sety(y + 10)
check_collision()
def move_down():
y = drone.ycor()
drone.sety(y - 10)
check_collision()
def move_left():
x = drone.xcor()
drone.setx(x - 10)
check_collision()
def move_right():
x = drone.xcor()
drone.setx(x + 10)
check_collision()
# 移动旋翼函数
def move_rotors():
rotor1.setpos(drone.xcor() - 50, drone.ycor() + 50)
rotor2.setpos(drone.xcor() + 50, drone.ycor() + 50)
rotor3.setpos(drone.xcor() - 50, drone.ycor() - 50)
rotor4.setpos(drone.xcor() + 50, drone.ycor() - 50)
# 碰撞检测函数
def check_collision():
global score, death_count
# 检测与障碍物1的碰撞
if is_collision(drone, obstacle1):
handle_collision(obstacle1)
# 检测与障碍物2的碰撞
if is_collision(drone, obstacle2):
handle_collision(obstacle2)
# 检测与障碍物3的碰撞
if is_collision(drone, obstacle3):
handle_collision(obstacle3)
#这个是中级难度的,会增加一个障碍物
if score>=10:
if is_collision(drone, obstacle4):
handle_collision(obstacle4)
if score>=20:
if is_collision(drone, obstacle5):
handle_collision(obstacle5)
if score>=30:
if is_collision(drone, obstacle6):
handle_collision(obstacle6)
# 判断是否发生碰撞
def is_collision(t1, t2):
x1, y1 = t1.xcor(), t1.ycor()
x2, y2 = t2.xcor(), t2.ycor()
distance = math.sqrt((x1 - x2)**2 + (y1 - y2)**2)
return distance < (obstacle_size + 20)
# 处理碰撞函数
def handle_collision(obstacle):
global score, death_count
if obstacle.shape() == "circle":
score += 1
print(f"碰撞到圆球! 得分: {score}")
reset_obstacle(obstacle)
elif obstacle.shape() == "triangle":
death_count += 1
print(f"已死亡!死亡次数: {death_count}")
if death_count == 3:
print("游戏结束,请重新开始")
time.sleep(3)
wn.bye() # 关闭窗口
reset_obstacle(obstacle)
# 根据分数动态改变无人机宽度
drone_width_percent = 1 + score * 0.01
drone.shapesize(stretch_wid=2 * drone_width_percent, stretch_len=5)
update_score_display()
# 重置障碍物位置
def reset_obstacle(obstacle):
obstacle.setpos(random.randint(-200, 200), random.randint(-200, 200))
def game_over():
# 游戏结束的操作
print("Game Over")
turtle.bye() # 关闭窗口
# 动态增加新的障碍物
def add_obstacle():
global obstacle4, obstacle5, obstacle6
if score >= 10 and obstacle4 is None:
obstacle4 = turtle.Turtle()
obstacle_shape4 = "triangle"
draw_obstacle(obstacle4, obstacle_shape4, random.randint(-200, 200), random.randint(-200, 200))
elif score >= 20 and obstacle5 is None:
obstacle5 = turtle.Turtle()
obstacle_shape5 = "triangle"
draw_obstacle(obstacle5, obstacle_shape5, random.randint(-200, 200), random.randint(-200, 200))
elif score >= 30 and obstacle6 is None:
obstacle6 = turtle.Turtle()
obstacle_shape6 = "triangle"
draw_obstacle(obstacle6, obstacle_shape6, random.randint(-200, 200), random.randint(-200, 200))
def update_score_display():
global score
score_display.clear()
score_display.write(f"分数: {score} 死亡次数: {death_count}", align="left", font=("Arial", 16, "normal"))
add_obstacle() # 检查是否需要增加新的障碍物
# 绑定按键事件,就是你键盘w s a d按下就能移动
wn.listen()
wn.onkeypress(move_up, "w")
wn.onkeypress(move_down, "s")
wn.onkeypress(move_left, "a")
wn.onkeypress(move_right, "d")
# 主循环
# 计时程序
starTime = time.time()
while True:
try:
move_rotors()
wn.update()
except:
print("请重新启动游戏")
break
endTime = time.time()
elapsedTime = endTime - starTime
print("你最终花费的时间是:", elapsedTime)
文章来源:https://blog.csdn.net/screamn/article/details/135267498
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!