四、玩家

在本章中,我们将概述系统/项目中的角色、用户和利益相关者(参与者)。在第 2 章框架中,我们讨论了巴特尔游戏测试中概述的玩家类型(杀手、成就者、社交者和探索者)。我们需要更仔细地观察我们的用户/玩家及其动机,以便在设计游戏化电子学习系统时最大限度地理解这一点。我们将以 MySQL 中的一些初始数据库设计来结束本章,这样我们就拥有了构建系统的所有技术。

玩家心理的巴特尔测试

虽然它可能需要更新,但玩家心理的巴特尔测试已经成为讨论游戏化系统中玩家类型的标准。Bartle 在 20 世纪 90 年代中期在视频游戏设计的背景下提出了系统/测试,并被移植到游戏化领域。模型可能需要一些调整,但这是朝着正确方向的良好开端。

Bartle 测试是一个由 30 个问题组成的系列,旨在评估与游戏场景中互动相关的个性类型和偏好。玩家通常倾向于一个类别多于其他三个类别。让我们快速回顾一下。

杀手

杀手的动机是直接的游戏和对系统中其他玩家的影响。他们渴望赢得这场比赛。我们将在我们的系统中使用以下部分讨论的游戏元素来支持这些玩家。

排行榜

排行榜是一个突出的显示游戏中得分最高的领导者的图形。以下是一个例子:

Leaderboards

防守、批判性岗位奖励

因为杀手的动机是直接的竞争,所以我们可以利用这种动机,通过为一名玩家通过防守其他玩家的帖子以及攻击(批评)玩家的帖子而获得的帖子加分。

Rewards for defending and critiquing posts

成就者

像杀手一样,成功者希望对系统产生直接影响。然而,这种影响不需要以牺牲其他玩家为代价。玩家被驱使去赢得和完成目标,但不需要赢得本身,因为达到目标就足够了。

我们可以通过以下游戏元素来实现这一点。

徽章

成功者被他们的成就所带来的认可所激励。我们可以通过排行榜在某种程度上满足这种动机。然而,排行榜让玩家相互竞争,这是成功者不会像杀手那样得到回报的。因此,他们需要奖杯。为了成就,他们需要承认自己的成就。徽章使这成为可能。

徽章是玩家收到的图形图像,表示他们已经达到了一个里程碑。我们越来越习惯于用徽章来表彰成就,从青年童子军项目到对权威人物的认可。因此,这一概念在社会上是可以接受的。

在系统中实施徽章方案一直是对游戏化运动的主要批评之一,因此我们需要谨慎地明智地使用机制。糟糕的徽章通常会适得其反。

我们希望确保我们的徽章系统符合以下四个标准。徽章应:

  • 具有抱负、可预测成就的惊喜玩家:徽章在用于识别明确成就时往往效果最好。然而,奖励本身也有令人惊讶的因素。它们不能如此随机,以至于玩家无法将它们与他们想要识别的进度或状态联系起来。另一方面,它们不能如此线性以至于玩家对它们感到厌烦。我们的电子学习系统中的玩家将获得各种徽章,以表明他们对该系统的参与程度。当玩家达到一个门槛(比如 25 个帖子)后,他们将获得参与徽章。玩家将能够获得更多的徽章,因为他们继续达到其他阈值。
  • 要有审美吸引力:徽章需要好看,并且对玩家有视觉吸引力。玩家需要为徽章的外观和感觉感到自豪。
  • 稀缺:徽章系统更强大的一个方面是稀缺因素。如果物品“不太容易获得”,它们往往具有更大的感知价值。因此,徽章应该很少发放。出于这个原因,我们将限制任何成就的徽章数量为预定的用户百分比。此外,我们将提高未来徽章的阈值水平,因为预定百分比的用户达到徽章。这增加了获得这些徽章的难度。
  • Be meaningful: We need to tie the badging system to something that players will find meaningful. We can't simply dole out badges for the sake of doing so. Although collecting badges is a motivator for some, the need to collect should not overshadow the need to achieve.

    Badges

    几个徽章示例

找平/进度

在之前关于徽章的讨论中,我们已经讨论了水平。升级是一种游戏机制,我们通过奖励并认可玩家在系统中达到一定的精通程度。在许多情况下,达到更高的水平也会为玩家带来更多的好处和功能。

