org-mode游戏化的简单实现

12 Org Gamification

游戏化是一个很火的概念,Org-mode是一个实现GTD的极好工具,将两者结合起来想必非常有趣.

下面就是一个简单的对Org-mode游戏化的尝试,主要就是通过完成任务赚取积分,用然后用积分购买奖励物品.

1 积分操作

完成任务可以获取到积分,默认情况下[#A]级任务增加30积分,[#B]级任务增加20积分,[#C]级任务增加10积分.

但可以通过为每个entry设置REWARD属性的方式自定义完成该entry所获得的奖励积分数,需要为整数.

(defun org-gamification-point-to-score()
  "定位到积分行"
  (interactive)
  (goto-char (point-min))
  (when (not (search-forward-regexp "^#\\+SCORES: " nil t))
    (goto-char (point-max))
    (if (search-backward-regexp "^#\\+" nil t)
        (progn
          (end-of-line)
          (newline))
      (progn
      (goto-char (point-min))
      (newline)
      (previous-line)))
    (beginning-of-line)
    (insert "#+SCORES: "))
)

(defun org-gamification-get-score()
  "获取当前累计的积分数量"
  (save-excursion
    (org-gamification-point-to-score)
    (string-to-int (buffer-substring-no-properties (point) (line-end-position))))
)

(defun org-gamification-update-score(&optional newScore)  "更新当前积分"
  (save-excursion
    (org-gamification-point-to-score)
    (insert (number-to-string newScore))
    (insert " points")
    (backward-word)
    (kill-line)))

(defun org-gamification-add-score (score)
  "增加指定积分"
  (save-excursion
    (let (newScore)
      (setq newScore (+ score (org-gamification-get-score)))
      (org-gamification-update-score newScore))))

(defun org-gamification-remove-score-able-p (score)
  "判断是否能够扣减指定分数"
  (> (org-gamification-get-score) score))

(defun org-gamification-remove-score (score)
  "减少指定积分"
  (save-excursion
    (if (org-gamification-remove-score-able-p score)
        (org-gamification-update-score (- (org-gamification-get-score) score))
      (message "积分不足"))))

(defun org-gamification-get-entry-reward-score ()
  "获取完成entry该获得的积分"
  (save-excursion
    ;;(org-back-to-heading t)
    (if (org-entry-get nil "REWARD" t)
        (string-to-int (org-entry-get nil "REWARD" t))
      (+ 10 (/ (org-get-priority (thing-at-point ‘line)) 100)))))

2 奖励操作

可以使用积分购买奖励物品,带有`REWARD`标签的headline被认为是奖励物品

将奖励物品的标记为完成状态表示购买该奖励物品,会减少积分

使用命令`org-gamification-point-to-reward`跳转到奖励物品部分的headline处

使用命令`org-gamification-add-reward`来增加待购买的奖励物品

(defun org-gamification-point-to-reward ()
  "跳转到REWARD headline"
  (interactive)
  (let (reward-headline-pos)
    (setq reward-headline-pos (org-find-exact-headline-in-buffer "REWARDS" nil t))
    (when (null reward-headline-pos)
      (goto-char (point-max))
      (newline)
      (beginning-of-line)
      (insert "* REWARDS")
      (beginning-of-line)
      (setq reward-headline-pos (point))
      )
    (goto-char reward-headline-pos))
  )

(defun org-gamification-add-reward ()
  "增加奖励物品,需要用积分购买"
  (interactive)
  (save-excursion
    (let (reward-name reward-price)
      (org-gamification-point-to-reward)
      (end-of-line)
      (setq reward-name (read-string "请输入奖品名称: "))
      (org-insert-subheading nil)
      (insert reward-name)
      (setq reward-price (read-string "请输入奖品价格(整数): "))
      (org-set-property "PRICE" (int-to-string (string-to-int reward-price)))
      (org-set-tags-to ":REWARD:")
      ))
  )

(defun org-gamification-buy-reward-able-p()
  "判断是否能够购买奖励物品"
  (if (org-entry-get nil "PRICE" t)
      (org-gamification-remove-score-able-p (string-to-int (org-entry-get nil "PRICE" t)))
    (progn
      (message "该奖励没有设置PRICE")
      nil)))

(defun org-gamification-buy-reward ()
  "购买奖励物品,会减少积分"
  (when (org-gamification-buy-reward-able-p)
    (org-gamification-remove-score (string-to-int (org-entry-get nil "PRICE" t)))))

(defun org-gamification-sell-reward ()
  "售卖奖励物品,会增加积分"
  (if (org-entry-get nil "PRICE" t)
      (org-gamification-add-score (string-to-int (org-entry-get nil "PRICE" t)))
    (message "该奖励没有设置PRICE"))
  )

3 游戏环境初始化

使用命令`org-gamification-init`来初始化游戏,积分会清空为0

使用命令`org-gamification-start`来开启游戏

使用命令`org-gamification-end`来关闭游戏

(defun org-gamification-reward-p ()
  "判断该entry是否属于奖励"
  (save-excursion
      (org-back-to-heading)
      (find "REWARD" (org-get-tags) :test ‘string=)))

(defun org-gamification-entry-trigger (task-plist)
  "完成事项,增加积分"
  (let (from-state to-state )
    (setq from-state (plist-get task-plist :from))
    (setq to-state (plist-get task-plist :to))
    (save-excursion
      (when (and (member to-state org-done-keywords) ( or (member from-state org-not-done-keywords) (null from-state)))
        (if (org-gamification-reward-p)
            (org-gamification-buy-reward)
          (org-gamification-add-score (org-gamification-get-entry-reward-score))))
      (when (and (or (member to-state org-not-done-keywords) (null to-state)) (member from-state org-done-keywords))
        (if (org-gamification-reward-p)
            (org-gamification-sell-reward)
          (org-gamification-remove-score (org-gamification-get-entry-reward-score))))
      ))
  )

(defun org-gamification-entry-blocker (task-plist)
  "若动作会将积分变成负数,则不能进行该动作"
  (let (from-state to-state )
    (setq from-state (plist-get task-plist :from))
    (setq to-state (plist-get task-plist :to))
    (save-excursion
      (cond ((and (member to-state org-done-keywords) ( or (member from-state org-not-done-keywords) (null from-state)))
             (if (org-gamification-reward-p)
                 (org-gamification-buy-reward-able-p)
               t))
            ((and (or (member to-state org-not-done-keywords) (null to-state)) (member from-state org-done-keywords))
             (if (not (org-gamification-reward-p))
                 (org-gamification-remove-score-able-p (org-gamification-get-entry-reward-score))
               t))
            (t t))
      ))
)
(defun org-gamification-init()
  "org游戏化初始化函数     初始化积分为0     初始化游戏的hook     "
  (org-gamification-update-score 0)
  (org-gamification-start)
  )

(defun org-gamification-start ()
  "初始化游戏的hook"
  (interactive)
  (add-to-list ‘org-trigger-hook ‘org-gamification-entry-trigger)
  (add-to-list ‘org-blocker-hook ‘org-gamification-entry-blocker)
  )

(defun org-gamification-end ()
  "结束游戏"
  (interactive)
  (setq org-trigger-hook (remove ‘org-gamification-entry-trigger org-trigger-hook))
  (setq org-blocker-hook (remove ‘org-gamification-entry-blocker org-blocker-hook))
  )

org-mode游戏化的简单实现

时间: 2024-11-23 03:13:16

org-mode游戏化的简单实现的相关文章

游戏化

到底何为游戏化? 现在,还有人对“游戏化”这个词存在误解,而它前面的前缀“游戏”对于这个词的理解可以说是于事无补.游戏化是指将某个已经存在的.具有一定核心和内在价值的事物与游戏机制相整合,以激发用户的参与度.投入感和忠诚度. 这里还可以举一些我们经常会用到的一些解释性词汇:“评估和激励”.“认可与奖励”.“忠诚度”.“信誉”.“引导并放大一些高价值的行为”.我并不认为有任何人会认为这是坏事,这一套对部分聪明的公司而言也已经行之有效很多年.不过,所有这些行为的一个核心主题,同样也是激发我跟我的同事

刘沐真:游戏化十大元素

把游戏中的智慧和法则,运用在现实世界,这就是游戏化.正确的游戏化运用,可以使孩子从玩家转变成学霸,让新兴的创始人,具备别人看不透的核心竞争力,让玩游戏的人,娱乐的同时,其他维度也变得更强... 目前市面上的游戏化书籍,基本都是学院派理论,实操性非常差,莫风老师向你保证,只要你掌握以下游戏化十大元素,你对游戏化的运用将超过任何一个“专家” 1.核心玩法 理解了核心玩法,你的游戏化之路就成功了一半. 一款游戏好不好玩,成败往往就是核心玩法.在游戏世界,仙剑的核心玩法就是45度角战斗,超级玛丽就是跳跃

游戏化 网络文学开启版权变现模式

起点中文网和腾讯文学在网络文学变现上殊途同归,都在利用网络文学的游戏形态,缔造一个传统文学所没有的互动参与的大融合,让读者和作者之间的界限越发模糊. 文/张书乐 刊载于<法人>杂志2014年9月刊 8月中旬开幕的上海书展上新增了"网络文学会客厅",上海网络作家协会.盛大文学.腾讯文学分别举行专场活动,血红.蝴蝶蓝.猫腻.洛水.忘语等众多网络"大神"亮相书展,众多读者纷纷前往一窥"大神"们的风采. 而在8月1日,同在上海举办的China

将软件说明书游戏化

原文作者:Jeff Atwood 早在2007年--那时候Stack Overflow还没有万众瞩目--我把软件开发称作为一种协作游戏. Stack Overflow或许就是当初那个想法的自然产物吧--把软件开发的在线讨论重塑成一种协作游戏:在游戏里,想要"获胜"的唯一方法就是相互学习. 那时候还没有"游戏化"(Gamification)这个词. 但到2011年.游戏化就已经不再是一个时髦的概念了.无论你是否自称为"游戏玩家",也无论你是否信奉&

《游戏化思维:改变未来商业的新力量》:理论太多,从理论到实践则连理论都没给出,更没有实例 二星推荐

如何游戏化说的挺多,几乎可以去指导游戏的制作了.如何应用到商业,没给出明确的思路,举了几个例子都是别人做出来的. 书中有几个重要的概念的翻译感觉不太合适,之一是points,一般翻译为积分,书中翻译为点数,有点别扭:之二badges翻译为徽章也感觉不如新浪微博的“勋章”更顺口.

24点游戏计算器 (简单四则运算)(c++)

24点游戏计算器 (简单四则运算)(c++):https://github.com/liuxinig/cpp_1001/blob/master/24dian_siZeIN.txt 1 //24点统计 2 3 #include <iostream> 4 #include <cmath> 5 using namespace std; 6 #define N 14 7 //a数组存四个数字 8 int cixu[3],fuHao[3],p[N],sum = 0; 9 float a0[4

众包测试中的游戏化

Mahesh Gudipati有超过10年的测试经验,参与过不少不同领域的项目.他在数据仓库/BI测试,需求预测测试,大数据测试和产品测试方面有丰富的经验.他在多个ETL/DW测试项目中实现了自动化技术,并因为开发出了ETL/DW测试的端对端解决方案获得了一项专利.他是一名获PMP认证的项目经理,还管理过多个数据仓库测试项目.他帮助建立公司内部的群体测试流程,最近还一直在开发数据项目中的技术的测试解决方案. Jaya Bhagavathi Bhallamudi在IT行业干了超过16年.她是一名C

读《陈鹤琴教学法》之游戏化教学有感

作者主要观点 :陈鹤琴认为,幼儿的各种知识和能力都可以通过游戏的方式让幼儿获得,因此,在促进课程实施游戏化方面,也就有了需要注意的问题:需要教育者准备适宜.丰富.具有支持性的游戏材料和游戏.这让我联想到我们日常开展的自主性游戏,它也是幼儿的一个自我学习.娱乐.交往的过程,但是自主性游戏的开展是有目的的.提前精心预设好的,根据班级幼儿的实际发展情况而制定和不断更换的.如在主题活动<好玩的小实验>中,第一周幼儿尝试用画好了线的彩色方块纸制作小风车,因为是初次尝试,难度有所降低,对角线等都已经预先画

【Demo】拼图小游戏 winform (一) 简单的拖动拼图

简单的Demo,可以用于学习Image的处理.winform里的拖动事件,也可以用于广大学生党的作业 (其实这就是帮学生党解决的作业,只不过后来又调整了下--),因为是Demo,所以代码也就随便了些,下面是运行时的截图,弄个妹子赏眼点,游戏方式就是将随机打乱的图片拖动到待拼图区域,如果位置一致时,在鼠标松开,图片就会被绘制到待拼图区域,同时在随机打乱的图片中移除这一块区域 首先是图片相关的部分:图片等比例缩放+分割,以下是相关代码 public static class Helpers { //