mindpin/eshare

javascript编程游戏

Opened this issue · 3 comments

游戏目的

通过游戏的形式锻炼玩家的javascript编程逻辑思维

游戏场景

游戏场景是一个以垂直俯视角呈现的一个二维区域,类似一个棋盘
如图是一个 6*8 的游戏场景
image

游戏规则

游戏采用回合制,小人行动一次,然后场景互动运行一次(怪物攻击小人,机关被打开等等)
小人的每次行动都会按照玩家用 javascript 语言编写的AI进行

失败条件

宝石被摧毁
钥匙不够开机关了
勇士HP为0
回合数过多

胜利条件

全部收集宝石,机关全部打开的情况下,进入大门

包括的元素

1 受玩家控制的小人(有且只有一个)
2 近战攻击的小怪(0到多个)
3 近战攻击的大怪(0到多个)
4 JJ怪(类似MC中的JJ怪)(0到多个)
5 机关(只有所有机关都被玩家打开时,才可以通过最后的带门,机关需要钥匙开启)(0到多个)
6 钥匙(用来开启机关或大门的道具)(0到多个)
7 大门(一个)

小人的动作(小人的API)(每个回合小人只能做一个动作)

1 向上/向下/向左/向右 移动一格

warrior.left!
warrior.right!
warrior.up!
warrior.down!

2 向上/向下/向左/向右 近战攻击(会砍掉怪物一些HP)

warrior.attack!(:left)
warrior.attack!(:right)
warrior.attack!(:up)
warrior.attack!(:down)

3 向上/向下/向左/向右 远程投掷(投掷出去的道具碰到其他物品会落在地上,可以再次捡起继续使用)

warrior.throw!(:left)
warrior.throw!(:right)
warrior.throw!(:up)
warrior.throw!(:down)

4 和 上/下/左/右 的道具进行交互(根据道具不同做出相应的交互:捡起道具,开机关,开大门等动作)

warrior.interact!(:left)
warrior.interact!(:right)
warrior.interact!(:up)
warrior.interact!(:down)

5 原地休息(回复小人一定量HP)

warrior.rest!

小人的其他API

查看上/下/左/右 格子的情况

# 查看某个方向上的三个格子的情况,返回 space 数组
warrior.look(:left)
warrior.look(:right)
warrior.look(:up)
warrior.look(:down)

# 感觉自己周围8格的情况,返回 space 数组
warrior.feel

space.blank?
space.door?
space.intrigue?
space.key?
space.creeper?

space.small_monster?
space.big_monster?

建模

game 类

负责整个流程运转的类

level 类

包含关卡信息的类

space 类

表示一个格子的类

unit 类

门,机关,钥匙,怪物,小人的父类

door intrigue key monster Warrior 类

分别表示 门,机关,钥匙,怪物,小人

small_monster big_monster creeper 类

都是monster的子类,分别表示 小怪物,大怪物,JJ怪

建议

unit 上有个基本属性是否会被JJ怪摧毁
unit 上有个基本属性是否阻挡远程攻击(弓箭手的射击,勇者的投掷,魔法师的魔法)

落在地上的飞行道具和用户身上的飞行道具用不同的模型

勇者

勇者不能和所有怪物重合

小怪 SmallMonster

1 如果它的(上下左右)有勇士,轮到它行动的时候,它就会攻击勇士
2 勇士不能和它重合
3 勇士如果朝他走,勇士走的动作算执行,但是勇士不能和它重合

大怪 BigMonster

1 大怪和小怪行为类似,区别在于血量和攻击力

JJ怪 Creeper

1 如果它的(上下左右)有勇士,轮到它行动的时候
如果它是正常状态,就会进入激发状态(准备爆炸)
2 如果轮到它行动的时候,它是激发状态,它就会爆炸,爆炸范围是依他为中心的九格
(九格内的除门和机关之外的任何东西)

弓箭手 Archer

1 当勇者的距离在它三格内(上下左右)(身边第一格第二格第三格),它就会攻击勇者
image

2 它和勇者之间如果隔着单位就不能攻击

魔法师 Wizard

1 攻击范围见图
image

2 它和勇者之间如果隔着单位就不能攻击

钥匙 Key

1 勇者站在和它重合的位置后,可以被捡起
2 勇者可以捡到多把钥匙

机关

1 勇者站在和它重合的位置后,如果勇者有钥匙,可以被打开,并消耗一把钥匙

1 勇者站在和它重合的位置后,如果场景中所有的机关是打开状态,并且没有宝石都在勇者身上,那么就算过关

宝石

和钥匙一样

1 勇者不能通过
2 任何东西不能和它重合
3 可以被JJ怪摧毁

飞行道具

1 勇者的投掷范围和弓箭手一样
2 投掷会碰撞在飞行轨迹的第一个单位上
3 投掷如果打在(大怪,小怪,弓箭手,魔法师)上,会落在和它们相同的位置,它们会掉血
4 如果打在 JJ 怪,JJ怪立刻爆炸,飞行道具被摧毁
5 如果打在宝石,钥匙上,没有任何效果,飞行道具落在和它们相同的位置
6 如果打在机关,门,墙和地图边缘,会落在边上一格
image
红色是勇士,黑色是飞行道具,蓝色是墙,门,边缘
7 当飞行道具落下地上的时候,勇士站在和它重合的位置时,可以被捡起

character.play() 运行后,可以通过 character.action_info()
获取行动内容,返回值是 hash

hash 的初步设想的内容如下,大家讨论一下

是否缺少没有列出的行为,或者列出的行为不能满足需求

1 行走

{
  type : 'walk'
  direction : 'left'
}

2 近战攻击

{
  type : 'melee_attack'
  direction : 'left'
  target : character
  damage : 伤害数值  
}

3 弓箭手攻击

{
  type : 'ranged_attack'
  direction : 'left'
  target : character
  damage : 伤害数值  
}

4 魔法师攻击

{
  type : 'magic_Attack'
  target : character
  damage : 伤害数值  
}

5 JJ怪爆炸

{
  type : 'explode'
  targets : [
    {
      target : character
      damage : 伤害数值  
    },
    ................
  ]
}

6 JJ怪进入激活状态

{
  type : 'excited'
}

7 勇士投掷攻击

{
  type : 'shuriken_attack'
  shuriken_landing_point : space
  target : character
  damage : 伤害数值  
  ]
}

8 交互

{
  type : 'interact'
  interact_items : [item......]
}