我们已经讨论过给予我们的玩家评论或评论帖子的能力(请参见为捍卫和评论帖子奖励部分中的屏幕截图)。然而,我们只能在玩家在系统中达到一定程度的参与后才能使用此功能。我们可以通过累积的点数来衡量这种参与程度。

挑战

挑战往往特别吸引成就动机类型的人。挑战是预先设定的目标,玩家可以渴望实现。

在我们的系统中,我们允许球员为自己设定目标,但我们也可以为球员提供挑战。例如,我们可以让玩家在 7 天内回复一定数量的帖子。这是一个许多成功者都会努力追求的目标,并且可以合理地实现。

社交者

这些玩家的动机与杀手和成功者的动机非常不同。社交者被与其他玩家的互动所感动。像杀手一样,他们渴望与其他玩家接触,但他们的接触并不好斗。它更具协作性。

我们将通过以下要素支持社会化者:

  • 分享:我们非常熟悉分享的概念。它是社交媒体的核心。我们将奖励那些在 Facebook 和 Twitter 上与好友分享系统外帖子的玩家。但分享并不局限于玩家建立的社交网络。分享的一个关键方面是与可能对分享感兴趣的人交朋友或跟随他们。在我们的电子学习系统中,玩家可以选择跟随其他他们倾向于有共同观点的玩家。当玩家跟随或被其他玩家跟随时,将获得积分。
  • 组队:组队需要考虑一个队列进行积分积累。例如,玩家可以创建团队。我们将实施团队排行榜。当杀手和成功者被转移到采取行动来提高自己在排行榜上的得分时,社交者将确保更倾向于采取行动来提高团队的积分积累。作为个人,行动可能不是优先事项,但作为团队贡献者,它是优先事项。

探险家

我们通过考察探险家以及我们如何吸引这种游戏人格类型,对我们游戏化系统中的潜在玩家进行了全面考察。探索者和社交者一样,都在寻求互动和参与,但更多的是与系统本身,而不是与其他参与者。和成功者一样,他们希望参与到系统中来,但不是为了实现目标。他们满足于享受游戏本身的乐趣。对他们来说,旅程就是回报。发现是他们的主要动力。

与探险者配合良好的游戏机制包括任务(搜索)、谜题和收集。下面是一些我们可以在系统中实现的示例。

我们可以通过一组玩家可以随时执行的任务在我们的系统中执行任务/搜索。我们可以在玩家每次查看帖子时记录点数,但每次帖子与前一个类别不同时,我们可以将点数加倍。目标是创造一种冒险的感觉。

另一种可能的情况是对创建新的讨论主题给予积分和奖励。探险家总是试图突破系统的极限。

我们的球员

以下列表显示了各种参与者:

  • 海报:这是一个普通的玩家,他回应另一个玩家的观点。
    • 后卫:这是一张支持球员观点的海报。
    • 评论家:这是一张不同意球员观点的海报。
  • 队友:这是与另一名球员有团队关系的球员。
  • 发令者:这是一名玩家,他是第一个就某个话题发表观点的玩家。
  • 创建者:这是一个播放器,创建了一个讨论主题。
  • 新秀:这是一名有账户但没有回复或帖子的玩家。
  • 老兵:这是一名玩家拥有超过 30 天的账户和/或 30 次登录会话。

创建 MySQL 数据库

我们需要一种方法来保存关于我们的玩家和系统的所有信息。如果我们没有以合乎逻辑的方式存储这些信息,玩家每次登录时都需要重新启动我们的系统。这不是一个好的系统。

在我们的环境中,我们选择使用开源数据库 MySQL。如果您在上一章中安装了 WAMP 服务器,那么您应该已经安装了 MySQL。在这里,我们将开始使用它。

我们的 WAMP 安装包括 phpMyAdmin,如下面的屏幕截图所示。这是一种直接从 web 浏览器创建和管理数据库的工具。

Creating the MySQL database

在单击 WAMP 服务器菜单上的phpMyAdmin选项后,我们将看到 PHP 管理工具的主屏幕:

Creating the MySQL database

让我们创建 main Point 数据库。点击数据库菜单上的。命名数据库VuPoint并点击创建。您可以在左侧看到我们的数据库列表:

