Game of Life——用Python实现简单的元胞自动机
Acid

Python课老师留了一个编程大作业 两周时间 要用Python实现简单的元胞自动机 瞅了一眼介绍的文档 好家伙六页doc 地铁老人看手机.jpg
好吧 耐下性子仔细看了看发现就是个模拟 没有什么要动脑子的地方
两小时写完代码 一个半小时都浪费在看文档了淦 大作业✖ 大文档✔ 后来发现有同学发了介绍元胞自动机的视频 一看就懂

感觉

  1. 不好玩
  2. 诶 有些图形挺好看的
  3. 有意思

经过

  1. 粗略过了一遍文档 哦 原来就是个模拟
  2. 写着写着 诶 不对 老师在文档里对每个函数有好多要求 淦 不需要这么麻烦吧
  3. 算了 还是按老师说的来吧
  4. 作业发布两小时后完成了第一版
  5. 淦 两周的作业两小时做完了 那接下来干什么
  6. 游戏?!既然是作为一个游戏 只有命令行也太磕碜了吧 加个turtle!
  7. 学习turtle的一些常用函数
  8. 做出了带图形化的元胞自动机游戏
  9. 优化游戏体验 优化用户操作逻辑 添加必要注释
  10. 代码交给了老师
  11. 看了混乱博物馆的视频 另一种计算机??不能理解……
  12. 两周之后再看程序 淦啊 写了个while(True): 这波串味了啊 没看出来就交作业了淦
  13. 讲了OO 那再用这作业练手一下OOP叭(摒弃了老师对函数的要求 并尽力压短了代码行数)

代码

  • 命令行版和turtle版感觉代码不够简洁 就不贴出来了 反正很简单的东西
    这是turtle版本的运行效果
  • 接下来是OOP版本的元胞自动机程序代码
  • 用了列表推导式和三元运算符等来尽力缩短代码行数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# code by Acid
import os, random, copy

class Cell(object):
'''细胞对象'''
def __init__(self, life_prob):
self.alive = random.random() < life_prob

def __str__(self):
return ("* " if self.alive else " ")

def __eq__(self, another):
return self.alive == another.alive

def update(self, h, w, screen, height, width):
cnt = 0
for i in range(h - 1, h + 2):
for j in range(w - 1, w + 2):
if i >= 0 and i < height and j >= 0 and j < width:
cnt += (screen[i][j].alive if i != h or j != w else 0)
self.alive = (True if cnt == 3 else (self.alive if cnt == 2 else False))

class Screen(object):
'''生存空间对象'''
def __init__(self, para, life_prob):
self.height, self.width = int(para[0]), int(para[1])
self.screen = [[Cell(life_prob) for i in range(self.width)] for j in range(self.height)]

def __eq__(self, another):
return self.screen == another.screen

def show(self):
os.system("cls")
for i in range(self.height):
for j in range(self.width):
print("|" + str(self.screen[i][j]) if j == 0 else (str(self.screen[i][j]) + "|\n" if j + 1 == self.width else self.screen[i][j]), end = "")

def update(self, screen):
for i in range(self.height):
for j in range(self.width):
self.screen[i][j].update(i, j, screen, self.height, self.width)

if __name__ == "__main__":
screen = Screen(input("请输入行数和列数:").split(), float(input("请输入细胞生存概率:")))
screen.show()
cnt = 0
while True:
if input() == 'q':
print("退出游戏")
os._exit(0)
else:
temp_screen = copy.deepcopy(screen)
screen.update(temp_screen.screen)
if screen == temp_screen:
print("状态无更新,游戏结束")
os._exit(0)
else:
cnt += 1
screen.show()
print("第", cnt, "次迭代")

总结

  • 看着这六十行代码 再看看原版的一百多行 成就感还是有的
  • 练习了turtle、OOP、列表推导式、三元运算符、解包裹等操作 虽然作业本身简单 但是学到的东西还是挺多的 针不戳!
  • 本文标题:Game of Life——用Python实现简单的元胞自动机
  • 本文作者:Acid
  • 创建时间:2020-12-16 20:33:05
  • 本文链接:https://blog.acidwits.xyz/2020/12/16/0010/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论