GameStatistic.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:5k
源码类别:

模拟服务器

开发平台:

C/C++

  1. // GameStatistic.cpp: implementation of the GameStatistic class.
  2. //游戏统计类
  3. //By Fellow
  4. //////////////////////////////////////////////////////////////////////
  5. #include "stdafx.h"
  6. #include "GameStatistic.h"
  7. using namespace std;
  8. TGameStatistic::TRoleList* TGameStatistic::GetMin(
  9. TRoleList* const aRoleList,
  10. const int n,
  11. const StatType aType)
  12. {//查找出列表中钱/级别(或其他)最少的一个元素
  13. TRoleList* tmpData;
  14. tmpData = &aRoleList[0];
  15. while(true)
  16. {
  17. for(int i=0;i<n;++i)
  18. {
  19. int aSourse, aDest;
  20. switch(aType)
  21. {
  22. case stMoney:
  23. aDest = tmpData->Money;
  24. aSourse = aRoleList[i].Money;
  25. break;
  26. case stLevel:
  27. aDest = tmpData->Level;
  28. aSourse = aRoleList[i].Level;
  29. break;
  30. }
  31. if(aDest > aSourse)
  32. {
  33. tmpData = &aRoleList[i];
  34. break;
  35. }
  36. }
  37. if(i==n)break;
  38. }
  39. return tmpData;
  40. }
  41. void TGameStatistic::ListSort(
  42. TRoleList* const aRoleList,
  43. const int n,
  44. const StatType aType)
  45. {//对列表做特定的排序
  46. int i,j;
  47. for(i=0;i<n;++i)
  48. {
  49. TRoleList* tmpData = &aRoleList[i];
  50. for(j=i+1;j<n;++j)
  51. {
  52. int aSourse, aDest;
  53. switch(aType)
  54. {
  55. case stMoney:
  56. aDest = tmpData->Money;
  57. aSourse = aRoleList[j].Money;
  58. break;
  59. case stLevel:
  60. aDest = tmpData->Level;
  61. aSourse = aRoleList[j].Level;
  62. break;
  63. }
  64. if( aSourse > aDest )
  65. swap(*tmpData, aRoleList[j]);
  66. }
  67. }
  68. }
  69. void TGameStatistic::RoleDataCopy(TRoleList* Desc, TRoleData* Source)
  70. {//把RoleData有用的结构复制到RoleList结构中
  71. //strcpy(Desc->Account, Source->BaseInfo.caccname);
  72. strcpy(Desc->Name, Source->BaseInfo.szName);
  73. Desc->Sect = Source->BaseInfo.nSect;
  74. Desc->Money = Source->BaseInfo.imoney + Source->BaseInfo.isavemoney;
  75. Desc->Level = Source->BaseInfo.ifightlevel;
  76. }
  77. bool TGameStatistic::AllStat(TStatData& aStatData)
  78. {//全部统计
  79. if( !DBTable ) return false;
  80. int i;
  81. memset(&aStatData, 0, sizeof(TStatData));
  82. char* aBuffer;
  83. int size;
  84. TRoleData* pRoleData;
  85. ///////数据库遍历/////////////
  86. aBuffer = DBTable->GetRecord(size, ZDBTable::cpFirst, 0);
  87. while(aBuffer)
  88. {
  89. TRoleList* tmpData;
  90. pRoleData = (TRoleData*)aBuffer;
  91. //////////////////////////////玩家统计////////////////////////////////////
  92. //对金钱排序
  93. tmpData = GetMin(aStatData.MoneyStat, 100, stMoney);
  94. if( tmpData->Money < pRoleData->BaseInfo.imoney + pRoleData->BaseInfo.isavemoney)
  95. {//如果当前数据较大就把当前数据代替列表中最小的
  96. RoleDataCopy(tmpData, pRoleData);
  97. }
  98. //对级别排序
  99. tmpData = GetMin(aStatData.LevelStat, 100, stLevel);
  100. if( tmpData->Level < pRoleData->BaseInfo.ifightlevel)
  101. {//如果当前数据较大就把当前数据代替列表中最小的
  102. RoleDataCopy(tmpData, pRoleData);
  103. }
  104. //各门派对金钱排序
  105. if( (pRoleData->BaseInfo.nSect <=10) && (pRoleData->BaseInfo.nSect >= 1) )
  106. {
  107. tmpData = GetMin(aStatData.MoneyStatBySect[pRoleData->BaseInfo.nSect], 10, stMoney);
  108. }
  109. else
  110. {
  111. tmpData = GetMin(aStatData.MoneyStatBySect[0], 10, stMoney);
  112. }
  113. if( tmpData->Money < pRoleData->BaseInfo.imoney  + pRoleData->BaseInfo.isavemoney)
  114. {//如果当前数据较大就把当前数据代替列表中最小的
  115. RoleDataCopy(tmpData, pRoleData);
  116. }
  117. //各门派对级别排序
  118. if( (pRoleData->BaseInfo.nSect <=10) && (pRoleData->BaseInfo.nSect >= 1) )
  119. {
  120. tmpData = GetMin(aStatData.LevelStatBySect[pRoleData->BaseInfo.nSect], 10, stMoney);
  121. }
  122. else
  123. {
  124. tmpData = GetMin(aStatData.LevelStatBySect[0], 10, stMoney);
  125. }
  126. if( tmpData->Level < pRoleData->BaseInfo.ifightlevel)
  127. {//如果当前数据较大就把当前数据代替列表中最小的
  128. RoleDataCopy(tmpData, pRoleData);
  129. }
  130. //////////////////////////////门派统计////////////////////////////////////
  131. //各个门派的玩家数统计
  132. if( (pRoleData->BaseInfo.nSect <=10) && (pRoleData->BaseInfo.nSect >= 1) )
  133. {
  134. ++aStatData.SectPlayerNum[pRoleData->BaseInfo.nSect];
  135. }
  136. else
  137. {
  138. ++aStatData.SectPlayerNum[0];
  139. }
  140. //清除当前缓存,游标指向下一个记录
  141. delete [] aBuffer;
  142. aBuffer = DBTable->GetRecord(size,ZDBTable::cpNext);
  143. }
  144. //////////////////////////////门派统计////////////////////////////////////
  145. for(i=0;i<100;++i)
  146. { //财富排名前一百玩家中各门派所占比例数
  147. if( (aStatData.MoneyStat[i].Sect <=10) && (aStatData.MoneyStat[i].Sect >= 1) )
  148. {
  149. ++aStatData.SectMoneyMost[aStatData.MoneyStat[i].Sect];
  150. }
  151. else
  152. {
  153. ++aStatData.SectMoneyMost[0];
  154. }
  155. //级别排名前一百玩家中各门派所占比例数
  156. if( (aStatData.LevelStat[i].Sect <=10) && (aStatData.LevelStat[i].Sect >= 1) )
  157. {
  158. ++aStatData.SectLevelMost[aStatData.LevelStat[i].Sect];
  159. }
  160. else
  161. {
  162. ++aStatData.SectLevelMost[0];
  163. }
  164. }
  165. //////////////////////////////排序////////////////////////////////////
  166. ListSort(aStatData.MoneyStat, 100, stMoney);
  167. ListSort(aStatData.LevelStat, 100, stLevel);
  168. for(i=0;i<11;++i)
  169. {//各门派金钱排序
  170. ListSort(aStatData.MoneyStatBySect[i], 10, stMoney);
  171. }
  172. for(i=0;i<11;++i)
  173. {//各门派级别排序
  174. ListSort(aStatData.LevelStatBySect[i], 10, stLevel);
  175. }
  176. return true;
  177. }