2020年5月19日火曜日

開発環境

入門Goプログラミング (Nathan Youngman(著)、Roger Peppé(著)、吉川 邦夫(監修, 翻訳)、翔泳社)のUNIT 7(並行プログラミング)、LESSON 32(チャレンジ:火星で生きるもの)の32.2(発見を報告する)の解答を求めてみる。

コード

package main

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

type life int

func (l life) exist() bool {
 return l > 90
}

type satellite struct {
 msgc chan message
}

func (s *satellite) send(msgsc chan []message) {
 buffer := []message{}
 for {
  msgsc0 := msgsc
  if len(buffer) == 0 {
   msgsc0 = nil
  }
  select {
  case m := <-s.msgc:
   buffer = append(buffer, m)
  case msgsc0 <- buffer:
   buffer = nil
  }
 }
}

type message struct {
 pos image.Point
 life
 roverName string
}

func (m message) String() string {
 return fmt.Sprintf("%v 位置 %v 生命値 %v", m.roverName, m.pos, m.life)
}

type occupier struct {
 *marsGrid
 pos image.Point
}

func (o *occupier) moveTo(pos image.Point) bool {
 o.marsGrid.mu.Lock()
 defer o.marsGrid.mu.Unlock()
 cell := o.cell(pos)
 if cell == nil || cell.occupier != nil {
  return false
 }
 o.marsGrid.cell(o.pos).occupier = nil
 o.marsGrid.cell(pos).occupier = o
 o.pos = pos
 return true
}

type cell struct {
 *occupier
 life
}
type marsGrid struct {
 rect  image.Rectangle
 cells [][]cell
 mu    sync.Mutex
}

func newMarsGrid(p image.Point) *marsGrid {
 cells := make([][]cell, p.Y)
 for y := range cells {
  for x := 0; x < p.X; x++ {
   cells[y] = append(cells[y], cell{life: life(rand.Intn(101))})
  }
 }
 g := marsGrid{
  rect:  image.Rectangle{Max: p},
  cells: cells,
 }
 return &g
}
func (g *marsGrid) cell(p image.Point) *cell {
 if !p.In(g.rect) {
  return nil
 }
 return &g.cells[p.Y][p.X]
}
func (g *marsGrid) occupy(p image.Point) *occupier {
 g.mu.Lock()
 defer g.mu.Unlock()
 cell := g.cell(p)
 if cell == nil || cell.occupier != nil {
  return nil
 }
 cell.occupier = &occupier{
  marsGrid: g,
  pos:      p,
 }
 return cell.occupier
}

type command int

const (
 right = command(0)
 left  = command(1)
 start = command(2)
 stop  = command(3)
)

type roverDriver struct {
 commandc chan command
 name     string
 *occupier
 *satellite
}

func newRoverDriver(name string, o *occupier, s *satellite) *roverDriver {
 r := &roverDriver{
  commandc:  make(chan command),
  name:      name,
  occupier:  o,
  satellite: s,
 }
 go r.drive()
 return r
}

