開発環境
- macOS Catalina - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
- Go (プログラミング言語)
入門Goプログラミング (Nathan Youngman(著)、Roger Peppé(著)、吉川 邦夫(監修, 翻訳)、翔泳社)のUNIT 4(コレクション)、LESSON 20(チャレンジ:ライフのスライス)の20.2(ゲームのルールを実装する)の解答を求めてみる。
コード
package main
import (
"fmt"
"math/rand"
"time"
)
const (
width = 80
height = 25
)
type universe [][]bool
func newUniverse() universe {
u := make([][]bool, height, height)
for i := range u {
u[i] = make([]bool, width, width)
}
return u
}
func (u universe) set(i, j int, b bool) {
u[i][j] = b
}
func (u universe) alive(i, j int) bool {
return u[(i+height)%height][(j+width)%width]
}
func (u universe) seed() {
for i := 0; i < height; i++ {
for j := 0; j < width; j++ {
u.set(i, j, rand.Intn(100) <= 24)
}
}
}
func (u universe) neighbors(i, j int) int {
n := 0
for row := i - 1; row <= i+1; row++ {
for col := j - 1; col <= j+1; col++ {
if (row != i || row != col) && u.alive(row, col) {
n++
}
}
}
return n
}
func (u universe) next(i, j int) bool {
n := u.neighbors(i, j)
return n == 3 || (n == 2 && u.alive(i, j))
}
func (u universe) show() {
for i := 0; i < height; i++ {
for j := 0; j < width; j++ {
if u.alive(i, j) {
fmt.Printf("*")
} else {
fmt.Printf(" ")
}
}
fmt.Println("")
}
}
func main() {
rand.Seed(time.Now().UnixNano())
u := newUniverse()
fmt.Println("生きたセルの種を蒔く")
u.seed()
u.show()
for i := 0; i < 10; i++ {
x := rand.Intn(width)
y := rand.Intn(height)
fmt.Printf("(%v, %v) neighbors %v, next %v\n",
y, x, u.neighbors(y, x), u.next(y, x))
}
}
入出力結果(Zsh、PowerShell、Terminal)
% go build ./conwaygameoflife.go
% ./conwaygameoflife
生きたセルの種を蒔く
* * * * * * * * * * ** * * * * **
* * * ** * * * * * * * * * * * *
* * * * ** * * * * ** * **
** * *** * ** * ** * ** * * * * **
* ** * * * * * * ** * * * * * * *
* * * * * * * * * * * * *
*** * * * * * ** * ** ** * * *
* * * * * * * ** * ** * * * * ** ** * *
** * ** * * * * * * * ** * * * * * *
* * * * ** * * * * * * * ** ** * ***
* * **** * * *** ** ** * ** ** * * ** * *** * ** * ** * *
* * *** * * * ** * * * * * * * * * *
** * * * * * * * ** * ** * * * **
** * * * * * * ** * ** * * * * * * *
* * * ** * * ** * * * * * * ** * *
* * * * * * * ** * **
* * * * * ** * ** *** * **** * * ** * **
** * * ** ** * * * ** * * * * * ** *** * * *
* ** ** **** ** * * * * * * ** *
** * * * * * ** * *** *** ** ** * * * **
* * * ** * * ** ** * * * * * * ** ** ** *** * **
** * ** * *** *** ** * * ** * ** *
* *** * ** * * * * ** ** * * *
** * * * * * ** * * * * * * * * ** **
* * * * **** * * * * * *** * *
(13, 74) neighbors 5, next false
(11, 3) neighbors 3, next true
(2, 38) neighbors 3, next true
(18, 58) neighbors 3, next true
(24, 5) neighbors 3, next true
(4, 62) neighbors 1, next false
(8, 48) neighbors 5, next false
(17, 10) neighbors 1, next false
(17, 68) neighbors 1, next false
(9, 64) neighbors 4, next false
% ./conwaygameoflife
生きたセルの種を蒔く
* ** * * * * * * ** ** * * * * * *
* ** * * * * * *** * * ** * *
* * * * * * ** * * ** * * * * *
* * * * * * *** ** ** * **** * * ** * ** *
*** ** ** * * * * *** * * * *
*** * * * * * * * * * * * * ** ** * * * ** * ** *
** * * * * * * * ** * * * * **
* * * * * * * *** * * * * ****
* * * * * ** ** * * * ** * *
* ** * * * * * * ** * * ** *
* ** * * * * * * ** * **
* * * * ** * ** * ** * * * ** * *
* * * ** *** *** ** ** * * ** * ** * * * **
** * * * * * * * * *** *
* ** * ** * * *** * * * * * * * ** **
*** * * * * * * * * * ** * * * * * **
* ** * ** * ** * ** * * * * * * *
* * * ** * * * * ** * * * * *** ** * ** * * * * *
* * * ** * * * * ** ** * * * * *
* * ** * * * * * * * ** * * *
* * ** ** * * * * ** * ** * * * * *
* **** * ** * * * * * * * ** * *
* ** * * * * ** *** * ** * * ** ***
* * * * * ** * * * * * *
* * * * ** * * * * * **** ** * * * *
(24, 43) neighbors 3, next true
(13, 46) neighbors 3, next true
(12, 31) neighbors 4, next false
(20, 3) neighbors 2, next false
(5, 71) neighbors 0, next false
(8, 69) neighbors 3, next true
(9, 27) neighbors 1, next false
(21, 78) neighbors 2, next false
(18, 71) neighbors 2, next false
(13, 72) neighbors 4, next false
%
0 コメント:
コメントを投稿