0 2022/5/2
1 2048问题
- 今天尝试了通过排序的方法控制游戏难度,但无法到有效控制游戏的结束。例如:假设设置结束时间步数为300步。将游戏得分分为5个等级,因此每60步就是一个等级的得分。通过这种方法游戏大概都是在150步的时候结束。
- 考虑到效率问题,只控制了三个棋子,会在一定程度上影响到游戏的难度控制。
1.1 改进思路
在我设计的评估函数中,平滑性和连接性是每一个局面都通用的,而数量优先和数值优先只会影响到当前局面。所以控制难度的时候应该以平滑性和连接性为指标。随着时间的推移平滑性和连接性是递减的。
1.2 下一步工作
- 通过控制平滑性和连接性,让游戏逐渐变难。
- 思考怎么能控制所有生成棋子。
0 2022/5/3
1 连接性难度控制
1.1 思路
假设初始局面的连接性为20,结束步数为120。120/20 = 6,因此每六步就需要连接性降1。理论上到120步时,连接性刚好降为0.
1.2 具体步骤
- 穷举出所有可能的动作;
- 使用评估函数对动作打分;
- 判断新生成局面和上一步局面连接性的大小,将动作分别存放在两个数组中;
- 判断是否需要提升难度;
- 从相应的动作数组中,选取动作;
2 随机数控制
随着难度的提升,增加随机数的数值区间。
0 2022/5/4
今天和李杨老师进行了讨论,针对他提出的一些问题对2048做了相应的修改。
1 问题
1.1 难度控制
之前使用当前局面和上一步局面连接性作为参考进行难度控制,导致结束步数误差过大。现在直接给每一步的局面设定一个理想连接性,在生成数字时,选择最靠近理想连接性的动作。
1.2 当场上相同数字过多时,游戏会卡死
游戏卡死的原因是,计算连接性的函数存在问题,当相同数字很多时,计算量会变得很大。重新定义了该函数。
1.3 如何控制初始化局面
定义一个数组,每次初始化,都从中随机选择数字,从而通过控制数组里的数字占比达到控制初始化局面的数字占比的效果。
0 2022/5/5
1 触发规则
通过平滑性,连接性,数量优先,数值优先来控制动作的生成。
2 生成规则
通过平滑性和连接性来选择动作,游戏前中期使用平滑性来控制游戏的难度,后期使用连接性控制游戏难度,从而让游戏拥有一个平滑的难度曲线。
3 随机生成
对于随机生成的数字也需要控制,例如使用数值优先来进行控制,保证不会生成过大的数字。
4 完善和优化代码
今天对代码进行了优化,减少计算量,方便后期移植到java中。