2022 Hackathon: 字符画与康威生命游戏

苏州大学计算机爱好者协会 Hackathon 2022 赛题

以下两题请任选一题完成

Q1: 字符画

背景

字符画/ASCII艺术,是指在计算机中使用字符组成图片的一种艺术形式。其大致可以分为以下几种:

  1. 西方式表情符号:受限于ASCII字符集,其组成的图像与表达的意思都较为简单,通常需要旋转90°阅读。

  2. 东方式表情符号/颜文字:得益于东方语言丰富的字符与标点符号,其在形式和含义上都较前者更加复杂。

    (⁄ ⁄•⁄ω⁄•⁄ ⁄) (≧∇≦)/ ∩(·ω·)∩ (T▽T) (._.)~
    (=・・=) (-‸ლ) ( ゚ Д゚) (づ ̄ ³ ̄)づ
    (ノಠ益ಠ)ノ彡┻━┻ ┬─┬ノ( º _ ºノ)

以上二者都是单行的字符画,常在社交平台上的日常对话中被使用(不过近几年国内外emoji和表情包等图片式表情符号的发展使它们日渐式微)。

  1. 打字机风格/打字机艺术(Typewriter Art):这是最早的字符画之一,下图中展示了1875年1月6日美国一份报纸上刊登的广告(来源:wikipedia - ASCII art),它们都利用打字机艺术使广告引人注目。
  1. 灰度字符画:即按照相同大小的不同ASCII字符所占面积组成灰度级,并用这些灰度级组合成一张图片。下图为这种形式的土星(来源:ASCII art)。在支持对单个字符指定颜色的软件内,这种方式也可以被用来制作彩色字符画。
  1. 矢量字符画:这些字符画通常会在图中加入一些线形字符来对线条作视觉引导,并使用灰度字符画的方式对色块进行填充,下图为这种形式的初音未来(来源:Ascii Art Archives for Recycle)。

此外,这种形式也被用于制作命令行界面中展示的标题文字,且有各种风格。例如(来源:Text to ASCII Art Generator):

题目

  1. 绘制一幅字符画,或者选择一幅你们喜欢的图片并将其转化为字符画。
  2. 编写程序,使其能自动将文字或图片转化为字符画,并尽可能优化结果的观感。你可以选择完善我们提供的示例程序
  3. 【可选】改进程序,将生成的字符画渲染为 PNG/JPEG(位图)、html(网页)、pdf(文档)或svg(矢量图)等格式,使其在不同环境的呈现效果一致。
  4. 【可选】改进程序,使其能逐帧处理视频,并将结果渲染到视频内。

关于本题的帮助请参见:2022 Hackathon: 字符画 示例程序与帮助

参考资料

下面是可能有用的资料:

  1. Emojipedia(测试图片可以从这里获取)
  2. 方块元素 - 维基百科
  3. ASCII艺术 - 维基百科
  4. 等宽字体 - 维基百科
  5. Pillow 库官方文档
  6. colorama 库 | Github
  7. svgwrite 库 | Github
  8. argparse - Python 3.11 官方文档
  9. Text to ASCII Art Generator
  10. Jave:使用Java编写的字符画编辑器
  11. HTML(超文本标记语言) | MDN
  12. HTML 简介 - 学习 Web 开发 | MDN

Q2: 康威生命游戏

背景

康威生命游戏(Conway’s Game of Life),又称康威生命棋,是英国数学家 John Horton Conway 在1970年发明的元胞自动机。康威生命游戏在充分大的棋盘(模拟世界)上运行,棋盘的每个格子被称为一个细胞,对于棋盘内的每个细胞,只有五条规则:

  • 每个细胞有存活与死亡两种状态,每个细胞只与以自身为中心的周围八格细胞产生互动;
  • 当前细胞为存活状态时,当周围的存活细胞低于2个时(不包含2个),该细胞变成死亡状态(模拟生命数量稀少);
  • 当前细胞为存活状态时,当周围有2个或3个存活细胞时,该细胞保持原样;
  • 当前细胞为存活状态时,当周围有超过3个存活细胞时,该细胞变成死亡状态(模拟生命数量过多);
  • 当前细胞为死亡状态时,当周围有3个存活细胞时,该细胞变成存活状态(模拟繁殖)。

整个游戏从t=0开始模拟,每一步模拟会对棋盘上所有细胞运用上述五条规则,得到下一步的棋盘。在这个游戏中,玩家是这个模拟世界里的神,可以旁观模拟世界内细胞的发展、随意向棋盘中添加、删除细胞,甚至是通过编程改变模拟世界的规则。

题目

我们编写了一个康威生命游戏的模拟程序,你可以在比赛中使用它,也可以随意更改代码实现你期望的效果。关于代码与使用说明请见:2022 Hackathon: 康威生命游戏 示例程序与使用说明

除了我们编写的模拟程序之外,你也可以使用其它模拟程序,例如:

以下是你在本题可以尝试探索的几个方向:

  1. 游玩康威生命游戏,并尝试在其中创建能稳定存在并增殖的生命(可以使用已发现的模式,见 https://conwaylife.com/wiki/ )。
  2. 尝试构建高生存力的生命体,即最大化一定时间内增殖的细胞数初始细胞数之比。
  3. 编写程序,修改或添加生命游戏的规则,例如:
    • 改变基础规则的阈值;
    • 扩大单个细胞的互动范围;
    • 每过一定时间随机消灭世界内一半的活细胞;
  4. 改进程序或为程序添加功能,例如:
    • 利用方块元素中的半高方块代替两个全高方块(也就是每一行字符对应模拟世界里的两行细胞),让程序可以在相同大小的命令行界面中展示四倍的细胞;
    • 活细胞死亡后在地图上留下标记;
    • 跟踪种群(初始状态聚集在一起的一群细胞)的发展,并使用颜色(colorama 库)标记不同种群(通过规则5诞生的细胞的颜色与周围细胞中占多数的颜色相同),这样可以展示不同种群争夺生存资源(地盘)的过程。

参考资料

  1. LifeWiki
  2. Numpy 官方文档:英文 中文
  3. argparse - Python 3.11 官方文档
  4. colorama 库 | Github
  5. Conway’s Game of Life - Wikipedia
  6. 【科普】康威生命游戏——孤独会致命,拥挤也一样 - 知乎

比赛规则

本次比赛你可以查阅任意资料,但是请尽可能避免直接照搬网上的代码的情况。

请在星期日(7月6日)15:00之前完成你们的作品,期间你可以(非强制)在比赛场地(博远楼104-107)讨论交流与编写代码,会有工作人员现场负责技术指导。如果遇到了技术问题,你可以在比赛场地寻找技术指导,或是在比赛群内询问。7月6日15:00之后是作品展示环节,届时各组将上台展示作品、运行代码,并由评委对作品打分,打分的结果将作为最终成绩。

比赛期间请密切关注比赛群内的消息,关于比赛的任何消息我们都会在群内通知。