Creating the MySQL database

我们可以在PHPMyAdmin主屏幕左侧的数据库列表中找到我们新创建的数据库:

Creating the MySQL database

我们可以安装许多基于 GUI 的 MySQL 工具,以简化一些数据库表创建和存储过程创建。我们将以两者为例。选择你最喜欢的。有关工具选项,请访问www.mysql.com/downloads

创建我们的表格

数据库由由列/字段组成的表组成。我们可以在最初创建表之后添加/修改/删除列,但最好将这些类型的更改保持在最低限度,因为它们可能会严重干扰表中已存储的数据。

以下是我们的系统需要的一些表格:

  • Player:此表将保存系统用户的所有信息
  • PlayerID:这是每个玩家的内部唯一标识符
  • Username:这是系统中已知玩家的名称(外部标识符)
  • Password:播放器登录系统时使用的密码
  • Points:玩家当前积分累计
  • BadgesEarned:玩家使用徽章完成的活动 ID
  • Email Address:该玩家的唯一电子邮件地址
  • Login Count:玩家登录的总次数
  • LastLogin:玩家最后一次登录系统的日期和时间
  • CurrentlyLoggedIn:该玩家是否登录的true/false
  • AccountCreated: The date and time when the player created this account

    Creating our tables

注意,PlayerID字段是用auto_increment和主键创建的(见上图)。注意,AccountCreated表是一个时间戳数据类型,其默认值为current_timestamp。我们将在创建的其他表中模拟这种方法。

