返回

Python Turtle 随机乌龟赛跑:教程与代码实现

python

使用Python Turtle实现随机乌龟赛跑

如何使用Python的turtle模块绘制五个乌龟,并让他们随机比赛,最终显示排名和用时?这个需求在游戏开发中很常见,可以提供直观的图形反馈。 本文会逐步分析并解决这个问题,让五个小乌龟随机赛跑,最终展示排名与耗时。

步骤一: 初始化与基本设置

为了进行乌龟赛跑,需要设置好赛道、起点和参赛者(即乌龟)。初始化的关键在于确保每只乌龟都有不同的起始位置,并使用不同的颜色来区分它们。为了使过程可观察,将逐步绘制背景与乌龟。

代码展示了如何利用turtle模块绘制赛道线和代表乌龟的不同颜色的圆形。这些乌龟将从不同的位置开始。需要注意的是,bgcolor('black')将背景设置为黑色,让后面的赛道线和乌龟更加醒目。célvonal()函数集中定义了整个绘制过程。

步骤二: 让乌龟移动

接下来的步骤是使乌龟开始移动。 可以利用Python的 random模块来控制每只乌龟的移动距离。同时,使用一个循环来模拟赛跑过程。 每个回合,每个乌龟都以随机距离移动,然后检查是否到达了终点线。 使用字典存储每一只乌龟到达终点时的顺序以及时间。

代码示例:

import turtle
import random
import time

def race():
    finish_line_x = 225 # 终点线的 x 坐标,需要根据您的代码调整

    colors = ['white', 'green', 'blue', 'orange', 'purple']
    turtles = []
    positions = [-200, -100, 0, 100, 200]
    # 初始化乌龟
    for i in range(5):
        t = turtle.Turtle()
        t.shape('turtle')
        t.color(colors[i])
        t.penup()
        t.goto(positions[i], -270) # 起跑线调整y值以配合你的起点设计
        t.setheading(90)  # 朝上
        turtles.append(t)
        t.pendown()


    results = {} # 记录完成时间与排名
    finish_order = 1 # 排名
    start_time = time.time() # 记录开始时间


    while len(results) < 5: # 只有5只都跑完才能停止
        for turtle_index,t in enumerate(turtles):
                if turtle_index in results: # 如果已经完成,不跑
                     continue
                move_distance= random.randint(1,20) # 每轮移动随机步长
                t.forward(move_distance)


                if t.ycor() >  finish_line_x - 50: # 检查乌龟是否越过终点线 - 根据你自己的设计更改数字
                    end_time=time.time()
                    results[turtle_index]= (finish_order,round(end_time-start_time,2)) # 完成时间

                    finish_order += 1

    return results


def display_results(results):
      screen = turtle.Screen()
      writer=turtle.Turtle()
      writer.hideturtle() #隐藏箭头
      writer.penup()
      writer.goto(-150,-200) # 从哪个坐标开始写文字
      writer.pendown()


      for rank in sorted(results.items(), key=lambda item: item[1][0]): # sort结果集,按照排名排序
         turtle_index, result=rank
         final_rank ,final_time= result

         color_text = colors[turtle_index].capitalize()  #  第一步  按照名次 乌龟的颜色 + 名次+用时

         writer.pencolor(colors[turtle_index])
         writer.write(f"Rank {final_rank}:  {color_text} turtle Time: {final_time} sec.",font=("Arial", 16, "normal")  ,move = False)
         writer.penup()
         writer.goto(writer.xcor(),writer.ycor()-30)
         writer.pendown()
#执行

colors = ['white', 'green', 'blue', 'orange', 'purple'] # 确保这里的颜色与绘制时一致
turtle.speed(0) # 将绘制的速度调整到最快,这句放到全局变量设置区
célvonal()

results= race()
display_results(results)

turtle.done()

race函数中,可以看到time.time() 用于获取开始时间。在每只乌龟冲过终点时,也会记录下结束时间,并将这个时间和排名一起记录在 results 字典中。在显示排名时,需要按照排名的顺序读取数据,因此使用了 sortedlambda 进行排序,然后输出结果。 另外设置turtle的speed(0) 为最快绘制速度,使得代码更高效。display_results() 输出排名, 时间等信息到画布。

运行结果

运行此代码后,窗口会先绘制出赛道和乌龟。当所有乌龟跑过终点线后,会在下方显示所有乌龟的排名及耗时。

安全与注意事项

在执行涉及随机性的操作时,需留意程序的执行效果和稳定性。 务必对代码进行充分测试,尤其是在处理涉及到时间和位置的时候,确保参数和边界的有效性。 为了清晰理解和调试代码,可以增加一些调试打印,比如在终端打印每只乌龟移动的步数,或者到达的时间,帮助验证程序逻辑。