github.com/joshprzybyszewski/masyu@v0.0.0-20230508015604-f31a025f6e7e/solve/rule_black_validator.go (about)

     1  package solve
     2  
     3  import (
     4  	"github.com/joshprzybyszewski/masyu/model"
     5  )
     6  
     7  func newBlackValidator(
     8  	row, col model.Dimension,
     9  ) rule {
    10  	r := rule{
    11  		affects: 6,
    12  		row:     row,
    13  		col:     col,
    14  	}
    15  	r.check = r.checkBlackValid
    16  	return r
    17  }
    18  
    19  func (r *rule) checkBlackValid(
    20  	s *state,
    21  ) {
    22  
    23  	l, a := s.horAt(r.row, r.col)
    24  	if l {
    25  		s.lineHor(r.row, r.col+1)
    26  		s.avoidHor(r.row, r.col-1)
    27  	} else if a || s.horLineAt(r.row, r.col-1) {
    28  		s.avoidHor(r.row, r.col)
    29  		s.lineHor(r.row, r.col-1)
    30  		if r.col > 1 {
    31  			s.lineHor(r.row, r.col-2)
    32  		} else {
    33  			r.setInvalid(s)
    34  		}
    35  	}
    36  
    37  	l, a = s.verAt(r.row, r.col)
    38  	if l {
    39  		s.lineVer(r.row+1, r.col)
    40  		s.avoidVer(r.row-1, r.col)
    41  	} else if a || s.verLineAt(r.row-1, r.col) {
    42  		s.avoidVer(r.row, r.col)
    43  		s.lineVer(r.row-1, r.col)
    44  		if r.row > 1 {
    45  			s.lineVer(r.row-2, r.col)
    46  		} else {
    47  			r.setInvalid(s)
    48  		}
    49  	}
    50  }