func (r *roverDriver) right() {
 r.commandc <- right
}
func (r *roverDriver) left() {
 r.commandc <- left
}
func (r *roverDriver) start() {
 r.commandc <- start
}
func (r *roverDriver) stop() {
 r.commandc <- stop
}
func (r *roverDriver) drive() {
 direction := image.Point{X: 1, Y: 0}
 updateInterval := 250 * time.Millisecond
 nextMove := time.After(updateInterval)
 speed := 1
 for {
  select {
  case c := <-r.commandc:
   switch c {
   case right:
    direction = image.Point{
     X: -direction.Y,
     Y: direction.X,
    }
   case left:
    direction = image.Point{
     X: direction.Y,
     Y: -direction.X,
    }
   case start:
    speed = 1
   case stop:
    speed = 0
   }
  case <-nextMove:
   if speed == 0 {
    fmt.Printf("%vは位置(%v,%v)で停止中\n", r.name, r.pos.X, r.pos.Y)
   } else {
    pos := r.occupier.pos.Add(direction.Mul(speed))
    if r.occupier.moveTo(pos) {
     fmt.Printf("%vは位置(%v,%v)に移動完了\n", r.name, pos.X, pos.Y)
     r.lifeExist()
    } else {
     n := 1 + rand.Intn(3)
     for i := 0; i < n; i++ {
      direction = image.Point{
       X: -direction.Y,
       Y: direction.X,
      }
     }
     fmt.Printf("%vは位置(%v,%v)に移動できず方向を%vに変更\n",
      r.name, pos.X, pos.Y, direction)

    }
   }
   nextMove = time.After(updateInterval)
  }
 }
}
func (r *roverDriver) send(msg message) {
 r.msgc <- msg
}
func (r *roverDriver) lifeExist() {
 cell := r.cell(r.pos)
 if cell.life.exist() {
  r.send(message{
   pos:       r.pos,
   life:      cell.life,
   roverName: r.name,
  })
 }
}
func receive(msgsc chan []message) {
 for {
  time.Sleep(time.Second * 5)
  t := time.After(time.Second * 2)
  select {
  case msgs := <-msgsc:
   for _, msg := range msgs {
    fmt.Println(msg)
   }
  case <-t:
   break
  }
 }
}
func main() {
 rand.Seed(time.Now().UnixNano())

 msgsc := make(chan []message)
 s := &satellite{msgc: make(chan message)}
 go receive(msgsc)
 go s.send(msgsc)

 const (
  width  = 20
  height = 10
 )
 g := newMarsGrid(image.Point{X: width, Y: height})
 o1 := occupier{
  marsGrid: g,
  pos: image.Point{
   X: rand.Intn(width / 2),
   Y: rand.Intn(height / 2),
  },
 }
 r1 := newRoverDriver("rover1", &o1, s)
 o2 := occupier{
  marsGrid: g,
  pos: image.Point{
   X: width/2 + rand.Intn(width/2),
   Y: height/2 + rand.Intn(height/2),
  },
 }
 r2 := newRoverDriver("rover2", &o2, s)
 methods := []func(){
  r1.right,
  r1.left,
  r1.start,
  r1.stop,
  r2.right,
  r2.left,
  r2.start,
  r2.stop,
 }
 for _, method := range methods {
  time.Sleep(time.Second)
  method()
 }
 r1.start()
 r2.start()
 for i := 0; i < 20; i++ {
  time.Sleep(time.Second)
  methods[rand.Intn(len(methods))]()
 }
}

入出力結果(Zsh、PowerShell、Terminal)

