中国象棋想必大家都玩过,突发奇想,想着怎么用python把中国国粹的中国象棋做出来呢??????

首先老样子看看用python做出来的效果:

国粹——中国象棋

  • 第一步:导入资源包

  • 第二步:初始化

  • 第三步:定义棋子名称与坐标

  • 第四步:绘制棋盘

  • 第五步:定义落子函数

  • 第六步:鼠标点击事件

第一步:导入资源包

这次利用到的还是海龟turtle

import turtle 复制代码

第二步:初始化

初始化过程中首先获得海龟的钢笔,接着设置窗口的大小、标题和背景。

# 初始化 pen = turtle.Pen()# 获取海龟的画笔

turtle.setup(714,800)# 设置窗口的大小

turtle.title("中国象棋")# 设置窗口的标题

turtle.bgcolor("#F4C79E")# 设置窗口的背景

pen.hideturtle() turtle.tracer(False)

复制代码

第三步:定义棋子名称与坐标

中国象棋中由車、馬、相(象)、士(仕)、炮、卒、将、帥(帅)组成,各个棋子有相应的坐标。这个可供参考,如果有问题可以自行设置相应的坐标。

array = [ # A方棋子 { "text": "車", "role": "A", "pix": (-330, 369) }, { "text": "馬", "role": "A", "pix": (-247.0, 369.0) }, { "text": "象", "role": "A", "pix": (-166.0, 369.0) }, { "text": "士", "role": "A", "pix": (-86.0, 368.0) }, { "text": "将", "role": "A", "pix": (-5.0, 369.0) }, { "text": "士", "role": "A", "pix": (79.0, 368.0) }, { "text": "象", "role": "A", "pix": (159.0, 368.0) }, { "text": "馬", "role": "A", "pix": (239.0, 367.0) }, { "text": "車", "role": "A", "pix": (318.0, 369.0) }, { "text": "卒", "role": "A", "pix": (-329.0, 126.0) }, { "text": "卒", "role": "A", "pix": (-167.0, 126.0) }, { "text": "卒", "role": "A", "pix": (-6.0, 126.0) }, { "text": "卒", "role": "A", "pix": (156.0, 126.0) }, { "text": "卒", "role": "A", "pix": (319.0, 126.0) }, { "text": "炮", "role": "A", "pix": (-248.0, 209.0) }, { "text": "炮", "role": "A", "pix": (239.0, 208.0) }, # B方棋子 { "text": "車", "role": "B", "pix": (-330.0, -359.0) }, { "text": "馬", "role": "B", "pix": (-247.0, -359.0) }, { "text": "相", "role": "B", "pix": (-166.0, -359.0) }, { "text": "仕", "role": "B", "pix": (-86.0, -359.0) }, { "text": "帥", "role": "B", "pix": (-5.0, -359.0) }, { "text": "仕", "role": "B", "pix": (79.0, -359.0) }, { "text": "相", "role": "B", "pix": (159.0, -359.0) }, { "text": "馬", "role": "B", "pix": (239.0, -359.0) }, { "text": "車", "role": "B", "pix": (318.0, -359.0) }, { "text": "卒", "role": "B", "pix": (-329.0, -126.0) }, { "text": "卒", "role": "B", "pix": (-167.0, -126.0) }, { "text": "卒", "role": "B", "pix": (-6.0, -126.0) }, { "text": "卒", "role": "B", "pix": (156.0, -117.0) }, { "text": "卒", "role": "B", "pix": (319.0, -117.0) }, { "text": "炮", "role": "B", "pix": (-248.0, -199.0) }, { "text": "炮", "role": "B", "pix": (239.0, -199.0) }, ] 复制代码

第四步:绘制棋盘

如下图,棋盘是由网格组成,中间有一个“楚河——漢界”。

# 绘制棋盘函数 def draw(): # 绘制网格边框 pen.penup() pen.setposition(-360, 402) pen.pendown() pen.color("#6E3F25") pen.width(30) for x in range(1,5): if x % 2 != 0: pen.forward(710) else: pen.forward(795) pen.right(90) # 绘制网格 pen.penup() pen.setposition(-330, 370) pen.width(2) pen.pendown() for x in range(9): pen.forward(650) pen.backward(650) pen.right(90) pen.forward(81) pen.left(90) pen.forward(650) pen.left(90) for x in range(8): pen.forward(730) pen.backward(730) pen.left(90) pen.forward(81) pen.right(90) pen.penup() pen.setposition(-280, 6) pen.pendown() pen.pencolor("#F4C79E") pen.right(90) pen.width(79) pen.forward(550) pen.width(1) pen.penup() pen.setposition(-230, -25) pen.color("#6E3F25") pen.write("楚河", align="center", font=("Baoli TC", 50, "bold")) pen.penup() pen.forward(450) pen.write("漢界", align="center", font=("Baoli TC", 50, "bold")) pen.penup() for x in [[-3.0, 290.0], [-4.0, -278.0]]: pen.up() pen.setposition(x) pen.down() pen.setheading(45) pen.pendown() pen.width(2) pen.color("#5E3F25") for x in range(4): pen.forward(114) pen.backward(114) pen.left(90) for x in array: if x["role"] == "A": chess(x["text"], x["pix"], "#A46A0C", "#2F1500") else: chess(x["text"], x["pix"], "#E69772", "#AB2A0E") turtle.update()# 刷新图像 复制代码

第五步:定义落子函数

如下图,我们每一次点击棋子并落下过程中,后台会显示我们点击棋子的状态和是否落子。

# 落子函数 def chess(text, pix, bgcolor, textcolor): """ text: 落子显示文本 pix: 落子坐标 bgcolor: 背景颜色 textcolor:落子颜色 """ pen.penup() pen.setposition(pix) pen.pendown() pen.color("#6E3F25") pen.dot(70) pen.color(bgcolor) pen.dot(55) pen.color("white") pen.penup() pen.setheading(270) pen.forward(25) pen.color(textcolor) pen.write(text, align="center", font=("Baoli TC", 40, "bold")) 复制代码

落子情况:

第六步:鼠标点击事件

当我们点击棋子时会触发相应的时间,如上图所示,比如当我们点击“卒”时,它会显示我们点击的是哪一方的棋子,棋子的坐标是什么。

def click(x, y): global priChess if priChess == {}: for z in array: if abs(z["pix"][0] - x) <= 35 and abs(z["pix"][1] - y) <= 35: print("发现目标:", z) priChess = z pen.penup() pen.setposition(z["pix"]) pen.color("white") pen.penup() pen.setheading(270) pen.forward(25) pen.write(z["text"], align="center", font=("Baoli TC", 40, "bold")) break else: print("落子") priChess["pix"] = (x, y) array.append(priChess) priChess = {} pen.reset() draw()

本文章素材来源于网络,如有侵权请联系删除。

程序员大佬教你如何用python制作中国象棋!一看就会相关推荐

  1. 怎么用python制作简单的程序-神级程序员教你如何用python制作一个牛逼的外挂!...

    玩过电脑游戏的同学对于外挂肯定不陌生,但是你在用外挂的时候有没有想过如何做一个外挂呢?(当然用外挂不是那么道义哈,呵呵),那我们就来看一下如何用python来制作一个外挂.... 我打开了4399小游 ...

  2. 【程序员股民系列】如何用python, pandas, numpy, matplotlib绘制每日个股成交额图

    上次分享了一段代码用于绘制每日行业交易额的图: [程序员股民系列]如何用python, pandas, numpy, matplotlib绘制每日行业成交额图 分析粒度略粗,只到行业这一层,把代码稍微 ...

  3. 手把手教你如何用Python制作一个电子相册?末附python教程

    这里简单介绍一下python制作电子相册的过程,主要用到tkinter和pillow这2个库,tkinter用于窗口显示照片,pillow用来处理照片,照片切换分为2种方式,一种是自动切换(每隔5秒) ...

  4. 教你如何用python制作平面直角坐标系模拟器 python项目小发明 【安安教具】-【数学】-【平面直角坐标系】模拟器

    平面直角坐标系和之前的数轴模拟器有异曲同工之妙,但是作为一个二维的软件,肯定是要难一些的... [安安教具]-[数学]-[数轴]模拟器 教你如何用python制作数轴模拟器 python 小项目创作_ ...

  5. 教你如何用python制作黑板模拟器 python 项目小发明 【安安教具】-【工具】-【黑板】模拟器

    黑板模拟器是一个多线程控制尝试,需要做到通过tkinter实现对鼠标的控制和监督.鼠标在移动时会有一个线程来检测鼠标的位置,计算窗口的位置,计算出鼠标在窗口中的位置,结合canvas画布实现对黑板的涂 ...

  6. 教你如何用python制作三角形模拟器 python项目小发明 【安安教具】-【数学】-【三角形】模拟器

    三角形的三个点互相连接组成了一个平面图形,我们如何用python制作一个可以展示各种三角形的软件呢? 我们先看看效果: 这个东西要如何使用呢?我们看一下视频: 三角形模拟器 可以看到,控制三角形的三个 ...

  7. python数据可视化第三方库有哪些_数据可视化!看看程序员大佬都推荐的几大Python库...

    数据可视化是数据分析中极为重要的部分,而数据可视化图表(如条形图,散点图,折线图,地理图等)也是非常关键的一环.Python作为数据分析中最流行的编程语言之一,有几个库可以创建精美而复杂的数据可视化, ...

  8. 【程序员股民系列】如何用python, pandas, numpy, matplotlib绘制每日行业成交额图

    最近这两天股民基友们可能很多亏得底裤都没了,该说点什么呢,心态放平吧: 想长期混迹股市,还是要选基本面好的行业和个股,也要关注一些近期行业动态.当然这里面有很多维度和技巧,掌握得越多,驾驭股市的功力就 ...

  9. python程序员专用壁纸_数据可视化!看看程序员大佬都推荐的几大Python库

    数据可视化是数据分析中极为重要的部分,而数据可视化图表(如条形图,散点图,折线图,地理图等)也是非常关键的一环.Python作为数据分析中最流行的编程语言之一,有几个库可以创建精美而复杂的数据可视化, ...

最新文章

  1. Imagenet VGG-19网络加载和特征可视化
  2. 基于黄金分割的修正Powell算法
  3. [Python人工智能] 二十九.什么是生成对抗网络GAN?基础原理和代码普及(1)
  4. match_phrase搜不出来,怎么办?
  5. Jenkins修改管理员密码.
  6. mysql 插入中文 ERROR 1366 (HY000): Incorrect string value: '\xE7\x8E\x9E\x97' for column
  7. 程序从高版本降到2.0,数据集报错 TypedTableBase
  8. Android自定义视频播放器
  9. hashmap的底层
  10. VS2017社区版离线下载
  11. 英读廊——为什么打印机不使用RGB颜色体系而是CMYK体系
  12. qt 在ubuntu下的下载安装及测试
  13. 电脑qq传到我的android文件在哪里,怎么找到已经发送到手机微信和QQ上的资料保存文件夹(安卓)...
  14. 金庸武侠十大外功排行
  15. 事务前沿研究 | 隔离级别的追溯与究明,带你读懂 TiDB 的隔离级别(上篇)
  16. opengl开发环境搭建
  17. 7个免费小巧的软件,让你的电脑更好用
  18. Scilab常用的命令。
  19. Social Network之缘分
  20. java计算机毕业设计基于springboot+vue+elementUI的旅游网站(源码+数据库+Lw文档)

热门文章

  1. Android 动画基础知识学习(下)
  2. 前端开发:Vue组件中的冒号用法
  3. cadence Virtuoso ADE原理图库中的VCVS(压控电压源)使用
  4. 虚拟机安装教程win10_虚拟机安装实战教程
  5. docker容器下载vim
  6. 0x0000007B:A problem has been detected and windows has been shut down to prevent damage to your Comp
  7. 开篇“给自己定一个目标,明年7月去实现。希望不是一时的兴起。”
  8. 微信小程序参数传递获取当前页面的url和参数
  9. 软考笔记——第七章--数据结构
  10. c语言程序设计试题1253,2017年1月试卷号1253C语言程序设计A.pdf