python小乌龟绘制迷宫,python画出小乌龟走迷宫路线

  python小乌龟绘制迷宫,python画出小乌龟走迷宫路线

  本文主要带你写一个海龟库做的海龟的三个迷宫。文章中的样例代码讲解的很详细,对我们学习Python很有帮助。有兴趣的可以看看。

  00-1010简介1。什么是Turtle2。如何玩龟仙人3?画布设置4。设置背景/画布颜色2。乌龟笔刷设置1 .乌龟绘制基本方法3 .最后一例海龟游戏1。设计思路,游戏规则2。准备环节3。正式敲门暗号4。效果图1。运行代码2。第1 3层。水平。

  

目录

  你好!大家好!我是木木子~

  看之前的3354条,发现一个特点。很多朋友都喜欢学海龟或者游戏代码吧~

  那么今天的文章就是为这两位小伙伴精心准备的!乌龟,我们一起安排一波吧!

  从海龟入门-基础知识到实际案例,这篇文章一直写到最后!不要以为只是一个项目。想学乌龟,一定要学。不要错过哦~

  最后,今天,边肖将带你用乌龟写一个乌龟的三个迷宫!这个工作量还是蛮大的!如果都画下来,代码量就大得多了,需要400行代码才能完成这个“乌龟破迷宫”的小游戏!

  

导语

  

一、简介

  Turtle在英文里翻译成turtle,但我们介绍的不是这种动物,而是一个以它命名的绘图软件。

  python中介绍,Turtle本身是一款简单易用的绘图软件,非常适合初学者进入编程世界。

  Turtle是Python的内置模块。简而言之,它是一个非常简单和有趣的库。

  其动作主要包括:提笔,然后只动画笔,画布上不留痕迹;放下笔,只要动一下画笔,画布上就会留下痕迹。

  画笔只做绝对、相对、向前(向后)、转弯(绝对角度、相对角度)、圆或圆弧、点(实心圆)的运动,所以很难画出椭圆和函数曲线!

  

1.什么是Turtle

  当然,这里需要进入python编程环境,然后就可以开始写这个python文件中关于turtle的代码了。

  Turtle是python安装自带的内置模块。调用这个模块非常简单,可以通过导入直接加载:

  进口海龟或从海龟进口*

  这也是程序的第一行代码,用来准备使用海龟模块。

  

2.怎么玩转Turtle

  1.1设置画布大小

  Turtle.screensize() #返回默认大小(400,300)

  1.2以默认绘图窗口大小显示窗口,窗口居屏幕中心

  turtle.screensize(宽度,高度[,背景])

  其中:width——代表画布宽度(单位像素);Hight——表示画布高度(单位像素);Bg——画布背景颜色,该参数可以默认,默认为白色背景。

  1.3案例

  比如:

  Turtle.screen size (800,600,绿色),表示画布大小为800600,画布为绿色。

  turtle.setup(宽度,高度[,x,y])

  其中:width,height——表示画布的宽度和高度。当它是整数时,它代表一个像素;当它是十进制数时,它代表计算机屏幕的比例。

  lass="maodian">

  

4.设置背景/画布颜色

  

turtle.bgcolor()

  

  

  

二、Turtle的画笔设置

  

turtle.pensize(size)

  

  其中:size——画笔粗细,用像素表示。

  

  

1.turtle绘图的基本方法

  导入turtle库绘图模块后,就可以实现绘图,基本操作是向前(后)画直线,旋转(向左向右改变方向),画圆(圆弧)等。

  这里介绍几个最常用的命令。

  1.1设置画笔的属性

  命令说明turtle.pensize(width)用于设置画笔的宽度(即粗细),width越大越粗turtle.pencolor(color)用于设置画笔的颜色,color参数可以是字符串如"green","red",也可以是RGB三元组turtle.shape(shape)用于设置画笔的形状,shape参数为字符串,主要包含turtle乌龟形状,square正方形形状等turtle.speed(speed)用于设置画笔的移动速度。speed参数可以是字符串如fast,"slow"等,也可以是0到10间的整数

  1.2画笔绘图的命令

  命令说明turtle.fd(dis)沿当前画笔方向向前移动dist像素长度turtle.bk(dist)沿当前画笔相反方向移动dist像素长度turtle.right(degree)沿当前画笔方向向右转degree°turtle.left(degree)沿当前画笔方向向左转degree°turtle.down()将画笔放下,开始画图turtle.up()提起笔移动,不绘制图形turtle.circle()画圆,半径为正(负),表示圆心在画笔的左边(右边)画圆setx( )将当前x轴移动到指定位置sety( )将当前y轴移动到指定位置setheading(degree)用于设置画笔的方向,参数degree为画笔方向与海龟坐标系x轴正向的夹角度数ht()用于将画笔隐藏

  

  

