当前位置: 首页 > news >正文

STM32学习笔记二十:WS2812制作像素游戏屏-飞行射击游戏(10)探索游戏平衡

 游戏平衡很重要,然而,却往往得不到开发者的重视。或者,没有花时间仔细去做调整。

做过游戏开发的,都听说过一个词叫“数值爆炸”,实际上就是平衡没做好。

怎么样才能算是平衡呢?

玩家投入游戏的有两个,要么投入时间(提高熟练度),要么氪金(提高强度)。

让用户的投入,能通过某种方式体现出来,就是个好的平衡。

而作为开发者应该对玩家投入的时间,特别是首次、单次游戏的时间有所计划。

以前娱乐较少的时候,游戏首次、单词投入的时间能达到30分钟,而现在有个5分钟就不错。哪怕是3A大作,如果不能让玩家5分钟内上手,往后就难了。

现代游戏开发有个指标,策划让新玩家内测,他会希望 N% 的用户能够玩到 N 分钟。

比如2048游戏,希望80%的用户能合成到128,

比如Flepybird 游戏,希望80%的用户能飞10米。

比如羊了个羊 游戏,希望0.0001%的用户能通过第二关。

你必须要有类似这个目标,才能去调游戏数值。

这个题目很大,展开了都能开专题了。所以这里只是一个引子,希望大家重视。

回归本游戏,游戏平衡怎么做?

既然这是个非氪金游戏,那么就要让用户熟练度在游戏中有所体现。我们希望,80%用户能玩到5分钟,就很难再继续前进了。

首先第一个平衡是玩家火力和敌人的平衡。

敌人的总血量要考量几个因素:

-》单敌人单位的血量

-》敌人出现间隔

而玩家火力包括常规攻击方式和道具伤害。或者你可以理解为持续伤害和爆发伤害。

我们应该让他处于一种状态:玩家熟练度高时,可以干掉所有敌机,熟练度不足时,就要放过一部分敌机。简单做个乘除法就可以得到。

另一个平衡是玩家血量和敌机火力的平衡。

敌机火力于几个因素:

-》敌机生成密度

-》敌机开火密度

-》敌机子弹伤害

以上所有的这些东西,我们前面都是有数值控制的。

现在我们要做的是:

1、把这些数值都抽出来,放在统一的地方,以方便修改

。。。
#define PlayerMaxLife 12000
#define EnamyMaxLife 1000
#define EnemyBulletDam 400
#define EnemyRocketDam 2000
#define PlayerBulletDam 400
。。。

2、调整这些数值,看看每个数值对游戏影响,特别是确定每个数值的合理范围。这很重要,也很花时间。

3、用变量来代替这些数值,随着时间的进行,自动修改参数提高难度。

我们期望的效果是,在5分钟里我们让玩家:

1、前两分钟轻松打怪,积攒道具

2、中间两分钟有点扛不住,必须依靠道具才能继续

3、道具补充的速度赶不上消耗的速度,试图通过躲闪节省道具使用(通过这个阶段驱动玩家提高熟练度)

4、道具用完了,迅速崩溃

最终,我决定采用每分钟出现一次BOSS,出现BOSS时,缩小其他敌机出现的频率。

uint8_t EnemyManager::tick(uint32_t t) {if (createTimer.tick(t)) {EnemyBase *enemy = createEnemyObject();enemy->init();ListPushBack(enemyList, (LTDataType) enemy);}if (createBossTimer.tick(t)) {createTimer.defaultSpan -= 200;EnemyBase *enemy = new EnemyT3();enemy->init();ListPushBack(enemyList, (LTDataType) enemy);}for (ListNode *cur = enemyList->next; cur != enemyList; cur = cur->next) {EnemyBase *enemy = ((EnemyBase*) (cur->data));enemy->tick(t);}return 0;
}

这样,每过一分钟,敌机出现间隔少200ms。难度也随之增加了。

STM32学习笔记二十一:WS2812制作像素游戏屏-飞行射击游戏(11)探索游戏脚本

http://www.lryc.cn/news/275324.html

相关文章:

  • Windows 搭建ninja 编译c++的环境
  • 环形链表【链表】【哈希】
  • Hive实战:网址去重
  • 206.【2023年华为OD机试真题(C卷)】最大N个数与最小N个数的和(JavaPythonC++JS实现)
  • 【刷题日记】青少年CTF-Misc(一)
  • 《未知星途:自我掌握命运》
  • 一个简单的KNN实现方法
  • Vue实现加减法验证码
  • PDF最强处理工具-StirlingPDF
  • SpringCloud系列篇:入门讲解Spring Cloud是什么
  • GEE:随机数
  • H266/VVC率失真优化与速率控制概述
  • thinkphp6入门(14)-- 多关联模型查询
  • MT8766安卓核心板规格参数_MTK8766核心板模块方案定制
  • k8s的声明式资源管理(yaml文件)
  • Qt中图片旋转缩放操作
  • LeetCode 2125. 银行中的激光束数量【数组,遍历】1280
  • 关于图像分割任务中按照比例将数据集随机划分成训练集和测试集
  • 回文链表【链表】
  • Linux Perf 介绍
  • 【论文阅读】Variational Graph Auto-Encoder
  • 如何把电脑中的项目快速传进Github中?
  • Plantuml之nwdiag网络图语法介绍(二十九)
  • MyBatis接口的方法上使用,定义对应的 SQL 操作
  • (20)Linux初始文件描述符
  • draw.io基础操作和代码高效画图进阶
  • 2024-01-04 用llama.cpp部署本地llama2-7b大模型
  • HTTP打怪升级之路
  • axure RP9.0安装字体图标库fontawesome
  • PiflowX组件-ReadFromUpsertKafka