我们需要创建以下列出的其余表格:

  • Posts:此表将容纳系统中的所有岗位
    • PostID:每个职位的内部唯一标识符
    • Type:岗位类型(DefenseCritiqueNeutral
    • Topic:本帖涉及的讨论主题 ID
    • Player:制作帖子的玩家 ID
    • Post:发布消息的实际文本
    • DateTime:发帖的日期和时间
  • Activity:此表将包含玩家可以获得分数的所有可能的东西及其积分值
    • ActivityID:活动的内部唯一标识符
    • Activity:活动的描述
    • Value:特定活动的分值
    • Badge:与活动相关联的徽章(如果存在)。
  • Topics:此表包含有关讨论主题的所有信息
    • TopicID:主题的内部唯一标识符
    • Topic:讨论主题的实际文本
    • Creator:创建主题的玩家的 ID
    • NumberOfPosts:关于该主题的中立帖子总数
    • DateAdded:此主题添加到系统的日期和时间

现在我们已经有了支持 VuPoint e-learning 应用程序的基本表结构,让我们开始向应用程序添加一些基本代码。我们编写的代码将在三个地方执行。我们可以用 JQuery/JavaScript 编写在客户端(浏览器)上运行的代码。我们可以用 PHP 编写在服务器上运行的代码。我们可以用 MySQL 存储过程编写在数据库中运行的代码。理论上,我们可以将所有代码编写为在一个地方运行,但这不仅在大多数情况下是不切实际的,而且会使我们的一些任务变得更加困难。所以问题是,“哪里是编写代码的最佳位置?”下面是我们将遵循的顺序:

  1. 我们将编写任务中添加、修改或删除数据库中数据的部分。
  2. 我们将编写生成要在服务器上运行的 HTML 的任务部分。
  3. 我们将编写与 JQuery 播放器交互的任务部分。

那么,使用数据库的一些操作可能是什么呢?有几个,但这里有几个开始:

|

行动

|

存储过程

|

投入

|

输出

| | --- | --- | --- | --- | | 检查用户是否经过身份验证 | SelectAPlayer | UserName``EmailAddress``Password | 只有一个球员的记录 | | 添加新玩家 | InsertAPlayer | UserName``EmailAddress``Password | 不适用 | | 获得球员的分数 | SelectAPlayersPoints | UserName | 总分数 | | 记录帖子 | InsertAPost | UserName``Type``Topic``PlayerID``Post | 不适用 | | 获取某个主题的所有帖子 | SelectPostsByTopic | Topic | 与该主题相关的所有 post 记录 | | 获取所有主题 | SelectAllTopics | 不适用 | 所有主题 | | 获取排行榜数据 | SelectLeaders | HowMany | 排名靠前的球员(比如前 10 名到前 25 名)的记录按累计点数排序,受HowMany限制 | | 获取在线玩家 | SelectOnlinePlayers | 不适用 | 具有LoggedIn列值true的所有玩家的记录 | | 创建新的讨论主题 | InsertATopic | Topic``Player | 不适用 | | 获取热门话题 | SelectHotTopics | HowMany | 按累计帖子数量排序的热门话题记录(如前 10 至 25 个);受HowMany限制 | | 获得球员徽章 | SelectPlayerBadges | Player | 玩家获得的徽章列表以逗号分隔 |

下面是创建这些存储过程的代码:

DELIMITER //
-- Procedure Name: InsertAPlayer
-- Procedure Purpose: Inserts a New Player into the system
CREATE PROCEDURE 'vupoint'.'InsertAPlayer'(IN _UserName varchar(20),

  _EmailAddress varchar(40),
  _Password varchar(20))
BEGIN
Insert into Player (UserName,Password,EmailAdddress) values(_UserName,_Password,_EmailAdddress);
END//

DELIMITER ;

DELIMITER //
-- Procedure Name: InsertAPost
-- Procedure Purpose: Inserts a posts into the VuPoint database
CREATE PROCEDURE 'vupoint'.'InsertAPost'(IN _UserName varchar(20),   _Type varchar(10),_Topic int,_Player int,_Post varchar(4000))
BEGIN
Insert into Posts (UserName,Type,Topic,Player,Post) values(_UserName,_Type,_Topic,_Player,_Post);
END//

DELIMITER ;

DELIMITER //
-- Procedure Name: InsertATopic
-- Procedure Purpose: Inserts a new topic into the system 
CREATE PROCEDURE 'vupoint'.'InsertATopic'(IN _Topic varchar(10), _Player int)
BEGIN
Insert into Topics (Topic,PlayerCreated) values (_Topic,_Player);
END//

DELIMITER ;

DELIMITER //
-- Procedure Name: SelectAPlayer
-- Procedure Purpose: Returns the record for a player
CREATE PROCEDURE 'vupoint'.'SelectAPlayer' (In _UserName varchar(20), 
  _EmailAddress varchar(40),
  _Password varchar(20) )
BEGIN
Select * from Player 
where (UserName=_UserName|| EmailAddress=_EmailAddress)
and Password=_Password;
END // 

DELIMITER ;

DELIMITER //
-- Procedure Name: SelectAllTopics
-- Procedure Purpose: Returns all the topics in the system
CREATE PROCEDURE 'vupoint'.'SelectAllTopics'()
BEGIN
Select * from Topics;
END//
DELIMITER ;

DELIMITER //
-- Procedure Name: SelectPlayerBadges
-- Procedure Purpose: Returns a list of the players badges
CREATE PROCEDURE 'vupoint'.'SelectPlayerBadges'(IN _UserName varchar(20),
  OUT _badges varchar(100))
BEGIN
Select BadgesEarned into _badges from Player 
where UserName=_UserName;
END//
DELIMITER ;

DELIMITER //
-- Procedure Name: SelectHotTopics
-- Procedure Purpose: Returns topics ordered by the number of posts and limited by how -- many
CREATE PROCEDURE 'vupoint'.'SelectHotTopics'(IN _HowMany int)
BEGIN
Select  * from Topics order by NumberOfPosts desc LIMIT 0,_HowMany ;
END//
DELIMITER ;

DELIMITER //
-- Procedure Name: SelectOnlinePlayers
-- Procedure Purpose: Returns a lists of players how currently logged in is true
CREATE PROCEDURE 'vupoint'.'SelectOnlinePlayers'()
BEGIN
Select  * from Player where CurrentlyLoggedIn=true ;
END//
DELIMITER ;

DELIMITER //
-- Procedure Name: SelectPostsByTopic
-- Procedure Purpose: Returns all the posts associated with a Topic
CREATE PROCEDURE 'vupoint'.'SelectPostsByTopic'(IN _Topic int)
BEGIN
Select * from posts where Topic =_Topic ;
END//
DELIMITER ;

总结

我们已经确定了系统中的参与者。我们知道每个人的动机是什么,我们如何给他们所需要的反馈。现在我们有了一个数据库设计,这是我们游戏化系统的基础。现在,我们只需要向骨架系统添加细节。