三、最后的案例Turtle小游戏

  

  

1.设计思路游戏规则

  这个海龟闯关的小迷宫游戏是设计了三个关卡,运行代码之后会有相应的关卡弹窗设置,想完那关可以直接玩那关, 也可以按照顺序闯关。

  特别注意:

  很多人担心过不了关?没关系,小编给大家开了一个挂,这个挂就是按住F1就出现了迷宫的路线图哦!按住F2就是出现了一个海龟到起点自己走路线哈!

  

  

2.准备环节

  小编用的Python3、Pycharm2021、Turtle模块导入即可。

  然后相应的图片素材:

  

  

  

3.正式敲代码

  

# -*- coding: UTF-8 -*-

  """

  源码基地:#806965976#

  csdn账号:顾木子吖

  海龟迷宫闯关游戏

  """

  import turtle # 导入海龟绘图模块

  import random # 导入随机数模块

  game_title = 小海龟大迷宫闯关小游戏 # 游戏名字

  level = 0 # 关卡

  绘制地图用的全局变量

  txt_path = map/map1.txt # 地图信息文本文件路径及名称

  road_color = (191, 217, 225) # 迷宫通道的颜色

  R, C = 0, 0 # 迷宫地图的总行数R、总列数C

  cell_size = 20 # 一个格子的尺寸

  area_sign = {} # 记录入口和出口索引位置

  mazeList = [] # 地图列表

  海龟对象

  map_t = turtle.Turtle() # 绘制地图的海龟

  map_t.speed(0) # 设置绘图速度最快(地图绘制)

  sign_t = turtle.Turtle() # 绘制入口和出口标记的海龟

  auto_t = turtle.Turtle() # 自动走迷宫的海龟

  auto_t.pensize(5) # 画笔粗细(自动)

  auto_t.speed(0) # 设置绘图速度最快(手动)

  auto_t.ht() # 隐藏海龟光标

  manual_t = turtle.Turtle() # 手动走迷宫的海龟

  manual_t.pensize(5) # 画笔粗细(手动)

  manual_t.speed(0) # 设置绘图速度最快(手动)

  manual_t.shape(turtle) # 设置海龟光标为小海龟(手动)

  manual_t.ht() # 隐藏手动走迷宫所用的海龟光标(手动)

  # 要探索4个方向对应索引的变化规则

  direction = [

   (1, 0), # 右

   (-1, 0), # 左

   (0, 1), # 上

   (0, -1) # 下

  ]

  def imoveto(ci, ri):

   """

   功能:根据索引位置移动海龟(不画线)

   :param ci: 列索引

   :param ri: 行索引

   :return:

   """

   auto_t.penup() # 抬笔

   cx, cy = itoc((ci, ri)) # 将索引位置转换为坐标位置

   auto_t.goto(cx, cy) # 移动到指定位置

   auto_t.pendown() # 落笔

   auto_t.shape(turtle) # 设置海龟光标的形状

   auto_t.color(red) # 设置画笔颜色为红色

   auto_t.st() # 显示海龟光标

  def c_move_to(t, ctuple): # 移动到指定位置

   """

   功能:根据坐标位置移动到指定位置(不画线)

   :param t: 海龟对象

   :param ctuple: 记录坐标位置的元组

   :return:

   """

   t.ht() # 隐藏海龟光标

   t.penup() # 抬笔

   t.goto(ctuple[0], ctuple[1]) # 移动到坐标指定的位置

   t.pendown() # 落笔

  def itoc(ituple):

   """

   将索引位置转换为实际坐标位置

   :param ituple: 行、列索引组成的元组

   :return: 实际坐标位置

   """

   ci = ituple[0]

   ri = ituple[1]

   tx = ci * cell_size - C * cell_size / 2 # 根据索引值计算每个正方形的起点(x坐标)

   ty = R * cell_size / 2 - ri * cell_size # 根据索引值计算每个正方形的起点(y坐标)

   cx = tx + cell_size / 2 # 正方形中心的x坐标

   cy = ty - cell_size / 2 # 正方形中心的y坐标

   return (cx, cy)

  def ctoi(cx, cy):

   """

   根据cx和cy求在列表中对应的索引

   :param cx: x轴坐标

   :param cy: y轴坐标

   :return: 元组,(ci,ri)

   """

   ci = ((C - 1) * cell_size / 2 + cx) / cell_size # 计算列索引

   ri = ((R - 1) * cell_size / 2 - cy) / cell_size # 计算行索引

   return (int(ri), int(ci)) # 返回行列索引的元组

  def get_map(filename):

   """

   功能:读取保存地图的文本文件内容到列表

   :param filename: 地图文件名

   :return: 地图列表

   """

   with open(filename, r) as f: # 打开文件

   fl = f.readlines() # 读取全部行

   maze_list = [] # 保存地图的列表

   for line in fl: # 将读取的内容以空格分割为二维列表

   line = line.strip() # 去掉空格

   line_list = line.split(" ") # 以空格进行分割为列表

   maze_list.append(line_list) # 将分割后的列表添加到地图列表中

   return maze_list # 返回地图列表

  def draw_square(ci, ri, colorsign):

   """

   功能:绘制组成地图的小正方形

   :param ci: 列索引

   :param ri: 行索引

   :param colorsign: 填充颜色

   :return:

   """

   tx = ci * cell_size - C * cell_size / 2 # 根据索引值计算每个正方形的起点(x坐标)

   ty = R * cell_size / 2 - ri * cell_size # 根据索引值计算每个正方形的起点(y坐标)

   map_t.penup() # 抬笔

   map_t.goto(tx, ty) # 移动到绘图起点(正方形的左上角)

   if colorsign == 1: # 判断是否为墙(如果为墙,则随机生成填充颜色)

   r = random.randint(100, 130) # 红色值

   g = random.randint(150, 180) # 绿色值

   map_t.color(r, g, 200) # 指定颜色为随机生成的颜色

   else:

   map_t.color(colorsign) # 设置为指定的通道颜色

   map_t.pendown() # 落笔

   map_t.begin_fill() # 填充开始

   for i in range(4): # 绘制正方形

   map_t.fd(cell_size)

   map_t.right(90)

   map_t.end_fill() # 填充结束

   map_t.ht() # 隐藏海龟光标

  def draw_map(mazelist):

   """

   功能:遍历地图列表绘制迷宫地图

   :param mazelist: 保存地图数据的列表

   :return:

   """

   turtle.tracer(0) # 隐藏动画效果

   global area_sign # 全局变量,记录入口和出口索引位置

   for ri in range(R): # 遍历行

   for ci in range(C): # 遍历列

   item = mazelist[ri][ci]

   if item in [1]: # 判断墙

   draw_square(ci, ri, 1) # 绘制墙

   elif item == "S": # 判断入口

   draw_square(ci, ri, road_color) # 绘制通道

   draw_sign(ci - 1, ri, 入口) # 标记入口

   area_sign[entry_i] = (ci, ri) # 保存入口索引

   elif item == "E": # 判断出口

   draw_square(ci, ri, road_color) # 绘制通道

   draw_sign(ci - 1, ri, 出口) # 标记出口

   area_sign[exit_i] = (ci, ri) # 保存出口索引

   else:

   draw_square(ci, ri, road_color) # 绘制通道

   turtle.tracer(1) # 显示动画效果

  def draw_sign(ci, ri, word):

   """

   功能:绘制入口和出口标记

   :param ci: 列索引

   :param ri: 行索引

   :param word: 标记文字内容

   :return:

   """

   cx, cy = itoc((ci, ri)) # 将索引位置转换为坐标位置

   sign_t.ht() # 隐藏海龟光标

   sign_t.penup() # 抬笔

   sign_t.goto(cx, cy) # 移动到标记位置

   sign_t.color(red) # 设置画笔为红色

   sign_t.write(word, font=(黑体, 12, normal)) # 绘制标记文字

  def win_tip():

   """

   功能:制作过关提示

   :return:

   """

   global level

   c_move_to(manual_t, (-150, 0))

   manual_t.color(blue)

   if int(level) == 3:

   manual_t.write(\n恭喜您顺利通关!, font=(黑体, 20, bold))

   turtle.onkey(turtle.bye, key=Return) # 监听按下Enter键退出游戏

   else:

   manual_t.write(\n恭喜过关!\n按下Enter进入下一关!, font=(黑体, 20, bold))

   level += 1

   manual_t.color(red)

   turtle.onkey(level_init, key=Return) # 监听按下Enter键

  def manual_move(d):

   """

   功能:手动走迷宫时通用探索并移动函数

   :param d: 向不同方面走时索引的变化规则

   :return:

   """

   dc, dr = d # 将表示方向的元组分别赋值给两个变量dc和dr,其中dc为x轴方向,dr为y轴方向

   rici = ctoi(round(manual_t.xcor(), 1) + dc * cell_size, round(manual_t.ycor(), 1) + dr * cell_size) # 获取行列索引

   point = mazeList[rici[0]][rici[1]] # 获取地图列表中对应点的值

   print(移动:, rici, point)

   if point == 0: # 通路

   manual_t.color(red)

   mazeList[rici[0]][rici[1]] = $ # 将当前位置标记为已探索

   manual_t.forward(cell_size) # 向前移动

   print(00)

   elif point == $: # 已探索

   manual_t.color(road_color) # 绘制和通道相同颜色的线,达到擦除痕迹的效果

   mazeList[rici[0] + dr][rici[1] - dc] = 0 # 将当前位置的前一个点设置为未探索(目的是取消标记)

   manual_t.forward(road_color) # 向前移动

   manual_t.color(red)

   elif point == E: # 出口

   win_tip()

  def up_move(): # 朝上

   manual_t.setheading(90) # 设置海龟朝向

   manual_move(direction[2]) # 手动探索并移动

  def down_move(): # 朝下

   manual_t.setheading(270) # 设置海龟朝向

   manual_move(direction[3]) # 手动探索并移动

  def left_move(): # 朝左

   manual_t.setheading(180) # 设置海龟朝向

   manual_move(direction[1]) # 手动探索并移动

  def right_move(): # 朝右

   manual_t.setheading(0) # 设置海龟朝向

   manual_move(direction[0]) # 手动探索并移动

  def manual_path():

   """

   功能:手动走迷宫

   :return:

   """

   manual_t.clear() # 清除绘图

   auto_t.ht() # 隐藏海龟

   auto_t.clear() # 清除绘图

   global mazeList # 定义全局变量

   mazeList = get_map(txt_path) # 重新读取地图数据

   # print(area_sign[entry_i][0],area_sign[entry_i][1])

   c_move_to(manual_t, itoc(area_sign[entry_i])) # 移动到入口位置

   manual_t.st() # 显示手动走迷宫所用的海龟光标

   manual_t.width(3) # 设置画笔粗细为3像素

   manual_t.color(red) # 设置画笔为红色

   manual_t.getscreen().listen() # 让海龟屏幕(TurtleScreen)获得焦点

   manual_t.getscreen().onkeyrelease(up_move, Up) # 按下向上方向键

   manual_t.getscreen().onkeyrelease(down_move, Down) # 按下向下方向键

   manual_t.getscreen().onkeyrelease(left_move, Left) # 按下向左方向键

   manual_t.getscreen().onkeyrelease(right_move, Right) # 按下向右方向键

  def auto_path():

   """

   功能:查看答案(自动走迷宫)

   :return:

   """

   global mazeList # 定义全局变量

   mazeList = get_map(txt_path) # 重新读取地图数据

   manual_t.ht() # 隐藏海龟

   manual_t.clear() # 清除绘图

   auto_t.clear() # 清除绘图

   auto_t.pensize(5) # 设置画笔粗细

   auto_t.speed(0) # 绘图速度

   auto_t.ht() # 隐藏海龟光标

   find(mazeList) # 开始探索

  def find(mazeList):

   """

   功能:开始探索

   :param mazeList: 地图列表

   :return:

   """

   auto_t.clear() # 清空帮助

   start_r, start_c = 0, 0

   for ri in range(R):

   for ci in range(C):

   item = mazeList[ri][ci]

   if item == "S":

   start_r, start_c = ri, ci

   auto_t.penup() # 抬笔

   draw_path(start_c, start_r)

   find_next(mazeList, start_c, start_r)

  def find_next(mlist, ci, ri):

   """

   功能:递归搜索判断是否为通路

   :param mlist: 地图列表

   :param ci: 列索引

   :param ri: 行索引

   :return: 布尔值,表示是否为通路

   """

   if mlist[ri][ci] == "E":

   imoveto(ci, ri) # 移动到出口

   return True

   if not (0 <= ci < C and 0 <= ri < R): # 判断位置是否不合法

   return False

   if mlist[ri][ci] in [1, $]: # 判断是否为墙或者已探索过的

   return False

   mlist[ri][ci] = "$" # 标记已探索过

   for d in direction: # 尝试从不同方向探索是否为通路,如果发现一条通路,则不再继续探索

   dc, dr = d # # 将索引变化规则的值分别赋值给dc和dr,其中dc为x轴方向,dr为y轴方向

   found = find_next(mlist, ci + dc, ri + dr) # 递归调用

   if found: # 如果是通路则绘制线路

   draw_path(ci, ri) # 绘制线路

   return True # 返回True,不再探索

   return False # 当所有方向都不通时,返回False

  def draw_path(ci, ri, color="green"): # 自动绘制用

   """

   功能:根据索引位置移动海龟(画线)

   :param ci: 列索引

   :param ri: 行索引

   :param color: 画笔颜色

   :return:

   """

   auto_t.st() # 显示海龟光标

   cx, cy = itoc((ci, ri)) # 将索引位置转换为坐标位置

   auto_t.color(color)

   auto_t.goto(cx, cy)

  def level_init():

   """

   功能:关卡初始化

   游戏规则:

   按下F2键开始手动走迷宫;按下F1键查看答案

   按下↑↓←→方向键控制小海龟移动,闯关成功后,按Enter进入下一关

   :return:

   """

   manual_t.clear() # 清除绘图

   auto_t.clear() # 清除绘图

   turtle.clear() # 清除绘图

   global txt_path, level, mazeList, R, C # 定义全局变量

   if level == 1: # 第一关的地图文件和背景

   txt_path = "map/map1.txt"

   levelbg = image/level1.png

   elif level == 2: # 第二关的地图文件和背景

   txt_path = "map/map2.txt"

   levelbg = image/level2.png

   elif level == 3: # 第三关的地图文件和背景

   txt_path = "map/map3.txt"

   levelbg = image/level3.png

   else:

   turtle.bye() # 退出程序

   return

   mazeList = get_map(txt_path) # 获取地图数据

   R, C = len(mazeList), len(mazeList[0])

   turtle.setup(width=C * cell_size + 50, height=R * cell_size + 100) # 根据地图调整窗口尺寸

   turtle.bgpic(levelbg) # 设置背景图片

   # 如果想要手动绘制关卡数,可以使用下面的两行代码

   cmoveto(turtle, (1 * cellsize - C * cellsize / 2, R * cellsize / 2+10))

   turtle.write(关卡:+str(int(level)), font=(宋体, 16, normal))

   turtle.ht() # 隐藏海龟光标

   draw_map(mazeList) # 绘制地图

  

  

四、效果图

  

  

1.运行代码

  

  

  

2.关卡一

  这是按住了F1所以才出现路线图的哦!

  

  

  

3.关卡二

  这是按住了F2所以是自己手动在闯关哈!

  

  

  

4.关卡三

  

  以上就是Python+Turtle制作海龟迷宫小游戏的详细内容,更多关于Python Turtle迷宫游戏的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: