aigenerator.cpp
上传用户:sycq158
上传日期:2008-10-22
资源大小:15361k
文件大小:6k
源码类别:

游戏

开发平台:

Visual C++

  1. #include "global.h"
  2. #include "aigenerator.h"
  3. //-----------------------------------------------------------------------------
  4. // Name: 
  5. // Desc: 
  6. //-----------------------------------------------------------------------------
  7. CAiGenerator::CAiGenerator() {
  8. SetRect( &m_rtAvoid[0], 0, 0, 0, 0 );
  9. m_pAim = NULL;
  10. m_nAimProb = 0;
  11. m_nTrackProb = 3;
  12. m_nMaxProb = DEFMAXPROB;
  13. m_nCurrentProb = 0;
  14. ZeroMemory(CmdProbs, sizeof(int)*6);
  15. m_nFireMaxProb = 16; // maybe 1 shot per step of 2 block at speed of 4
  16. m_nFireProb = 1;
  17. m_bLastBlock = false;
  18. m_LastCmd.cmd = CMD_DOWN; // !!!Don't change this
  19. m_LastCmd.fire = false;
  20. m_LastAim = NULL;
  21. }
  22. //-----------------------------------------------------------------------------
  23. // Name: 
  24. // Desc: 
  25. //-----------------------------------------------------------------------------
  26. CAiGenerator::~CAiGenerator() {
  27. }
  28. //-----------------------------------------------------------------------------
  29. // Name: 
  30. // Desc: 
  31. //-----------------------------------------------------------------------------
  32. bool CAiGenerator::CreateGenerator( CObjTank *ptk, RECT scope ) {
  33. m_pHost = ptk;
  34. m_rtScope = scope;
  35. m_LastPos = ptk->GetRect();
  36. return true;
  37. }
  38. //-----------------------------------------------------------------------------
  39. // Name: 
  40. // Desc: 
  41. //-----------------------------------------------------------------------------
  42. void CAiGenerator::SetAim( CMobileObject *pmo, int prob ) {
  43. m_pAim = pmo;
  44. if ( prob < 0 )
  45. m_nAimProb = m_nMaxProb;
  46. else
  47. m_nAimProb = prob;
  48. }
  49. //-----------------------------------------------------------------------------
  50. // Name: 
  51. // Desc: 
  52. //-----------------------------------------------------------------------------
  53. void CAiGenerator::SetAvoid ( RECT rt ) {
  54. // r, d, u, l
  55. SetRect( &m_rtAvoid[DIR_RIGHT], 0, rt.top-24, rt.left, rt.bottom-24 );
  56. SetRect( &m_rtAvoid[DIR_DOWN], rt.left-24, 0, rt.right-24, rt.top );
  57. SetRect( &m_rtAvoid[DIR_UP], rt.left-24, rt.top, rt.right-24, g_FrameWidth );
  58. SetRect( &m_rtAvoid[DIR_LEFT], rt.left, rt.top-24, g_FrameWidth, rt.bottom-24 );
  59. }
  60. //-----------------------------------------------------------------------------
  61. // Name: 
  62. // Desc: 
  63. //-----------------------------------------------------------------------------
  64. TANKCMD CAiGenerator::Generator( CMobileObject **ppmos, int num )
  65. {
  66. TANKCMD curcmd, blockcmd;
  67. bool analyzecmd = false;
  68. // Test last command's effect
  69. if ( m_LastCmd.cmd == CMD_NONE ) {
  70. blockcmd.cmd = CMD_NONE;
  71. analyzecmd = true;
  72. else {
  73. // straight forward
  74. if ( m_LastPos.left != m_pHost->GetRect().left || 
  75. m_LastPos.top != m_pHost->GetRect().top ) {
  76. curcmd.cmd = m_LastCmd.cmd;
  77. if ( rand() % m_nFireMaxProb < m_nFireProb ) // 1/16
  78. curcmd.fire = true;
  79. else
  80. curcmd.fire = false;
  81. m_bLastBlock = false;
  82. // block just now
  83. else if ( !m_bLastBlock ) {
  84. m_bLastBlock = true;
  85. curcmd.cmd = m_LastCmd.cmd;
  86. curcmd.fire = true;
  87. }
  88. // block already
  89. else {
  90. m_bLastBlock = false;
  91. blockcmd.cmd = m_LastCmd.cmd;
  92. analyzecmd = true;
  93. }
  94. }
  95. // Analyze a new commmand according to the aims
  96. if ( analyzecmd ) {
  97. POINT step = m_pHost->GetDirectionUnit();
  98. int diff;
  99. bool randcmd;
  100. if ( blockcmd.cmd != CMD_NONE ) {
  101. m_nCurrentProb = rand() % m_nMaxProb;
  102. if ( m_pAim && m_nCurrentProb < m_nTrackProb) { // track aim
  103. if ( step.x != 0 ) // turn up/down
  104. {
  105. diff = m_pAim->GetRect().top - m_pHost->GetRect().top;
  106. if ( diff > 0 )
  107. curcmd.cmd = CMD_DOWN;
  108. else if ( diff < 0 )
  109. curcmd.cmd = CMD_UP;
  110. else
  111. curcmd.cmd = 5 - blockcmd.cmd; // turn back
  112. else if ( step.y != 0 )  // turn left/right
  113. {
  114. diff = m_pAim->GetRect().left - m_pHost->GetRect().left;
  115. if ( diff > 0 )
  116. curcmd.cmd = CMD_RIGHT;
  117. else if ( diff < 0 )
  118. curcmd.cmd = CMD_LEFT;
  119. else
  120. curcmd.cmd = 5 - blockcmd.cmd; // turn back
  121. }
  122. randcmd = false;
  123. else { // no aim, but block
  124. m_nCurrentProb = rand() % m_nMaxProb;
  125. for ( int i=1; i<5; i++ ) {
  126. if ( i != (int)blockcmd.cmd ) {
  127. m_nCurrentProb -= m_nMaxProb/3;
  128. if ( m_nCurrentProb <= 0 ) {
  129. curcmd.cmd = i;
  130. break;
  131. }
  132. }
  133. }
  134. }
  135. } else { // no blockcmd, maybe aim
  136. m_nCurrentProb = rand() % m_nMaxProb;
  137. if ( m_pAim && m_nCurrentProb < m_nTrackProb) { // track aim
  138. diff = m_pAim->GetRect().top - m_pHost->GetRect().top;
  139. if ( diff > 0 )
  140. curcmd.cmd = CMD_DOWN;
  141. else if ( diff < 0 )
  142. curcmd.cmd = CMD_UP;
  143. else {
  144. diff = m_pAim->GetRect().left - m_pHost->GetRect().left;
  145. if ( diff > 0 )
  146. curcmd.cmd = CMD_RIGHT;
  147. else if ( diff < 0 )
  148. curcmd.cmd = CMD_LEFT;
  149. else {
  150. m_nCurrentProb = rand() % m_nMaxProb;
  151. for ( int i=1; i<5; i++ ) {
  152. m_nCurrentProb -= m_nMaxProb/4;
  153. if ( m_nCurrentProb <= 0 ) {
  154. curcmd.cmd = i;
  155. break;
  156. }
  157. }
  158. }
  159. }
  160. } else { // no blockcmd, no aim
  161. m_nCurrentProb = rand() % m_nMaxProb;
  162. for ( int i=1; i<5; i++ ) {
  163. m_nCurrentProb -= m_nMaxProb/4;
  164. if ( m_nCurrentProb <= 0 ) {
  165. curcmd.cmd = i;
  166. break;
  167. }
  168. }
  169. }
  170. }
  171. if ( rand() % m_nFireMaxProb < m_nFireProb ) // 1/16
  172. curcmd.fire = true;
  173. else
  174. curcmd.fire = false;
  175. }
  176. // avoid beat base
  177. if ( PtInRect( &m_rtAvoid[m_LastCmd.cmd], *(POINT *)&m_LastPos ) )
  178. curcmd.fire = false;
  179. // Attack nearby
  180. // Store last values
  181. m_LastPos = m_pHost->GetRect();
  182. m_LastCmd = curcmd;
  183. return m_LastCmd;
  184. }
  185. //-----------------------------------------------------------------------------
  186. // Name: 
  187. // Desc: 
  188. //-----------------------------------------------------------------------------
  189. //-----------------------------------------------------------------------------
  190. // Name: 
  191. // Desc: 
  192. //-----------------------------------------------------------------------------