javascript编程游戏
Opened this issue · 3 comments
游戏目的
通过游戏的形式锻炼玩家的javascript编程逻辑思维
游戏场景
游戏场景是一个以垂直俯视角呈现的一个二维区域,类似一个棋盘
如图是一个 6*8 的游戏场景
游戏规则
游戏采用回合制,小人行动一次,然后场景互动运行一次(怪物攻击小人,机关被打开等等)
小人的每次行动都会按照玩家用 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 当勇者的距离在它三格内(上下左右)(身边第一格第二格第三格),它就会攻击勇者
2 它和勇者之间如果隔着单位就不能攻击
魔法师 Wizard
2 它和勇者之间如果隔着单位就不能攻击
钥匙 Key
1 勇者站在和它重合的位置后,可以被捡起
2 勇者可以捡到多把钥匙
机关
1 勇者站在和它重合的位置后,如果勇者有钥匙,可以被打开,并消耗一把钥匙
门
1 勇者站在和它重合的位置后,如果场景中所有的机关是打开状态,并且没有宝石都在勇者身上,那么就算过关
宝石
和钥匙一样
墙
1 勇者不能通过
2 任何东西不能和它重合
3 可以被JJ怪摧毁
飞行道具
1 勇者的投掷范围和弓箭手一样
2 投掷会碰撞在飞行轨迹的第一个单位上
3 投掷如果打在(大怪,小怪,弓箭手,魔法师)上,会落在和它们相同的位置,它们会掉血
4 如果打在 JJ 怪,JJ怪立刻爆炸,飞行道具被摧毁
5 如果打在宝石,钥匙上,没有任何效果,飞行道具落在和它们相同的位置
6 如果打在机关,门,墙和地图边缘,会落在边上一格
红色是勇士,黑色是飞行道具,蓝色是墙,门,边缘
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......]
}