找回密码
 注册

QQ登录

只需一步,快速开始

查看: 3609|回复: 26

刚刚看到的“妖牛”贴,只看个半懂。

[复制链接]
发表于 2004-3-1 17:16:10 | 显示全部楼层 |阅读模式
潜了那么久的水,突然想上来冒个泡。在我的印象里,现在的CMER太懒了,整天只知道泡在论坛里灌水,几天下来也看不见一篇有建设性的帖子。不过让我略感欣慰的是,前几天看了madtoad的《关于球员能力、潜力的计算问题。》一文,发现至少还是有那么一些勤于思考的CMER的。仅以此文献给这些还在绞尽脑汁为推动CM游戏水平进步的可爱CMER。

不知道大家还记不记得CM3的时候有一款Graeme Kelly开发的CM3 Series SaveGame Editor存盘编辑器,其实用过它就大概知道球员的属性和能力值大概是个什么关系 了,下面就以我最喜欢的Giggs为例给大家讲解一下。



先做一下名词解释,如图所示:
RA:球员各项属性的实际能力;范围:1-255
FA:球员各项属性的最终体现值,也就是我们所看见的球员属性,范围:1-20
CA:球员的当前能力,范围:1-200
PA:球员的潜力,范围1-200

球员的属性分类两类:一类是Acceleration、Aggression等FA和RA相等的属性,这类属性不受CA影响,主要集中在球员的身体属性、部分精神属性和隐藏属性;另一类是Anticipation、Crossing等FA和RA不相等的属性,这类属性要受到CA的影响,主要集中在球员的技术属性和部分精神属性。

我们可以用表示FA=f(RA,CA)表示这三者之间的函数关系。经过测试发现,f是一个在(1,127)(128,255)两个区间分别递增的函数,但当CA一定的时候,FA和RA是非线性的关系,当RA一定的时候,FA和CA也是非线性的关系。我不是数学系出身,想要仅以几个采样值来求出这个二元函数几乎是不可能的,于是剩下唯一的办法就是去源程序里找了。我也不是学编程的,更没有faster那种把Diablo反编译的精神与体力,幸好CMScout的作者Nygreen给我们提供了他的源文件,让我们找到这个二元函数。大家有兴趣的可以到http://prdownloads.sourceforge.n ... t-v3.10-source.zip?去下载这个源文件。

程序中有如下一段:

procedure TCM4PlayingData.ConvertRelativeAbilities(Ability: SmallInt);
begin
  if Goalkeeper < POSITION_THRESHOLD then
  begin
    FCrossing:=HighConvert(Ability, Crossing);
    FDribbling:=HighConvert(Ability, Dribbling);
    FFinishing:=HighConvert(Ability, Finishing);
    FHeading:=HighConvert(Ability, Heading);
    FLongShots:=HighConvert(Ability, LongShots);
    FMarking:=HighConvert(Ability, Marking);
    FOffTheBall:=HighConvert(Ability, OffTheBall);
    FPassing:=HighConvert(Ability, Passing);
    FPenalties:=HighConvert(Ability, Penalties);
    FTackling:=HighConvert(Ability, Tackling);
    FCreativity:=HighConvert(Ability, Creativity);

    FHandling:=LowConvert(Ability, Handling);
    FAerialAbility:=LowConvert(Ability, AerialAbility);
    FCommandOfArea:=LowConvert(Ability, CommandOfArea);
    FCommunication:=LowConvert(Ability, Communication);
    FKicking:=LowConvert(Ability, Kicking);
    FThrowing:=LowConvert(Ability, Throwing);
  end
  else
  begin
    FCrossing:=LowConvert(Ability, Crossing);
    FDribbling:=LowConvert(Ability, Dribbling);
    FFinishing:=LowConvert(Ability, Finishing);
    FHeading:=LowConvert(Ability, Heading);
    FLongShots:=LowConvert(Ability, LongShots);
    FMarking:=LowConvert(Ability, Marking);
    FOffTheBall:=LowConvert(Ability, OffTheBall);
    FPassing:=LowConvert(Ability, Passing);
    FPenalties:=LowConvert(Ability, Penalties);
    FTackling:=LowConvert(Ability, Tackling);
    FCreativity:=LowConvert(Ability, Creativity);

    FHandling:=HighConvert(Ability, Handling);
    FAerialAbility:=HighConvert(Ability, AerialAbility);
    FCommandOfArea:=HighConvert(Ability, CommandOfArea);
    FCommunication:=HighConvert(Ability, Communication);
    FKicking:=HighConvert(Ability, Kicking);
    FThrowing:=HighConvert(Ability, Throwing);
  end;

  FAnticipation:=HighConvert(Ability, Anticipation);
  FDecisions:=HighConvert(Ability, Decisions);
  FOneOnOnes:=HighConvert(Ability, OneOnOnes);
  FPositioning:=HighConvert(Ability, Positioning);
  FReflexes:=HighConvert(Ability, Reflexes);
  FThrowIns:=HighConvert(Ability, ThrowIns);
  FFirstTouch:=HighConvert(Ability, FirstTouch);
  FTechnique:=HighConvert(Ability, Technique);
