生命游戏用python怎么实现

首先说明,本人python代码不规范,不可商用!
再次说明,这次使用IDLE,只用random模块,这是符号制作的,并非图画,如果有时间就会更新带图画的(tk模块)
一、前景
最近看见过很多关于用python实现生命游戏的帖子,我也很感兴趣,于是开始了编程
二、定义
在我的观念里,做什么事情时你要清楚这是什么,不要东拼西凑想当然(刚开始编程时我就是这样,深有体会)
通过搜索资料,我知道了几点
1.生命游戏并不是通常意义上的”游戏”, 它没有玩家各方之间的竞争, 也谈不上输赢。某种意义上,它就是一种人工模拟的“进化”。在康威定义的这个世界里,二维的“细胞”遵循特定的规则,从而一代代地“生长”“死亡”和“繁衍”。
这是网址https://xueqiu.com/5468961311/146698397#:~:text=生命游戏是一个零玩家游戏%E3%80%82,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞%E3%80%82%20一个细胞(如下图中的黑子),在下一个时刻的生死取决于相邻八个方格中(如下图中的白子)活着的或死了的细胞的数量%E3%80%82
2.这是一个单人游戏
3.这类似于一个文明的发展
三、模块选择
因为python本身就带有很多库,我们只需要使用random就行了

import random

输入这个模块导入的程序

四、初始化

# 设置网格大小
width = 50
height = 50

# 初始化网格
grid = [[random.choice([0, 1]) for _ in range(width)] for _ in range(height)]

这就是一个普通的初始化,注释已经写了,大家自行观看即可

五、第一个函数

def print_grid():
    for row in grid:
        print("".join(["*" if cell == 1 else " " for cell in row]))

这里是打印网格的函数

由星号(*)和空格( )组成的图形来表示生命游戏中的细胞

在这段代码中,grid 是一个二维列表,其中的每个元素是一个数字列表。如果列表中的某个数字是 1,则在打印输出中用星号(*)表示;如果数字是 0 或者其他非 1 的值,则用空格( )表示。

for row in grid: —— 这行代码表示一个循环,它会遍历 grid 中的每一行。

  1. print("".join(["*" if cell == 1 else " " for cell in row])) —— 这是一个嵌套的列表推导式,它首先遍历每一行中的每个单元格(cell),然后根据单元格的值决定打印星号还是空格:

    "*" if cell == 1 else " " —— 这是一个条件表达式,如果 cell 的值等于 1,则打印星号 "*",否则打印空格 " "
    • for cell in row —— 这是列表推导式的循环部分,它遍历当前行中的每个单元格。
  2. "".join([...]) —— 这行代码将列表推导式生成的字符串列表连接成一个单独的字符串,然后 print 函数将这个字符串打印出来。

  3. 数将这个字符串打印出来。

  4. 总的来说,这段代码的目的是将一个二维的数字数组以图形化的方式打印出来,其中 1 表示星号,其他值表示空格。这种表示方法常用于显示矩阵的可视化,例如在一些算法的演示中,或者在简单的数字游戏(如井字棋)中显示棋盘状态。

    所以,懂了下期出什么内容了吗?对了,就是井字棋

六、第二个函数

def count_neighbors(x, y):
    count = 0
    for i in range(max(0, x - 1), min(x + 2, width)):
        for j in range(max(0, y - 1), min(y + 2, height)):
            if (i, j) != (x, y) and grid[j][i] == 1:
                count += 1
    return count

这是用来计算邻居数量的一串代码,总之就是for in循环,非常简单,这里就不再多说,因为本文章侧重结果而不是讲解

七、更新网格

那么也是直接上代码

def update_grid():
    new_grid = [[0 for _ in range(width)] for _ in range(height)]
    for y in range(height):
        for x in range(width):
            neighbors = count_neighbors(x, y)
            if grid[y][x] == 1:
                new_grid[y][x] = 1 if 2 <= neighbors <= 3 else 0
            else:
                new_grid[y][x] = 1 if neighbors == 3 else 0
    return new_grid

这是一个更新之前画出来的网格的函数,也是for in,不在阐述

八、游戏主循环

def main():
    print("初始状态:")
    print_grid()
    running = True
    while running:
        input("按回车继续...")
        grid = update_grid()
        print("更新后的状态:")
        print_grid()

if __name__ == "__main__":
    main()

哈哈!终于到了激动人心的游戏主循环部分了!平时写代码就喜欢写着一部分,因为这一点都不繁琐,比前面的函数简单多了,虽然有我最讨厌的while循环,但是...

还是很好玩!

好了,回归正题

这里用上了之前的函数,比如#print_grid()#等等,剩下就是一些零散的和print了,也就没什么好说的

九、代码总结

哈哈!别一个一个复制了,我帮你整理好了,一些我认为需要的注释也写了,参见:

import random

# 设置网格大小
width = 50
height = 50

# 初始化网格
grid = [[random.choice([0, 1]) for _ in range(width)] for _ in range(height)]

# 打印网格
def print_grid():
    for row in grid:
        print("".join(["*" if cell == 1 else " " for cell in row]))

# 计算邻居数量
def count_neighbors(x, y):
    count = 0
    for i in range(max(0, x - 1), min(x + 2, width)):
        for j in range(max(0, y - 1), min(y + 2, height)):
            if (i, j) != (x, y) and grid[j][i] == 1:
                count += 1
    return count

# 更新网格
def update_grid():
    new_grid = [[0 for _ in range(width)] for _ in range(height)]
    for y in range(height):
        for x in range(width):
            neighbors = count_neighbors(x, y)
            if grid[y][x] == 1:
                new_grid[y][x] = 1 if 2 <= neighbors <= 3 else 0
            else:
                new_grid[y][x] = 1 if neighbors == 3 else 0
    return new_grid

# 游戏主循环
def main():
    print("初始状态:")
    print_grid()
    running = True
    while running:
        input("按回车继续...")
        grid = update_grid()
        print("更新后的状态:")
        print_grid()

if __name__ == "__main__":
    main()

怎么样?请把良心分享发在评论区里

十、总结

注意,这一段是拿ai写的,各位,我才五年级,还要考试,放过我吧!

这个脚本首先创建了一个随机初始化的二维网格,然后定义了打印网格、计算邻居数量和更新网格状态的函数。最后,它进入一个主循环,每次用户按下回车键,它都会更新并重新打印网格的状态。

要运行这个脚本,你需要将其复制到Python的IDLE中,然后执行。每次更新后,你需要手动按回车键来继续游戏。

总体来说是一个非常简单的游戏了,主要是我看很多教程一写就几百行,我不喜欢这样的代码,你看,48行就能搞定的事情,虽然简陋,但是能用,这多好?

关注ant,生活up

请各位点点关注吧!!!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值