@@ -26,18 +26,68 @@ public class Game : AiGameBase
2626 private int m_leftTurns ;
2727 private int m_rightTurns ;
2828 private GameState m_gameState ;
29- private int m_lives = 3 ;
29+ private int m_lives ;
30+ private int m_thrustTicks ;
3031
3132 /// <summary>
3233 /// Score used for public display.
3334 /// </summary>
3435 public int Score { get ; private set ; }
3536
36- public override double Rating =>
37- m_bulletsFired * HitAccuracy + // Reward hit accuracy.
38- ( Ship . DistanceTravelled / 100.0 ) . Clamp ( 0.0 , 1.0 ) * 5.0 + // Reward moving a bit.
39- ( 1.0 - ( double ) Math . Abs ( m_leftTurns - m_rightTurns ) / ( m_leftTurns + m_rightTurns + 1 ) ) * 5.0 + // Reward not spinning.
40- Score / 1000.0 ; // Reward score.
37+ public override double Rating
38+ {
39+ get
40+ {
41+ if ( Score == 0 )
42+ return - 50.0 ; // Penalize pacifists.
43+
44+ if ( m_gameTicks > 2000 && m_bulletsFired < 5 )
45+ return - 100.0 ; // Penalize idle campers.
46+
47+ var accuracyScore = HitAccuracy * 25.0 ; // Strongly reward aiming carefully.
48+ var perfectHitBonus = m_perfectHits * 1.0 ; // Bigger incentive for intentional targeting.
49+ var shotDiscipline = - ( m_bulletsFired - m_perfectHits ) * 0.02 ; // Stronger spam punishment.
50+ var rawScore = Score / 180.0 ; // Increase actual game score importance.
51+
52+ // Reward repositioning, but penalize constant thrust with no balance.
53+ var thrustRatio = m_thrustTicks / ( double ) m_gameTicks ;
54+ var repositioningBonus = thrustRatio > 0.2 && thrustRatio < 0.8 ? 5.0 : - 2.0 ;
55+
56+ // Strongly penalize sustained unidirectional spinning:
57+ var turnReward = TurnEquality > 0.5 ? TurnEquality * 5.0 : - 5.0 ;
58+
59+ // Introduce a simple collision-avoidance reward:
60+ var survivalBonus = m_gameTicks / 4500.0 ; // Survive longer by avoiding collisions.
61+
62+ return rawScore + accuracyScore + perfectHitBonus +
63+ shotDiscipline + repositioningBonus +
64+ turnReward + survivalBonus ;
65+ }
66+ }
67+
68+ public override IEnumerable < ( string Name , string Value ) > ExtraGameStats ( )
69+ {
70+ yield return ( "Score" , Score . ToString ( ) ) ;
71+ yield return ( "HitAccuracy" , HitAccuracy . ToString ( "P1" ) ) ;
72+ yield return ( "GameTicks" , m_gameTicks . ToString ( ) ) ;
73+ yield return ( "TurnEquality" , TurnEquality . ToString ( "P1" ) ) ;
74+ yield return ( "BulletsFired" , m_bulletsFired . ToString ( ) ) ;
75+ yield return ( "PerfectHits" , m_perfectHits . ToString ( ) ) ;
76+ yield return ( "LeftTurns" , m_leftTurns . ToString ( ) ) ;
77+ yield return ( "RightTurns" , m_rightTurns . ToString ( ) ) ;
78+ yield return ( "ThrustTicks" , m_thrustTicks . ToString ( ) ) ;
79+ }
80+
81+ private double TurnEquality
82+ {
83+ get
84+ {
85+ var totalTurns = m_leftTurns + m_rightTurns ;
86+ if ( totalTurns == 0 )
87+ return 0.0 ; // No turns - no bonus.
88+ return 1.0 - ( double ) Math . Abs ( m_leftTurns - m_rightTurns ) / totalTurns ;
89+ }
90+ }
4191
4292 public override bool IsGameOver => m_lives == 0 || m_gameTicks > 200_000 ;
4393 public Ship Ship { get ; private set ; }
@@ -63,6 +113,8 @@ public override Game ResetGame()
63113 m_gameTicks = 0 ;
64114 m_leftTurns = 0 ;
65115 m_rightTurns = 0 ;
116+ m_thrustTicks = 0 ;
117+ m_lives = 3 ;
66118
67119 EnsureMinimumAsteroidCount ( ) ;
68120
@@ -93,6 +145,9 @@ public override void Tick()
93145
94146 // Move ship.
95147 Ship . Move ( ) ;
148+ if ( Ship . IsThrusting )
149+ m_thrustTicks ++ ;
150+
96151 if ( Ship . Turning == Ship . Turn . Left )
97152 m_leftTurns ++ ;
98153 else if ( Ship . Turning == Ship . Turn . Right )
@@ -178,12 +233,4 @@ public override void Tick()
178233 Ship . Turning = moves . Turn ;
179234 Ship . IsThrusting = moves . IsThrusting ;
180235 }
181-
182- public override IEnumerable < ( string Name , string Value ) > ExtraGameStats ( )
183- {
184- yield return ( "Score" , Score . ToString ( ) ) ;
185- yield return ( "HitAccuracy" , HitAccuracy . ToString ( "P1" ) ) ;
186- yield return ( "GameTicks" , m_gameTicks . ToString ( ) ) ;
187- yield return ( "DistanceTravelled" , Ship . DistanceTravelled . ToString ( "F1" ) ) ;
188- }
189236}
0 commit comments