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
	}
}

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

相关推荐
q***01772 小时前
Linux 下安装 Golang环境
linux·运维·golang
稚辉君.MCA_P8_Java2 小时前
Gemini永久会员 Go 实现动态规划
数据结构·后端·算法·golang·动态规划
清云逸仙2 小时前
使用AI(GPT-4)实现AI prompt 应用--自动审核评论系统
人工智能·经验分享·ai·语言模型·ai编程
白帽黑客-晨哥3 小时前
最适合零基础的渗透测试学习路径:理论+实战+就业,我在湖南网安基地实现了
学习·web安全·渗透测试·实战项目·就业·湖南网安基地
q***44814 小时前
java进阶--多线程学习
java·开发语言·学习
柠石榴4 小时前
go-1 模型
开发语言·后端·golang
Y***K4348 小时前
C在游戏中的Godot
游戏·游戏引擎·godot
断剑zou天涯9 小时前
【算法笔记】窗口内最大值或最小值的更新结构
java·笔记·算法