end;

我来解释一下,FCrossing等就是我所说的FA,Ability就是我所说的CA,而Crossing等就是我所说的RA。这里有两个函数:HighConvert和LowConvert。当球员不是守门员的时候,他的非守门属性和共有属性由HighConvert决定,而他的守门属性由LowConvert决定;而当一个球员是守门员的时候,他的守门属性和共有属性由HighConvert函数决定,而他的非守门属性由LowConvert决定。其中HighConvert起主导作用。

HighConvert和LowConvert分别是如下定义的:
其中:Ability=CA,value=RA,Result=FA

function TCM4PlayingData.HighConvert(Ability: SmallInt;
  value: ShortInt): ShortInt;
var
  Temp: Double;
begin
  Temp:=(((value * 2) + Ability) * 0.05) + 10;
  Temp:=((((Temp * Temp) * 0.1) + Temp) * (1/3)) + 0.5;

  if Temp < 1 then
    Result:=1
  else if Temp > 20 then
    Result:=20
  else
    Result:=Trunc(Temp);
end;

function TCM4PlayingData.LowConvert(Ability: SmallInt;
  value: ShortInt): ShortInt;
var
  Temp: Double;
begin
  Temp:=(((Ability * 0.1) + (value * 2)) * 0.05) + 10;
  Temp:=((((Temp * Temp) * 0.1) + Temp) * (1/3)) + 0.5;

  if Temp < 1 then
    Result:=1
  else if Temp > 20 then
    Result:=20
  else
    Result:=Trunc(Temp);
end;

由此我们可以看出,f是一个二元二次函数。要注意的是Ability的类型是SmallInt,它的范围是(-127,127),这也就解释了f为什么分别在两个区间递增,因为我们看到的(128,255)其实代表的是(-127,-1)。

综上所述,非守门员的Crossing,Dribbling,Finishing,Heading,LongShots,Marking,OffTheBall,Passing,Penalties,Tackling,Creativity和守门员的Handling,AerialAbility,CommandOfArea,Communication,Kicking,Throwing以及两者共有的Anticipation,Decisions,OneOnOnes,Positioning,Reflexes,ThrowIns,FirstTouch,Technique是由函数HighConvert决定的。

通过上面的公式我们也可以部分解释妖人存在的原因了。我们可以看到绝大多数球员的RA都在(-127,-1)区间内,就连堂堂Giggs也只有Dribbling一项属性在(1,127)区间内。而妖人的属性如果在(1,127)内的话,那么即便他的CA很低,他的FA依然可以很高。例如当RA=127时,即便CA=1,依然可以得到FA=20。

以上就是我对FA、RA、CA三者之间关系的解释,感谢各位耐心看完。不过看看就完了,不要深究,CM是一款足球经理游戏,不要过分看重这些数据了,不然到最后我们面前的就只是一堆数字而已,还有什么意思。和现实相结合,才是玩CM的最大乐趣。

2月18日更新

上面的内容大家反映有点复杂,我再抛开程序部分,通俗的为大家解释一下:

还是以上图为例,四类值分别是:
RA:球员各项属性的实际能力,这个值也是游戏中实际存在的,无论是初始数据库还是存盘文件,球员的各项属性都是以这个值的形式保存的;显示范围:(1,255),但由于RA的数据类型是SmallInt,所以实际的范围是:(-127,127)
FA:球员各项属性的最终体现值,也就是我们在游戏中所看见的球员属性,范围:(1,20)
CA:球员的当前能力,范围:(1,200)
PA:球员的潜力,范围(1,200)

CA和PA的关系,我想大家都知道,就是CA总是在(1,PA)这个范围内浮动,这里我就不多说了。

下面主要介绍一下RA、PA、CA三者之间的关系:

球员的属性分为两类:

一类是FA与RA相等,这类属性不受CA影响,主要属性有(CM0304中):

精神属性        非守门员属性    守门员属性      共同属性
Adaptability    LeftFoot        Eccentricity    Acceleration
Ambition        RightFoot       RushingOut      SetPieces
Loyalty         Flair           TendencyToPunch Strength
Pressure        Corners                         Stamina
Professionalism Teamwork                        Pace
Sportsmanship   WorkRate                        Jumping
Temperament     LongThrows                      Influence
Controversy                                     Dirtiness
                                                Balance
                                                Bravery
                                                Consistency
                                                Aggression
                                                Agility
                                                ImportantMatches
                                                Injury Proneness
                                                Versatility
                                                Natural Fitness
                                                Determination

