2020年5月1日金曜日

開発環境

入門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 コメント:

コメントを投稿