GoLang写一个简单版生命游戏模拟器

文章目录

go 复制代码
package main

import (
	"fmt"
	"math/rand"
	"time"
)

const (
	width  = 80
	height = 15
)

// Universe 是一个二维网格
type Universe [][]bool

// NewUniverse 将返回一个空白的世界
func NewUniverse() Universe {
	u := make(Universe, height)
	for i := range u {
		u[i] = make([]bool, width)
	}
	return u
}

// Seed 用于在世界上随机激活一些细胞
func (u Universe) Seed() {
	for i := 0; i < (width * height / 4); i++ {
		u.Set(rand.Intn(width), rand.Intn(height), true)
	}
}

// Set 用于设置指定细胞的状态
func (u Universe) Set(x, y int, b bool) {
	u[y][x] = b
}

// Alive 会报告指定的细胞是否存活。如果给定的坐标不在世界范围之内,那么实行回绕
func (u Universe) Alive(x, y int) bool {
	x = (x + width) % width
	y = (y + height) % height
	return u[y][x]
}

// Neighbors 用于统计邻近细胞的存活数量
func (u Universe) Neighbors(x, y int) int {
	n := 0
	for v := -1; v <= 1; v++ {
		for h := -1; h <= 1; h++ {
			if !(v == 0 && h == 0) && u.Alive(x+h, y+v) {
				n++
			}
		}
	}
	return n
}

// Next 会返回指定细胞在下一代的状态
func (u Universe) Next(x, y int) bool {
	n := u.Neighbors(x, y)
	return n == 3 || n == 2 && u.Alive(x, y)
}

// String 会以字符串形式返回整个世界
func (u Universe) String() string {
	var b byte
	buf := make([]byte, 0, (width+1)*height)

	for y := 0; y < height; y++ {
		for x := 0; x < width; x++ {
			b = ' '
			if u[y][x] {
				b = '*'
			}
			buf = append(buf, b)
		}
		buf = append(buf, '\n')
	}
	return string(buf)
}

// Show 清空屏幕并打印整个世界
func (u Universe) Show() {
	fmt.Print("\x0c", u.String())
}

// Step 会将当前世界a的状态更新至下一代并将其存储在世界b中
func Step(a, b Universe) {
	for y := 0; y < height; y++ {
		for x := 0; x < width; x++ {
			b.Set(x, y, a.Next(x, y))
		}
	}
}

func main() {
	a, b := NewUniverse(), NewUniverse()
	a.Seed()
	for i := 0; i < 300; i++ {
		Step(a, b)
		a.Show()
		time.Sleep(time.Second / 30)
		a, b = b, a // Swap universes
	}
}

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

相关推荐
蒸蒸yyyyzwd4 分钟前
机试和Redis学习笔记
c++·笔记·面试
Yanjun2i27 分钟前
Agent学习记录四:多工具时如何处理
人工智能·python·学习·agent
辰辰观影1 小时前
AppleTV家庭影院大屏播放方案推荐
经验分享
恒锐丰科技林技术员1 小时前
EG1198:120V 宽压内置 MOS 降压 DC‑DC 电源芯片解析
经验分享·嵌入式硬件·硬件工程
果壳science1 小时前
《自然本源》如何实现狭义相对论的代数化
笔记·算法·几何学
1314lay_10071 小时前
C#调用Sql Server存储过程,并且使用传入表结构
数据库·经验分享·笔记·sqlserver·c#
传奇开心果编程1 小时前
【Xilem 0.4 基础语法学与练】第二课视图修饰符、列表渲染、组件拆分、memoize 性能优化
学习·rust·前端框架
szarron1 小时前
RF Demo Kit|NanoVNA 射频演示测试板完整上手教程,滤波器、衰减器、SOLT 校准学习板
开发语言·人工智能·学习·php·射频工程·频谱仪
A_nanda1 小时前
学习工业相机的大纲
学习·工业相机