这类属性不作重点讨论。

另一类是FA和RA不相等,这类属性要受到CA的影响,主要的属性有(CM0304中):

非守门员属性    守门员属性      共同属性
Crossing        Handling        Anticipation
Dribbling       AerialAbility   Decisions
Finishing       CommandOfArea   OneOnOnes
Heading         Communication   Positioning
LongShots       Kicking         Reflexes
Marking         Throwing        ThrowIns
OffTheBall                      FirstTouch
Passing                         Technique
PenaltyTaking
Tackling
Creativity

这类属性可以用函数FA=HighConvert(RA,CA)表示

其中HighConvert可以表示为:

Temp1=(((RA * 2) + CA) * 0.05) + 10
FA=((((Temp1 * Temp1) * 0.1) + Temp1) * (1/3)) + 0.5

如果FA<1,则FA=1
如果FA>20,则FA=20
如果1<FA<20,则FA为上面结果的整数部分

因此,我们将RA和CA带入上述函数,就能得到相应的FA。

这个函数在CA一定的时候,在(-127,127)范围内随RA递增,在RA一定的时候,在(1,200)范围内随CA递增。也就是CA越高,FA越高;RA越高,FA越高。

知道这些对我们有什么用:

一、可以部分解释妖人存在的原因。

当CA=1的时候,由RA=97和RA=127都可以得到FA=20,而由RA=97时得到的FA=20会随着RA的衰减到96而迅速衰减到FA=19,可以说它处在一个不稳定状态,而由RA=127得到的FA=20,要一直RA衰减到96时才能得到FA=19,可以说它相对的处在一个稳定的状态。这就是为什么我们修改出来的属性全为20的球员会很快状态下降,而游戏里的妖人的一些状态可以稳定的保持在20。因为我们现在的修改器,都只能修改FA而不能修改RA。

二、RA和CA那个重要

由(RA * 2) + CA可以看出,在单项属性上RA的影响力要比CA大。(由(Temp1 * Temp1)可知,其影响力不只2倍)但是,由于CA一共影响了19项属性(非守门员),而且都是很重要的技术属性,因此个人认为,在RA和CA都有很大上升空间的情况下,CA显得更为重要。

三、选拔年轻球员的原则

由于第一类属性FA不受CA影响,因此这类属性只能靠训练提高,增加的比较缓慢。因此我喜欢挑选这些属性都比较高,潜力也比较高的年轻球员,即便他们的技术都非常烂。但随着CA的提高,他们的技术一般都会飞速提高。

以上都是我的一些个人观点,还望大家海涵。另外还有什么好的提议,也请大家不吝赐教。
发表于 2004-3-1 17:18:11 | 显示全部楼层
.........小说啊............
发表于 2004-3-1 17:34:56 | 显示全部楼层
加精!!!
发表于 2004-3-1 19:28:19 | 显示全部楼层
应该看得懂,可是我很懒,所以还是不懂^^
发表于 2004-3-1 19:48:36 | 显示全部楼层
高数论文啊  可惜我从小学数学就不好
发表于 2004-3-1 20:35:40 | 显示全部楼层
看不懂,先忍住不加,看另两个老大
发表于 2004-3-1 20:58:01 | 显示全部楼层
我是搞编程的,数学也学过很多,不过我可从没想过这么深入研究这些数值,佩服啊佩服
发表于 2004-3-1 21:10:04 | 显示全部楼层
通俗易懂性不够  可惜   但精神的确可佳  可佩
支持加  还看三位老大
发表于 2004-3-1 23:27:38 | 显示全部楼层
转贴请注名出处

这个帖子最近刚看过

确实不错

不过深了点
 楼主| 发表于 2004-3-1 23:39:48 | 显示全部楼层
好象是说球员的实际能力是从1-255(-127,127),而显示只有1-20,实际能力(-127,0)而潜力与能力高(不稳定,容易下降)的是牛人,实际能力(1,127)但潜力低能力高(很稳定,不易下降)是妖人,如果碰到实际能力在(1,127)且潜力与能力都极高的就应该算是“妖牛”了,是真正的极品。
    另外大家记不记得阿色以前的一篇帖子,是说一些数值极为养眼,但在比赛中表现很差评分极低的妖人,却百思不得其解,这篇帖子就给出了答案,那就是潜力属于-2级别的,显示能力也很高,但实际能力却很不幸的在(-127,-63)之间:twisted:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|FMFans ( 京ICP备07501235号 )

GMT+8, 2024-11-25 08:45 , Processed in 0.041313 second(s), 16 queries , Gzip On, APCu On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表