前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mathematica 谜中智 | 趣味象棋 一马平川

Mathematica 谜中智 | 趣味象棋 一马平川

作者头像
WolframChina
发布2018-05-31 10:36:02
1.7K1
发布2018-05-31 10:36:02
举报
文章被收录于专栏:WOLFRAMWOLFRAM
吴飞

任职于上海微电子装备(集团)股份有限公司,创新业务主管,计算机仿真和软件开发学科带头人。他从2000年开始学习和使用 Mathematica,《Mathematica演示项目笔记》作者,Wolfram 语言的忠实粉丝,Wolfram 社区贡献者之一。

谜题二:趣味象棋 一马平川

引言

"Thus tomorrow, as I have said, will be accomplishedwhat I so much desire, enabling me lawfully to roam through all the fourquarters of the world seeking adventures on behalf of those in distress, as isthe duty of chivalry of knights-errant like myself, whose ambition is directedto such deeds." — Miguel de Cervates, Don Quixote, Chapter 3, 1615 (translatedby John Ormsby).

“况且明天,我说过,就可以完成我的夙愿,就可以周游四方,到处征险,为穷人解难了,这是骑士和像我这样的游侠的责任。我生来就渴望这样的业绩。” —— 塞万提斯,《唐吉坷德》,刘京胜译

教学

使用函数:Graphics, Texture, Image,Graphics3D, Map, Table

象棋是深受国人喜爱的棋类活动。今天趁这个谜题,我们先来聊聊个话题,那就“纯 Mathematica”,或者说玩 Mathematica 的态度。中国科技创新力不强,或者说原创力不足,其实除了基础薄弱以外,很大程度上就是态度。什么东西都要去抄,难的也要抄,简单的也要去抄,抄还抄不像,抄完了还是不懂。就像中国一位教授所言:“你说指望一帮只会在大学里抄作业的学生将来能搞出什么科技原创?”

鄙人不才,借今天这个小谜题,就“抄袭”这个问题也来谈两个层次。

第一:简单的东西,不要去抄,要自己搞。归根结底,中国人对知识产权的观念淡漠。哪怕再简单的一件设计、一张照片,那是别人东西,不要随便乱拿。你完全可以自己搞嘛,你自己搞的未必比他人的差,为什么要去拿别人的呢。简单的东西也去抄,那就是懒汉、愚夫的表现了,会被别人看不起的。

绘制棋子

我们举个例子,譬如现在我们要设计一套中国象棋了。当然,网上有许多中国象棋的照片和图案,但那是别人的设计,别人的作品,你可以看看或是参考,但不能随便拿过来就用。

再具体一点,现在我们来设计一枚棋子“马”。用 Mathematica 搞一下,很简单嘛,几行代码、三两个步骤就搞定了,而且可以在图形 Graphics 和图像 Image 之间自由来回的穿梭,这样才比较符合马那种自由奔放的精神嘛。

首先,我们用 GraphicsText 生成一个黄金底色的马字的图形,然后再用 Image 把它变成图像,ImageCrop 把多余的边角料裁剪掉。

接着,我们用 Graphics3DTexture 生成三维的图形。注意:这里其实已经把原来的二维图像又变成一个三维的图形了。

最后,我们结合以上成果,自定义一个函数,把这张三维图再贴到一个鼓形棋子的三维图形上。

三行代码导出一个小动画,为了让大家再看清楚一下。记住:我们可是黄金棋子,高贵的黄金骑士,不是下三路的小贼。

好了,马的棋子有了,是不是很简单,效果也不差。为什么还要去拿别人的东西呢,或者PS别人的象棋照片呢?

你看自己搞就是有这点好处,我想怎么改都可以,随心所欲,自由舒畅。而且不必担心别人什么时候会告我剽窃,只有我告别人的份,没有我当被告的时候。如下我们再添几个字,把其他几个棋子也叫出来玩玩。

简体字和繁体字本来就都是汉语,一起来吧。

好了,分分钟的事,一副象棋不是都有了嘛。当然,这时候你想再发挥一下,觉得还有灵感在涌动,还有才艺未展现,有想“重新发明”、“重新定义”一下中国象棋的冲动,这也完全是可以的。由于篇幅的关系,我就不演示了。

总之,简单的东西就不要抄袭了,自己搞一下,玩得就是态度。所有的素材、图案、图形、图像和动画,都是 Mathematica 代码生成的,对不对?这就叫“纯 Mathematica”。

绘制棋盘

中国象棋对弈的红黑双方,各持16个棋子在10行9列的棋盘上展开谋略,棋子的位置都落在经纬线的交点上,共90个位置。

棋子有了,缺个棋盘。画个棋盘,那还不简单。横竖先拉几条线出来,士要走斜线,那就拉几根对角线喽;稍微有点特殊的地方,像炮位、卒位啦,搞个小图案点缀一下;最后再写上四大字“楚河汉界”。这样不就完了嘛,还有吗?

棋盘和棋子都有了,你可以用 Epilog 函数把棋子放在棋盘上了,提示一下函数用法,下面我们就正式揭开本期谜面。

迷面

在象棋中,马的走法规定为斜向跳跃两格为一步,可以在棋盘上向前后左右,四个方向,共八个位置,进行跳跃。假设棋盘上仅有一枚棋子“马”,如下图所示,此马可以连续跳动,下图中马跳动了9步,走到了第10个位置(包括起点和终点)。

问:当马的初始坐标位置从{8,1}开始(即x=8,y=1;或者说第8列第1行时),能否找到一种步骤或路径,令这匹马一次性走遍棋盘上所有的位置(共90个),且落棋位置没有重复?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WOLFRAM 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 吴飞
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档