@@ -47,8 +47,8 @@ public async Task<InitResponseModel<KaNoBuInitResponseModel>> Init(InitModel<KaN
4747 public async Task < MakeTurnResponseModel < KaNoBuMoveResponseModel > > MakeTurn ( MakeTurnModel < KaNoBuMoveModel > model )
4848 {
4949 this . memorizedField . SynchronizeField ( ( Field2D ) model . Request . Field ) ;
50- var from = this . findAllMovement ( this . memorizedField . Field ) . OrderByDescending ( a => EvaluateMove ( this . memorizedField . Field , a ) ) . ToList ( ) ;
51-
50+ var from = this . findAllMovement ( this . memorizedField . Field )
51+ . Select ( move => ( move , EvaluateMove ( this . memorizedField . Field , move ) ) ) . OrderByDescending ( a => a . Item2 ) . ToList ( ) ;
5252 if ( from . Count == 0 )
5353 {
5454 return new MakeTurnResponseModel < KaNoBuMoveResponseModel >
@@ -57,9 +57,12 @@ public async Task<MakeTurnResponseModel<KaNoBuMoveResponseModel>> MakeTurn(MakeT
5757 } ;
5858 }
5959
60+ from = from . Where ( a => a . Item2 == from [ 0 ] . Item2 ) . ToList ( ) ;
61+ var result = from [ r . Next ( from . Count ) ] ;
62+
6063 return new MakeTurnResponseModel < KaNoBuMoveResponseModel >
6164 {
62- Response = from [ 0 ]
65+ Response = result . move
6366 } ;
6467 }
6568 private int EvaluateMove ( IField mainField , KaNoBuMoveResponseModel a )
@@ -73,12 +76,13 @@ private int EvaluateMove(IField mainField, KaNoBuMoveResponseModel a)
7376 {
7477 return 8 ; // Attack unknown enemy
7578 }
76- if ( shipTo . FigureType == KaNoBuRules . Looser [ shipFrom . FigureType ] )
79+ if ( shipFrom . FigureType == KaNoBuFigure . FigureTypes . ShipUniversal || shipTo . FigureType == KaNoBuRules . Looser [ shipFrom . FigureType ] )
7780 {
7881 return 10 ; // Attack loosing enemy
7982 }
8083 return - 10 ; // Do not attack winning enemy
8184 }
85+
8286 var enemyNearby = false ;
8387 foreach ( var dir in directions )
8488 {
@@ -93,33 +97,42 @@ private int EvaluateMove(IField mainField, KaNoBuMoveResponseModel a)
9397 enemyNearby = true ;
9498 }
9599 }
100+
96101 if ( enemyNearby )
97102 {
98103 return 5 ; // Prioritize moving from enemy
99104 }
100105
101- Point ? myFlag = null ;
106+ Point ? closestEnemy = null ;
102107 for ( int x = 0 ; x < field . Width ; x ++ )
103108 {
104109 for ( int y = 0 ; y < field . Height ; y ++ )
105110 {
106111 var p = new Point { X = x , Y = y } ;
107112 var ship = field [ p ] as KaNoBuFigure ;
108- if ( ship != null && ship . PlayerId == this . myNumber && ship . FigureType == KaNoBuFigure . FigureTypes . ShipFlag )
113+ if ( ship != null && ship . PlayerId != this . myNumber && ship . FigureType == KaNoBuFigure . FigureTypes . Unknown )
109114 {
110- myFlag = p ;
115+ if ( closestEnemy == null )
116+ {
117+ closestEnemy = p ;
118+ }
119+ else
120+ {
121+ var dst = Math . Abs ( closestEnemy . Value . X - a . From . X ) + Math . Abs ( closestEnemy . Value . Y - a . From . Y ) ;
122+ var newDst = Math . Abs ( p . X - a . From . X ) + Math . Abs ( p . Y - a . From . Y ) ;
123+ if ( newDst < dst )
124+ {
125+ closestEnemy = p ;
126+ }
127+ }
111128 }
112129 }
113130 }
114-
115- if ( myFlag . HasValue )
116131 {
117- var distBefore = Math . Abs ( a . From . X - myFlag . Value . X ) + Math . Abs ( a . From . Y - myFlag . Value . Y ) ;
118- var distAfter = Math . Abs ( a . To . X - myFlag . Value . X ) + Math . Abs ( a . To . Y - myFlag . Value . Y ) ;
119- return distBefore > distAfter ? - 3 : 3 ; // Prioritize moving from flag
132+ var dst = Math . Abs ( closestEnemy . Value . X - a . From . X ) + Math . Abs ( closestEnemy . Value . Y - a . From . Y ) ;
133+ var newDst = Math . Abs ( closestEnemy . Value . X - a . To . X ) + Math . Abs ( closestEnemy . Value . Y - a . To . Y ) ;
134+ return dst > newDst ? 6 : - 6 ; // Prioritize moving to closest Unknown enemy
120135 }
121-
122- return 0 ;
123136 }
124137
125138 private IEnumerable < KaNoBuMoveResponseModel > findAllMovement ( IField mainField )
0 commit comments