% go build marsgrid.go
% ./marsgrid          
rover1は位置(7,1)に移動完了
rover2は位置(13,9)に移動完了
rover2は位置(14,9)に移動完了
rover1は位置(8,1)に移動完了
rover2は位置(15,9)に移動完了
rover1は位置(9,1)に移動完了
rover1は位置(9,2)に移動完了
rover2は位置(16,9)に移動完了
rover1は位置(9,3)に移動完了
rover2は位置(17,9)に移動完了
rover1は位置(9,4)に移動完了
rover2は位置(18,9)に移動完了
rover2は位置(19,9)に移動完了
rover1は位置(9,5)に移動完了
rover1は位置(10,5)に移動完了
rover2は位置(20,9)に移動できず方向を(0,-1)に変更
rover2は位置(19,8)に移動完了
rover1は位置(11,5)に移動完了
rover2は位置(19,7)に移動完了
rover1は位置(12,5)に移動完了
rover1は位置(13,5)に移動完了
rover2は位置(19,6)に移動完了
rover2は位置(19,5)に移動完了
rover1は位置(14,5)に移動完了
rover1は位置(15,5)に移動完了
rover2は位置(19,4)に移動完了
rover2は位置(19,3)に移動完了
rover1は位置(16,5)に移動完了
rover1は位置(17,5)に移動完了
rover2は位置(19,2)に移動完了
rover2は位置(19,1)に移動完了
rover1は位置(17,5)で停止中
rover1は位置(17,5)で停止中
rover2は位置(19,0)に移動完了
rover1は位置(17,5)で停止中
rover2は位置(19,-1)に移動できず方向を(1,0)に変更
rover2は位置(20,0)に移動できず方向を(0,-1)に変更
rover1は位置(17,5)で停止中
rover1 位置 (8,1) 生命値 95
rover2 位置 (15,9) 生命値 95
rover2 位置 (18,9) 生命値 95
rover2 位置 (19,9) 生命値 91
rover1 位置 (9,5) 生命値 95
rover1 位置 (10,5) 生命値 94
rover1 位置 (13,5) 生命値 94
rover1 位置 (15,5) 生命値 99
rover1は位置(17,5)で停止中
rover2は位置(20,0)に移動できず方向を(0,-1)に変更
rover1は位置(17,5)で停止中
rover2は位置(19,-1)に移動できず方向を(-1,0)に変更
rover2は位置(18,0)に移動完了
rover1は位置(17,5)で停止中
rover2は位置(17,0)に移動完了
rover1は位置(17,5)で停止中
rover1は位置(17,5)で停止中
rover2は位置(17,1)に移動完了
rover2は位置(17,2)に移動完了
rover1は位置(17,5)で停止中
rover1は位置(17,5)で停止中
rover2は位置(17,3)に移動完了
rover2は位置(17,4)に移動完了
rover1は位置(17,5)で停止中
rover1は位置(17,5)で停止中
rover2は位置(17,5)に移動できず方向を(1,0)に変更
rover2は位置(18,4)に移動完了
rover1は位置(17,5)で停止中
rover1は位置(17,5)で停止中
rover2は位置(19,4)に移動完了
rover2は位置(20,4)に移動できず方向を(0,-1)に変更
rover1は位置(17,5)で停止中
rover1は位置(18,5)に移動完了
rover2は位置(19,3)に移動完了
rover2は位置(19,2)に移動完了
rover1は位置(19,5)に移動完了
rover2は位置(19,1)に移動完了
rover1は位置(20,5)に移動できず方向を(0,1)に変更
rover1は位置(19,6)に移動完了
rover2は位置(19,0)に移動完了
rover2は位置(19,-1)に移動できず方向を(1,0)に変更
rover1は位置(19,7)に移動完了
rover2は位置(20,0)に移動できず方向を(-1,0)に変更
rover1は位置(19,8)に移動完了
rover1は位置(19,9)に移動完了
rover2は位置(18,0)に移動完了
rover2は位置(17,0)に移動完了
rover1は位置(19,10)に移動できず方向を(-1,0)に変更
rover2 位置 (17,1) 生命値 95
rover1 位置 (19,9) 生命値 91
rover2は位置(17,-1)に移動できず方向を(-1,0)に変更
rover1は位置(18,9)に移動完了
rover1は位置(17,9)に移動完了
rover2は位置(16,0)に移動完了
rover2は位置(15,0)に移動完了
rover1は位置(16,9)に移動完了
rover1は位置(15,9)に移動完了
rover2は位置(14,0)に移動完了
rover1は位置(15,10)に移動できず方向を(1,0)に変更
rover2は位置(13,0)に移動完了
rover2は位置(12,0)に移動完了
rover1は位置(16,9)に移動完了
rover1は位置(17,9)に移動完了
rover2は位置(11,0)に移動完了
rover1は位置(18,9)に移動完了
rover2は位置(10,0)に移動完了
rover2は位置(9,0)に移動完了
rover1は位置(19,9)に移動完了
rover2は位置(8,0)に移動完了
rover1は位置(20,9)に移動できず方向を(0,-1)に変更
rover1は位置(19,8)に移動完了
rover2は位置(7,0)に移動完了
rover2は位置(6,0)に移動完了
rover1は位置(19,7)に移動完了
rover1は位置(19,6)に移動完了
rover2は位置(6,-1)に移動できず方向を(-1,0)に変更
rover2は位置(5,0)に移動完了
rover1は位置(19,5)に移動完了
rover1は位置(19,4)に移動完了
rover2は位置(4,0)に移動完了
rover2は位置(3,0)に移動完了
rover1は位置(19,3)に移動完了
rover2は位置(2,0)に移動完了
rover1は位置(20,3)に移動できず方向を(0,1)に変更
rover1は位置(19,4)に移動完了
rover2は位置(1,0)に移動完了
rover2は位置(0,0)に移動完了
rover1は位置(19,5)に移動完了
rover1は位置(19,6)に移動完了
rover2は位置(-1,0)に移動できず方向を(0,1)に変更
rover1 位置 (18,9) 生命値 95
rover1 位置 (15,9) 生命値 95
rover1 位置 (18,9) 生命値 95
rover1 位置 (19,9) 生命値 91
rover2は位置(0,1)に移動完了
rover1は位置(18,6)に移動完了
rover2は位置(0,2)に移動完了
rover1は位置(17,6)に移動完了
rover1は位置(16,6)に移動完了
rover2は位置(0,3)に移動完了
rover1は位置(15,6)に移動完了
rover2は位置(0,4)に移動完了
rover1は位置(14,6)に移動完了
rover2は位置(0,4)で停止中
rover2は位置(0,4)で停止中
rover1は位置(13,6)に移動完了
rover1は位置(12,6)に移動完了
rover2は位置(0,4)で停止中
rover2は位置(0,4)で停止中
rover1は位置(11,6)に移動完了
rover1は位置(10,6)に移動完了
rover2は位置(0,4)で停止中
rover2は位置(0,4)で停止中
rover1は位置(9,6)に移動完了
rover2は位置(0,4)で停止中
rover1は位置(8,6)に移動完了
rover1は位置(7,6)に移動完了
rover2は位置(0,4)で停止中
rover2は位置(0,4)で停止中
rover1は位置(7,7)に移動完了
rover2は位置(0,4)で停止中
rover1は位置(7,8)に移動完了
rover1は位置(7,9)に移動完了
rover2は位置(0,4)で停止中
rover2は位置(0,4)で停止中
rover1は位置(7,10)に移動できず方向を(-1,0)に変更
rover2は位置(0,4)で停止中
rover1は位置(6,9)に移動完了
rover1は位置(5,9)に移動完了
rover2は位置(0,4)で停止中
rover2は位置(0,4)で停止中
rover1は位置(4,9)に移動完了
rover1は位置(3,9)に移動完了
rover2は位置(0,4)で停止中
rover1 位置 (16,6) 生命値 94
rover1 位置 (15,6) 生命値 99
rover1 位置 (7,6) 生命値 99
rover1 位置 (7,9) 生命値 91
rover2は位置(0,4)で停止中
rover1は位置(2,9)に移動完了
rover1は位置(1,9)に移動完了
rover2は位置(0,4)で停止中
rover1は位置(0,9)に移動完了
rover2は位置(0,4)で停止中
rover2は位置(0,4)で停止中
rover1は位置(-1,9)に移動できず方向を(0,1)に変更
rover1は位置(1,9)に移動完了
rover2は位置(0,4)で停止中
rover2は位置(0,4)で停止中
rover1は位置(2,9)に移動完了
rover2は位置(0,4)で停止中
rover1は位置(3,9)に移動完了
rover1は位置(4,9)に移動完了
rover2は位置(0,4)で停止中
rover2は位置(0,3)に移動完了
rover1は位置(5,9)に移動完了
rover1は位置(6,9)に移動完了
rover2は位置(0,2)に移動完了
rover2は位置(0,1)に移動完了
rover1は位置(7,9)に移動完了
rover2は位置(0,0)に移動完了
rover1は位置(8,9)に移動完了
rover1は位置(9,9)に移動完了
rover2は位置(0,-1)に移動できず方向を(0,1)に変更
rover1は位置(10,9)に移動完了
rover2は位置(0,1)に移動完了
rover2は位置(0,2)に移動完了
rover1は位置(11,9)に移動完了
rover1は位置(12,9)に移動完了
rover2は位置(0,3)に移動完了
rover1は位置(12,9)で停止中
rover2は位置(0,4)に移動完了
rover2は位置(0,5)に移動完了
rover1は位置(12,9)で停止中
rover1は位置(12,9)で停止中
rover2は位置(0,6)に移動完了
rover2は位置(0,7)に移動完了
rover1は位置(12,9)で停止中
rover1 位置 (7,9) 生命値 91
rover1は位置(12,9)で停止中
rover2は位置(0,8)に移動完了
rover2は位置(0,9)に移動完了
rover1は位置(12,9)で停止中
rover1は位置(12,9)で停止中
rover2は位置(0,10)に移動できず方向を(0,-1)に変更
rover2は位置(0,8)に移動完了
rover1は位置(12,9)で停止中
rover1は位置(12,9)で停止中
rover2は位置(1,8)に移動完了
rover2は位置(2,8)に移動完了
rover1は位置(12,9)で停止中
rover2は位置(3,8)に移動完了
rover1は位置(12,9)で停止中
rover1は位置(12,9)で停止中
rover2は位置(4,8)に移動完了
rover1は位置(12,9)で停止中
rover2は位置(4,8)で停止中
rover1は位置(12,9)で停止中
rover2は位置(4,8)で停止中
rover2は位置(4,8)で停止中
rover1は位置(12,9)で停止中
rover1は位置(12,9)で停止中
rover2は位置(4,8)で停止中
% ./marsgrid          
rover1は位置(2,1)に移動完了
rover2は位置(17,7)に移動完了
rover2は位置(18,7)に移動完了
rover1は位置(3,1)に移動完了
rover1は位置(4,1)に移動完了
rover2は位置(19,7)に移動完了
rover1は位置(4,2)に移動完了
rover2は位置(20,7)に移動できず方向を(0,1)に変更
rover1は位置(4,3)に移動完了
rover2は位置(19,8)に移動完了
rover2は位置(19,9)に移動完了
rover1は位置(4,4)に移動完了
rover1は位置(4,5)に移動完了
rover2は位置(19,10)に移動できず方向を(0,-1)に変更
rover2は位置(19,8)に移動完了
rover1は位置(5,5)に移動完了
rover1は位置(6,5)に移動完了
rover2は位置(19,7)に移動完了
rover2は位置(19,6)に移動完了
rover1は位置(7,5)に移動完了
rover1は位置(8,5)に移動完了
rover2は位置(19,5)に移動完了
rover2は位置(19,4)に移動完了
rover1は位置(9,5)に移動完了
rover1は位置(10,5)に移動完了
rover2は位置(19,3)に移動完了
rover1は位置(11,5)に移動完了
rover2は位置(19,2)に移動完了
rover2は位置(19,1)に移動完了
rover1は位置(12,5)に移動完了
rover1は位置(12,5)で停止中
rover2は位置(19,0)に移動完了
rover1は位置(12,5)で停止中
rover2は位置(19,-1)に移動できず方向を(1,0)に変更
rover1は位置(12,5)で停止中
rover2は位置(20,0)に移動できず方向を(0,1)に変更
rover2は位置(19,1)に移動完了
rover1は位置(12,5)で停止中
rover2 位置 (18,7) 生命値 91
rover2 位置 (19,7) 生命値 95
rover1 位置 (4,4) 生命値 98
rover1 位置 (5,5) 生命値 100
rover2 位置 (19,7) 生命値 95
rover2 位置 (19,5) 生命値 95
rover1は位置(12,5)で停止中
rover2は位置(18,1)に移動完了
rover2は位置(17,1)に移動完了
rover1は位置(12,5)で停止中
rover2は位置(16,1)に移動完了
rover1は位置(12,5)で停止中
rover1は位置(12,5)で停止中
rover2は位置(15,1)に移動完了
rover2は位置(15,2)に移動完了
rover1は位置(12,5)で停止中
rover1は位置(12,5)で停止中
rover2は位置(15,3)に移動完了
rover1は位置(12,5)で停止中
rover2は位置(15,4)に移動完了
rover1は位置(12,5)で停止中
rover2は位置(15,5)に移動完了
rover1は位置(12,5)で停止中
rover2は位置(15,6)に移動完了
rover2は位置(15,7)に移動完了
rover1は位置(12,5)で停止中
rover1は位置(12,5)で停止中
rover2は位置(15,8)に移動完了
rover2は位置(15,9)に移動完了
rover1は位置(12,5)で停止中
rover1は位置(13,5)に移動完了
rover2は位置(15,10)に移動できず方向を(0,-1)に変更
rover2は位置(15,8)に移動完了
rover1は位置(14,5)に移動完了
rover2は位置(15,7)に移動完了
rover1は位置(15,5)に移動完了
rover2は位置(15,6)に移動完了
rover1は位置(16,5)に移動完了
rover1は位置(17,5)に移動完了
rover2は位置(14,6)に移動完了
rover2は位置(13,6)に移動完了
rover1は位置(18,5)に移動完了
rover1は位置(19,5)に移動完了
rover2は位置(12,6)に移動完了
rover2は位置(11,6)に移動完了
rover1は位置(20,5)に移動できず方向を(0,-1)に変更
rover2 位置 (16,1) 生命値 98
rover2 位置 (15,8) 生命値 93
rover2 位置 (15,8) 生命値 93
rover2 位置 (13,6) 生命値 93
rover1 位置 (19,5) 生命値 95
rover1は位置(19,4)に移動完了
rover2は位置(11,5)に移動完了
rover1は位置(19,3)に移動完了
rover2は位置(11,4)に移動完了
rover2は位置(11,3)に移動完了
rover1は位置(19,2)に移動完了
rover2は位置(11,2)に移動完了
rover1は位置(19,1)に移動完了
rover1は位置(19,0)に移動完了
rover2は位置(11,1)に移動完了
rover2は位置(11,0)に移動完了
rover1は位置(19,-1)に移動できず方向を(1,0)に変更
rover1は位置(20,0)に移動できず方向を(-1,0)に変更
rover2は位置(11,-1)に移動できず方向を(-1,0)に変更
rover2は位置(10,0)に移動完了
rover1は位置(18,0)に移動完了
rover1は位置(17,0)に移動完了
rover2は位置(9,0)に移動完了
rover2は位置(8,0)に移動完了
rover1は位置(16,0)に移動完了
rover1は位置(15,0)に移動完了
rover2は位置(7,0)に移動完了
rover1は位置(14,0)に移動完了
rover2は位置(6,0)に移動完了
rover2は位置(6,0)で停止中
rover1は位置(13,0)に移動完了
rover1は位置(12,0)に移動完了
rover2は位置(6,0)で停止中
rover2は位置(6,0)で停止中
rover1は位置(11,0)に移動完了
rover1は位置(10,0)に移動完了
rover2は位置(6,0)で停止中
rover1は位置(9,0)に移動完了
rover2は位置(5,0)に移動完了
rover2は位置(4,0)に移動完了
rover1は位置(8,0)に移動完了
rover1は位置(7,0)に移動完了
rover2は位置(3,0)に移動完了
rover2は位置(2,0)に移動完了
rover1は位置(6,0)に移動完了
rover1は位置(6,1)に移動完了
rover2は位置(1,0)に移動完了
rover2は位置(0,0)に移動完了
rover1は位置(6,2)に移動完了
rover1 位置 (6,2) 生命値 99
rover1は位置(6,3)に移動完了
rover2は位置(-1,0)に移動できず方向を(0,1)に変更
rover2は位置(0,1)に移動完了
rover1は位置(6,4)に移動完了
rover1は位置(6,5)に移動完了
rover2は位置(0,2)に移動完了
rover2は位置(0,3)に移動完了
rover1は位置(6,6)に移動完了
rover1は位置(6,7)に移動完了
rover2は位置(0,4)に移動完了
rover2は位置(0,5)に移動完了
rover1は位置(6,8)に移動完了
rover1は位置(6,9)に移動完了
rover2は位置(1,5)に移動完了
rover2は位置(2,5)に移動完了
rover1は位置(6,10)に移動できず方向を(0,-1)に変更
rover1は位置(6,8)に移動完了
rover2は位置(3,5)に移動完了
rover2は位置(4,5)に移動完了
rover1は位置(6,7)に移動完了
rover1は位置(6,6)に移動完了
rover2は位置(4,4)に移動完了
rover2は位置(4,3)に移動完了
rover1は位置(6,5)に移動完了
rover1は位置(6,4)に移動完了
rover2は位置(4,2)に移動完了
rover2は位置(4,1)に移動完了
rover1は位置(6,3)に移動完了
rover1は位置(6,2)に移動完了
rover2は位置(4,0)に移動完了
rover2は位置(4,-1)に移動できず方向を(-1,0)に変更
rover1は位置(6,1)に移動完了
rover1は位置(6,0)に移動完了
rover2は位置(3,0)に移動完了
rover2は位置(2,0)に移動完了
rover1は位置(6,-1)に移動できず方向を(0,1)に変更
rover2は位置(2,0)で停止中
rover1は位置(6,1)に移動完了
rover2 位置 (4,4) 生命値 98
rover1 位置 (6,2) 生命値 99
rover2は位置(2,0)で停止中
rover1は位置(6,2)に移動完了
rover2は位置(2,0)で停止中
rover1は位置(6,3)に移動完了
rover1は位置(6,4)に移動完了
rover2は位置(2,0)で停止中
rover1は位置(6,5)に移動完了
rover2は位置(2,0)で停止中
rover2は位置(2,0)で停止中
rover1は位置(6,6)に移動完了
rover2は位置(2,0)で停止中
rover1は位置(6,7)に移動完了
rover1は位置(6,8)に移動完了
rover2は位置(2,0)で停止中
rover1は位置(7,8)に移動完了
rover2は位置(2,0)で停止中
rover2は位置(2,0)で停止中
rover1は位置(8,8)に移動完了
rover1は位置(9,8)に移動完了
rover2は位置(2,0)で停止中
rover2は位置(2,0)で停止中
rover1は位置(10,8)に移動完了
rover1は位置(11,8)に移動完了
rover2は位置(2,0)で停止中
rover2は位置(2,0)で停止中
rover1は位置(12,8)に移動完了
rover1は位置(13,8)に移動完了
rover2は位置(2,0)で停止中
rover2は位置(2,0)で停止中
rover1は位置(14,8)に移動完了
rover2は位置(2,0)で停止中
rover1は位置(15,8)に移動完了
rover2は位置(2,0)で停止中
rover1は位置(16,8)に移動完了
rover1は位置(17,8)に移動完了
rover2は位置(2,0)で停止中
rover2は位置(2,0)で停止中
rover1は位置(18,8)に移動完了
rover2は位置(2,0)で停止中
rover1は位置(18,9)に移動完了
rover1 位置 (6,2) 生命値 99
rover1 位置 (8,8) 生命値 96
rover1 位置 (11,8) 生命値 93
rover1 位置 (15,8) 生命値 93
rover2は位置(2,0)で停止中
rover1は位置(18,10)に移動できず方向を(1,0)に変更
rover2は位置(2,0)で停止中
rover1は位置(19,9)に移動完了
rover1は位置(20,9)に移動できず方向を(0,-1)に変更
rover2は位置(2,0)で停止中
rover2は位置(2,0)で停止中
rover1は位置(19,8)に移動完了
rover1は位置(19,7)に移動完了
rover2は位置(2,0)で停止中
rover1は位置(19,6)に移動完了
rover2は位置(2,0)で停止中
rover2は位置(2,0)で停止中
rover1は位置(19,5)に移動完了
rover1は位置(19,5)で停止中
rover2は位置(2,0)で停止中
rover1は位置(19,5)で停止中
rover2は位置(2,0)で停止中
rover2は位置(2,0)で停止中
rover1は位置(19,5)で停止中
rover1は位置(19,5)で停止中
rover2は位置(2,0)で停止中
% 

0 コメント:

コメントを投稿