用turtle绘制中国象棋

新手上路/超详细!!

开始绘制
上半部分的棋盘

下半部分的棋盘

画出棋盘边框

画出帅府和将营

绘制兵炮标记

运用函数来绘制

绘制棋子

运用函数来绘制

写“楚河汉界”

源代码
import turtle as t #引用turtle库
t.speed(1) #最快画笔速度
width=50 #设置正方形边长
x=-4width #原始位置为(0,0),为了使棋盘居 中,调整x和y的值
y=5
width
a=0 #记录行数
t.penup() #提起画笔
t.goto(x,y) #移动位置
t.pendown() #放下画笔
for z in range(4): #画出4行正方形
for j in range(8): #画出一行8个正方形
for i in range(2): #画出1个正方形
t.forward((1+j)width)
t.left(90)
t.backward(width) #往当前方向的反方向移动
t.left(90)
t.penup()
t.goto(x,y-width
(z+1)) #移动到下一行
t.pendown()
a=a+1 #记录已经画了几行
a=a+1 #加上“楚河汉界”的那一行
t.penup()
t.goto(x,y-width*(a)) #移动到下半区域画棋盘
t.pendown()

for z in range(4): #与上文同理
for j in range(8):
for i in range(2):
t.forward((1+j)width)
t.left(90)
t.backward(width)
t.left(90)
t.penup()
t.goto(x,y-width
(z+a+1))
t.pendown()

t.penup()
t.goto(x-width2/5,y+width2/5) #移动到边框的起点
t.pendown()

for i in range(2): #画出边框
t.forward(8width+4/5width)
t.left(90)
t.backward(9width+4/5width)
t.left(90)

t.penup()
t.goto(x+3width,y) #绘制帅府和将营,即两条斜线。移动到起点
t.right(45) #斜线的夹角
t.pendown()
t.forward(2
width*(20.5)) #斜线的长度,“xn”的意义为x的n次幂

t.penup() #同理
t.goto(x+3width,y-width7)
t.pendown()
t.forward(2width(2**0.5))

t.penup() #同理
t.goto(x+3width,y-2width)
t.left(90)
t.pendown()
t.forward(2width(2**0.5))

t.penup() #同理
t.goto(x+3width,y-width9)
t.pendown()
t.forward(2width(2**0.5))

t.right(45) #将画笔转回水平方向

def draw(x,y): #绘制兵炮标记的函数
t.penup()
t.goto(x-9,y+3) #令画笔回到初始设定的位置
for i in range(4):
t.pendown()
t.forward(6)
t.left(90)
t.forward(6)
t.right(90)
t.penup()
t.forward(6)
t.pendown()
t.right(90)
t.penup()

draw(x+width,y-2width) #传入要画标记的位置坐标
draw(x+7
width,y-2width) #画出上半部分棋盘的标记
draw(x,y-3
width)
draw(x+2width,y-3width)
draw(x+4width,y-3width)
draw(x+6width,y-3width)
draw(x+8width,y-3width)

draw(x+width,y-7width) #画出下半部分棋盘的标记
draw(x+7
width,y-7width)
draw(x,y-6
width)
draw(x+2width,y-6width)
draw(x+4width,y-6width)
draw(x+6width,y-6width)
draw(x+8width,y-6width)

def drawCircle(x,y,w,radius): #绘制棋子的函数,传入棋子的坐标,文字,半径
t.penup()
t.goto(x,y-2/5width)
t.pendown()
t.pensize(3) #调整画笔大小
t.begin_fill() #准备开始填充
t.fillcolor(‘white’)
t.circle(radius)
t.penup()
t.goto(x-3/10
width,y-3/10*width) #调整画笔位置,使文字居中
t.pendown()
t.write(w,font=(‘隶书’,27,‘normal’))
t.end_fill() #结束填充

drawCircle(-4width,5width,“车”,20) #传入数据,画出上半部分棋盘的棋子
drawCircle(-3width,5width,“马”,20)
drawCircle(-2width,5width,“象”,20)
drawCircle(-1width,5width,“士”,20)
drawCircle(0width,5width,“将”,20)
drawCircle(1width,5width,“士”,20)
drawCircle(2width,5width,“象”,20)
drawCircle(3width,5width,“马”,20)
drawCircle(4width,5width,“车”,20)

drawCircle(-4width,-4width,“车”,20) #传入数据,画出下半部分棋盘的棋子
drawCircle(-3width,-4width,“马”,20)
drawCircle(-2width,-4width,“象”,20)
drawCircle(-1width,-4width,“士”,20)
drawCircle(0width,-4width,“将”,20)
drawCircle(1width,-4width,“士”,20)
drawCircle(2width,-4width,“象”,20)
drawCircle(3width,-4width,“马”,20)
drawCircle(4width,-4width,“车”,20)

drawCircle(-4width,2width,“卒”,20) #传入数据,画出上半部分棋盘的棋子
drawCircle(-3width,3width,“炮”,20)
drawCircle(-2width,2width,“卒”,20)
drawCircle(0width,2width,“卒”,20)
drawCircle(2width,2width,“卒”,20)
drawCircle(3width,3width,“炮”,20)
drawCircle(4width,2width,“卒”,20)

drawCircle(-4width,-1width,“兵”,20) #传入数据,画出下半部分棋盘的棋子
drawCircle(-3width,-2width,“砲”,20)
drawCircle(-2width,-1width,“兵”,20)
drawCircle(0width,-1width,“兵”,20)
drawCircle(2width,-1width,“兵”,20)
drawCircle(3width,-2width,“砲”,20)
drawCircle(4width,-1width,“兵”,20)

t.penup()
t.goto(x+1.7width,y0*width) #移动到棋盘分界线处
t.pendown()
t.write(‘楚’,font=(‘隶书’,27,‘normal’))

t.penup()
t.goto(x+3width,y0*width)
t.pendown()
t.write(‘河’,font=(‘隶书’,27,‘normal’))

t.penup()
t.goto(x+4.3width,y0*width)
t.pendown()
t.write(‘汉’,font=(‘隶书’,27,‘normal’))

t.penup()
t.goto(x+5.6width,y0*width)
t.pendown()
t.write(‘界’,font=(‘隶书’,27,‘normal’))

t.done()

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月亮岛岛主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值