游戏开发论坛

 找回密码
 立即注册
搜索
查看: 11021|回复: 18

[讨论] [游戏力量]《连连看》类游戏的数值分析(数值如何和乐

[复制链接]

21

主题

639

帖子

674

积分

高级会员

Rank: 4

积分
674
发表于 2007-6-23 16:37:00 | 显示全部楼层 |阅读模式
连连看数值
一、基础部分
1、 用户消除一对方块需要的时间:x=3*N*M。其中3s为我们预期的目标用户平均完成一次操作的时间,N是游戏难度的调整系数,M是期望偏差调整值(在收集样本之后,证明3秒不符合我们的预期,调整该数值)。默认的N、M调整系数是1。
2、 预期用户在2s内完成一次操作的几率是25%,在2~4s内完成一次操作的几率是50%,4s以上完成一次操作的几率是25%(该预期数值可以用于调整游戏的难度)。
3、 样本收集:选择目标用户进行测试。必要环境:游戏中没有任何事件。获取用户完成一局游戏的时间(Fullfill Time),该局游戏方块的对数(Diamonds)。记录:(FullfillTime/ Diamonds)数值,根据取样数,计算置信区间,验证3s的期望值是否正确。
4、 计算一局方块对数;一局方块对数= 实际方块数/2。
5、 根据一局方块对数、预期的消除一对方块需要的时间,我们可以计算出预期的一局游戏的时间。一局游戏时间 = 一局方块对数(Diamonds)* x。同时我们也可以得出以刺激点为单位的时间线。
二、数值调整方案
1、每消除一对剩余总时间:第一对(TotalTime+TimeIncSpeed-x)(大于TotalTime,则总时间为TotalTime);第二对(TotalTime+2(TimeIncSpeed-x));第n对(TotalTime+n(TimeIncSpeed-x))(注:TotalTime持续减少是一个压力持续增加的过程;TimeIncSpeed >x意味着流逝的时间有很大几率步足。)。
2、消除所有方块,我们至多给用户的总时间:T=TotalTime+(Diamonds-1)×TimeIncSpeed. 用户的消除速度:T/ Diamonds(s/对)。用该数值与预期的用户平均操作时间比较,相同则难度适中,该数值低则难度过高(事件对时间的影响,直接在T上计算;如一个Bomb事件,相当于增加了给用户的3s游戏时间)。
3、TotalTime也意味着允许的用户连续卡壳时间(4s以上,称为卡壳),根据1计算出的结果既是:在每一对方块消除后允许的连续卡壳(连续MISS)时间(与一2进行比较,可知每一对方块消除后,用户输掉的几率有多大)。
4、用户在HitTimeIncSpeed时间内完成第二次操作,能保持连击;假设用户A消除一对方块的平均时间为2s每对。则用户A能保持一直连击(换言之鼓励用户在HitTimeIncSpeed内完成一次操作)。
6、总积分下限和上限:设一局游戏有n对方块;下限(n×BaseScoreUnit);上限(n×BaseScoreUnit+n×(n-1)×HitScoreUnit÷2)。调整BaseScoreUnit和HitScoreUnit的比例。如HitScoreUnit比重大,则能引导用户更多的连击。
7、一局游戏某事件出现次数的期望值。Diamonds&#215robability。
三、事件
1、Bomb事件:事件发生后消除一对方块,相当于增加3s的总时间。
2、Random事件:思维卡壳的补偿设计(3s包含卡客时间),相当于提高用户消除方块的速度。
3、Scoreplus事件:额外积分奖励。
4、Slowdown事件:相当于增加总时间,增加连击的几率(增加的游戏时间:t/v-t)。v=新的时间流逝速度÷正常时间流逝速度。
5、TimeStop事件:相当于增加总时间(效果=Value(平均值)+Value/3)。
四、调整方案(不管调整什么数值,都需要调整下面三点来控制难度规模。)
1、不管调整哪项参数,都需要保证二1中每一次剩余时间大于0。
2、根据二3,估算游戏中每一次消除后的游戏难度;例:TotalTime = 3s、TimeIncSpeed = 3s。则完成总游戏的几率为:(0.75)20=……(总之很低)
3、二2,得出用户完成游戏至少需要的消除速度。
五、范例
1、 死亡边缘:设游戏中总的方块对数为20对。TotalTime = 16s、TimeIncSpeed = 1s,则用户最大可能的方块消除对数为5对。每消除一对生成一个TimeStop事件。每个TimeStop事件能停止时间3s。(注:在最极端的情况下,用户连续消除7对无事件方块,剩余13对方块,时间剩余为3s;其中一半方块带有TimeStop事件。在这种情况下,用户每消除一对事件方块,获得额外的一次消除方块的机会,总时间增加1秒。用户始终处于总时间不足的压力状态)。
2、 随机事件:设游戏中总的方块对数为20对。TotalTime = 17s、TimeIncSpeed = 2s,我们给用户的总时间:17+19×2 = 55s。预估用户在一局游戏中的卡壳次数为4次。则每消除4对方块生成一对Random事件方块。
3、 教学关卡:设游戏中总的方块对数为20对。TotalTime = 20s、TimeIncSpeed = 3s,保证游戏结束时,每种事件都生成一次。用户玩完该局游戏能把所有的事件都接触一次(所有事件的出现几率)。则每个事件的触发几率为0.05(二6期望值计算),这种情况下仍然有一定几率不触发事件,可适当调高几率,保证事件触发。
4、 连击关卡:两连很容易,以后连击难度增加。在这种情况下,用户每次获得第一个连击奖励画面。如果奖励画面做的足够漂亮,有可能引起用户连续的获得第二个连击奖励画面的诉求。HitTotalTime =3s、TimeIncSpeed = 2s,第一次75%几率完成连击,之后用户有75%*75%=56%的几率2连击,之后完成连击的几率越来越低(用户的操作时间符合正态分布,保持连击的几率越来越低);但在惯性、积分奖励、画面奖励的引导下,用户的操作速度有很大可能保持在一个较快的状态,同时因为自己的当前操作速度高于一般操作速度,担心连击失败(不能继续获得以上奖励),而保持紧张感(鉴于用户可能保持在一个较快的状态,可以将TimeIncSpeed调低,暂定为2s)。

14

主题

581

帖子

583

积分

高级会员

Rank: 4

积分
583
QQ
发表于 2007-6-23 16:45:00 | 显示全部楼层

Re:[游戏力量]《连连看》类游戏的数值分析(数值如何和

呵呵.

11

主题

139

帖子

139

积分

注册会员

Rank: 2

积分
139
发表于 2007-6-23 16:49:00 | 显示全部楼层

Re:[游戏力量]《连连看》类游戏的数值分析(数值如何和

虽然不是很懂数值,不过看的蛮顺的,不错。

6

主题

128

帖子

128

积分

注册会员

Rank: 2

积分
128
发表于 2007-6-23 16:54:00 | 显示全部楼层

Re:[游戏力量]《连连看》类游戏的数值分析(数值如何和

偶也不懂数值!!!

122

主题

2758

帖子

3151

积分

论坛元老

Rank: 8Rank: 8

积分
3151
发表于 2007-6-23 17:22:00 | 显示全部楼层

Re:[游戏力量]《连连看》类游戏的数值分析(数值如何和

噫…这个那个…
大大 版权版权……

21

主题

639

帖子

674

积分

高级会员

Rank: 4

积分
674
 楼主| 发表于 2007-6-24 11:21:00 | 显示全部楼层

Re:[游戏力量]《连连看》类游戏的数值分析(数值如何和

为什么这篇贴子会沉?虽然只是《连连看》类游戏的数值设定,但其实数值设定的基本过程都包含在里面了。

49

主题

1388

帖子

1432

积分

金牌会员

Rank: 6Rank: 6

积分
1432
发表于 2007-6-24 17:05:00 | 显示全部楼层

Re:[游戏力量]《连连看》类游戏的数值分析(数值如何和

我相信 连连看 不是从“用户消除一对方块需要的时间:x=3*N*M”出发来做数值的

最简单的算法是完全随机生成,当然如果想控制开局的难度,也可以限定 开局N步内 配对的数目这样就可以增加难度

21

主题

639

帖子

674

积分

高级会员

Rank: 4

积分
674
 楼主| 发表于 2007-6-24 17:21:00 | 显示全部楼层

Re:[游戏力量]《连连看》类游戏的数值分析(数值如何和

1.首先,这是一份类《连连看》游戏的数据设定分析,不是《连连看》;
2.即使是随机,在程序实现时仍然需要用代码写下“随机”的方法;
3.下附这款游戏的数据项。

游戏数据设定规格
prefs文件里面保存了大量的游戏数据设定,可以随时修改这个文件中的设定,然后重新启动游戏,数据即可生效。

Prefs文件内容为:
//---------------------------------------------------------------------------
//-----------------------------------------------------------------------------

//
$pref:Tgame::ElapsedUpdateTime                 = 200;

// Special event defines
$pref::SpecialEvent::EventCount                 = 5;         // 特殊方块的类型数量
// Bomb event
$pref::SpecialEvent::Type[0]                         = 2;                //         类型
$pref::SpecialEvent::Enable[0]                         = 0;                // 是否激活该种特殊方块
$pref::SpecialEvent:robability[0]         = 100;                // 发生几率
$pref::SpecialEvent::LifeTimeMin[0]         = 15000;                // 发生后的存在时间
$pref::SpecialEvent::LifeTimeMax[0]         = 20000;
$pref::SpecialEvent::ValueMin[0]               = 0;        // 具体数据
$pref::SpecialEvent::ValueMax[0]               = 1;
// Random event
$pref::SpecialEvent::Type[1]                         = 1;               
$pref::SpecialEvent::Enable[1]                         = 0;
$pref::SpecialEvent::Probability[1]         = 40;
$pref::SpecialEvent::LifeTimeMin[1]         = 15000;
$pref::SpecialEvent::LifeTimeMax[1]         = 20000;
$pref::SpecialEvent::ValueMin[1]               = 0;
$pref::SpecialEvent::ValueMax[1]               = 1;
// score plus event
$pref::SpecialEvent::Type[2]                         = 3;               
$pref::SpecialEvent::Enable[2]                         = 1;
$pref::SpecialEvent::Probability[2]         = 30;
$pref::SpecialEvent::LifeTimeMin[2]         = 15000;
$pref::SpecialEvent::LifeTimeMax[2]         = 20000;
$pref::SpecialEvent::ValueMin[2]               = 5;
$pref::SpecialEvent::ValueMax[2]               = 20;
// slowdown event
$pref::SpecialEvent::Type[3]                         = 4;               
$pref::SpecialEvent::Enable[3]                         = 1;
$pref::SpecialEvent::Probability[3]         = 20;
$pref::SpecialEvent::LifeTimeMin[3]         = 15000;
$pref::SpecialEvent::LifeTimeMax[3]         = 20000;
$pref::SpecialEvent::ValueMin[3]               = 8000;
$pref::SpecialEvent::ValueMax[3]               = 10000;
// time stop event
$pref::SpecialEvent::Type[4]                         = 5;               
$pref::SpecialEvent::Enable[4]                         = 1;
$pref::SpecialEvent::Probability[4]         = 20;
$pref::SpecialEvent::LifeTimeMin[4]         = 15000;
$pref::SpecialEvent::LifeTimeMax[4]         = 20000;
$pref::SpecialEvent::ValueMin[4]               = 8000;
$pref::SpecialEvent::ValueMax[4]               = 10000;


$pref::LayerDefine::SpecialEvent                 = 4;

///
/// Link Tile Game rule
///

//////////////////////////////////////////////////////////////////////////////////
///////////////////                 三种难度的数据设定        //////////////////
// Easy Level
$pref::LTLevelEasy::TotalTime            = 50000;        // 时间槽总时间
$pref::LTLevelEasy::HitTotalTime         = 5000;                // 连击槽总时间
$pref::LTLevelEasy::TimeIncSpeed         = 4000;                // 消除一对方块后增加的时间
$pref::LTLevelEasy::HitTimeIncSpeed      = 4000;       
$pref::LTLevelEasy::BaseScoreUnit        = 10;                // 消除一对方块后的基本得分
$pref::LTLevelEasy::HitScoreUnit         = 5;                        // 连击奖励分数加权
$pref::LTLevelEasy::LevelFileIndexMin    = 0;                        // 方块排列阵形文件范围(决定方块的排列形状)
$pref::LTLevelEasy::LevelFileIndexMax    = 2;
$pref::LTLevelEasy::TileTypeCountMin     = 15;                // 方块类型数量范围(随机从中挑选)
$pref::LTLevelEasy::TileTypeCountMax     = 17;
// Normal Level
$pref::LTLevelNormal::TotalTime            = 30000;
$pref::LTLevelNormal::HitTotalTime         = 4000;
$pref::LTLevelNormal::TimeIncSpeed         = 3500;
$pref::LTLevelNormal::HitTimeIncSpeed      = 5000;
$pref::LTLevelNormal::BaseScoreUnit        = 15;
$pref::LTLevelNormal::HitScoreUnit         = 10;
$pref::LTLevelNormal::LevelFileIndexMin    = 3;
$pref::LTLevelNormal::LevelFileIndexMax    = 6;
$pref::LTLevelNormal::TileTypeCountMin     = 26;
$pref::LTLevelNormal::TileTypeCountMax     = 30;

// Hard Level
$pref::LTLevelHard::TotalTime            = 25000;
$pref::LTLevelHard::HitTotalTime         = 3000;
$pref::LTLevelHard::TimeIncSpeed         = 3000;
$pref::LTLevelHard::HitTimeIncSpeed      = 4000;
$pref::LTLevelHard::BaseScoreUnit        = 20;
$pref::LTLevelHard::HitScoreUnit         = 30;
$pref::LTLevelHard::LevelFileIndexMin    = 7;
$pref::LTLevelHard::LevelFileIndexMax    = 10;
$pref::LTLevelHard::TileTypeCountMin     = 32;
$pref::LTLevelHard::TileTypeCountMax     = 34;


////////////////////////////////////////////////////////////////////
//                 Level Define
//                 挑战模式不同等级数据设定
////////////////////////////////////////////////////////////////////
// Tile layer filename
// 不同等级的方块排列形状文件
$pref::ChallengeLevel::LevelFile[0]   = "LinkTile/Data/tilemaps/TileBoard_level_0.lyr";
$pref::ChallengeLevel::LevelFile[1]   = "LinkTile/Data/tilemaps/TileBoard_level_1.lyr";
$pref::ChallengeLevel::LevelFile[2]   = "LinkTile/Data/tilemaps/TileBoard_level_2.lyr";
$pref::ChallengeLevel::LevelFile[3]   = "LinkTile/Data/tilemaps/TileBoard_level_3.lyr";
$pref::ChallengeLevel::LevelFile[4]   = "LinkTile/Data/tilemaps/TileBoard_level_4.lyr";
$pref::ChallengeLevel::LevelFile[5]   = "LinkTile/Data/tilemaps/TileBoard_level_5.lyr";
$pref::ChallengeLevel::LevelFile[6]   = "LinkTile/Data/tilemaps/TileBoard_level_6.lyr";
$pref::ChallengeLevel::LevelFile[7]   = "LinkTile/Data/tilemaps/TileBoard_level_7.lyr";
$pref::ChallengeLevel::LevelFile[8]   = "LinkTile/Data/tilemaps/TileBoard_level_8.lyr";
$pref::ChallengeLevel::LevelFile[9]   = "LinkTile/Data/tilemaps/TileBoard_level_9.lyr";
$pref::ChallengeLevel::LevelFile[10]   = "LinkTile/Data/tilemaps/TileBoard_level_10.lyr";
// Tile type count
// 不同等级的方块种类数量
$pref::ChallengeLevel::TileTypeCount[0]    = 15;
$pref::ChallengeLevel::TileTypeCount[1]    = 16;
$pref::ChallengeLevel::TileTypeCount[2]    = 17;
$pref::ChallengeLevel::TileTypeCount[3]    = 18;
$pref::ChallengeLevel::TileTypeCount[4]    = 22;
$pref::ChallengeLevel::TileTypeCount[5]    = 28;
$pref::ChallengeLevel::TileTypeCount[6]    = 26;
$pref::ChallengeLevel::TileTypeCount[7]    = 30;
$pref::ChallengeLevel::TileTypeCount[8]    = 32;
$pref::ChallengeLevel::TileTypeCount[9]    = 32;
$pref::ChallengeLevel::TileTypeCount[10]    = 32;

////////////////////////////////////////////////////////////////////
// Challenge Level Data Define
// 挑战模式数据设定
////////////////////////////////////////////////////////////////////

$pref::ChallengeLevel::LevelCount     = 11;                // 挑战等级数量
// level 0
$pref::ChallengeLevel::TotalTime[0]            = 55000;                /// 时间槽总时间
$pref::ChallengeLevel::HitTotalTime[0]         = 6000;                        // 连击槽总时间
$pref::ChallengeLevel::TimeIncSpeed[0]         = 5000;                // 消除一对方块后增加的时间
$pref::ChallengeLevel::HitTimeIncSpeed[0]      = 4000;       
$pref::ChallengeLevel::BaseScoreUnit[0]        = 10;                // 消除一对方块后的基本得分
$pref::ChallengeLevel::HitScoreUnit[0]         = 5;                // 连击奖励分数加权

// level 1
$pref::ChallengeLevel::TotalTime[1]            = 50000;
$pref::ChallengeLevel::HitTotalTime[1]         = 5500;
$pref::ChallengeLevel::TimeIncSpeed[1]         = 4000;
$pref::ChallengeLevel::HitTimeIncSpeed[1]      = 4000;
$pref::ChallengeLevel::BaseScoreUnit[1]        = 10;
$pref::ChallengeLevel::HitScoreUnit[1]         = 5;
// level 2
$pref::ChallengeLevel::TotalTime[2]            = 45000;
$pref::ChallengeLevel::HitTotalTime[2]         = 5000;
$pref::ChallengeLevel::TimeIncSpeed[2]         = 3600;
$pref::ChallengeLevel::HitTimeIncSpeed[2]      = 4000;
$pref::ChallengeLevel::BaseScoreUnit[2]        = 10;
$pref::ChallengeLevel::HitScoreUnit[2]         = 5;
// level 3
$pref::ChallengeLevel::TotalTime[3]            = 40000;
$pref::ChallengeLevel::HitTotalTime[3]         = 4500;
$pref::ChallengeLevel::TimeIncSpeed[3]         = 3600;
$pref::ChallengeLevel::HitTimeIncSpeed[3]      = 4000;
$pref::ChallengeLevel::BaseScoreUnit[3]        = 15;
$pref::ChallengeLevel::HitScoreUnit[3]         = 10;
// level 4
$pref::ChallengeLevel::TotalTime[4]            = 35000;
$pref::ChallengeLevel::HitTotalTime[4]         = 4000;
$pref::ChallengeLevel::TimeIncSpeed[4]         = 3500;
$pref::ChallengeLevel::HitTimeIncSpeed[4]      = 4000;
$pref::ChallengeLevel::BaseScoreUnit[4]        = 15;
$pref::ChallengeLevel::HitScoreUnit[4]         = 10;

// level 5
$pref::ChallengeLevel::TotalTime[5]            = 30000;
$pref::ChallengeLevel::HitTotalTime[5]         = 4000;
$pref::ChallengeLevel::TimeIncSpeed[5]         = 3300;
$pref::ChallengeLevel::HitTimeIncSpeed[5]      = 4000;
$pref::ChallengeLevel::BaseScoreUnit[5]        = 15;
$pref::ChallengeLevel::HitScoreUnit[5]         = 10;

// level 6
$pref::ChallengeLevel::TotalTime[6]            = 28000;
$pref::ChallengeLevel::HitTotalTime[6]         = 4000;
$pref::ChallengeLevel::TimeIncSpeed[6]         = 3000;
$pref::ChallengeLevel::HitTimeIncSpeed[6]      = 4000;
$pref::ChallengeLevel::BaseScoreUnit[6]        = 15;
$pref::ChallengeLevel::HitScoreUnit[6]         = 10;

// level 7
$pref::ChallengeLevel::TotalTime[7]            = 28000;
$pref::ChallengeLevel::HitTotalTime[7]         = 3000;
$pref::ChallengeLevel::TimeIncSpeed[7]         = 3000;
$pref::ChallengeLevel::HitTimeIncSpeed[7]      = 4000;
$pref::ChallengeLevel::BaseScoreUnit[7]        = 20;
$pref::ChallengeLevel::HitScoreUnit[7]         = 30;

// level 8
$pref::ChallengeLevel::TotalTime[8]            = 26000;
$pref::ChallengeLevel::HitTotalTime[8]         = 3000;
$pref::ChallengeLevel::TimeIncSpeed[8]         = 2800;
$pref::ChallengeLevel::HitTimeIncSpeed[8]      = 4000;
$pref::ChallengeLevel::BaseScoreUnit[8]        = 20;
$pref::ChallengeLevel::HitScoreUnit[8]         = 30;

// level 9
$pref::ChallengeLevel::TotalTime[9]            = 25000;
$pref::ChallengeLevel::HitTotalTime[9]         = 3000;
$pref::ChallengeLevel::TimeIncSpeed[9]         = 2700;
$pref::ChallengeLevel::HitTimeIncSpeed[9]      = 4000;
$pref::ChallengeLevel::BaseScoreUnit[9]        = 20;
$pref::ChallengeLevel::HitScoreUnit[9]         = 30;

// level 10
$pref::ChallengeLevel::TotalTime[10]            = 23000;
$pref::ChallengeLevel::HitTotalTime[10]         = 3000;
$pref::ChallengeLevel::TimeIncSpeed[10]         = 2500;
$pref::ChallengeLevel::HitTimeIncSpeed[10]      = 4000;
$pref::ChallengeLevel::BaseScoreUnit[10]        = 20;
$pref::ChallengeLevel::HitScoreUnit[10]         = 30;




49

主题

1388

帖子

1432

积分

金牌会员

Rank: 6Rank: 6

积分
1432
发表于 2007-6-24 21:28:00 | 显示全部楼层

Re:[游戏力量]《连连看》类游戏的数值分析(数值如何和

不太明白 Susaro 从 那份配置文件中得到什么样的信息,也不知道你玩的连连看是哪个版本

在我看来,连连看的简单模型就是 从N个方块中找到M对可以配对的方块,M/2<=N,方块类型数量为X

控制难度的方式有:

N 的数量

X的数量

M值<-----这个全部计算估计很难,应该是算前几步的M值

N个方块的位置变化

我玩的连连看版本 一开始难度增加是增加N和 X的数量,之后是连后方块发生变化,如从上往下掉,从右往左掉,四周往中收缩等等

21

主题

639

帖子

674

积分

高级会员

Rank: 4

积分
674
 楼主| 发表于 2007-6-24 22:00:00 | 显示全部楼层

Re:[游戏力量]《连连看》类游戏的数值分析(数值如何和

假设存在如下模式
1.在规定时间内完成最多的关卡(或者消除最多对)
2.拉力赛(让用户的在保持轻松的时间压力下累计关卡数量或者分数)
3.关卡预设的总时间短于消除全部方块所需的正常时间(多个不同水平用户测试数据,假定为标准时间),但是消除方块可以获得一定时间的奖励
以上三种模式,只用M、N、X就能表达吗?
M、N、X是《连连看》最基本的要素,但并不代表《连连看》表现给用户的就是这些。而且这是一个 类 《连连看》游戏。
另外,这个游戏是爱好者自己写的,所以数据项在开发者这里肯定是透明的。数据分析指名了数据项的具体用途,而数据项则给数据分析提供了元素进行分析。
这两份文档的意义应该很清晰,对于游戏开发者来说,提取其中有用的元素已经很足够。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-7-17 10:43

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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