前言:
  勿忘初心, 本系列的目标是实现一款类似QQ"火拼系列"人机对战版俄罗斯方块. 在完成了基本游戏框架和AI的算法探索后, 让我们来尝试一下人机大战雏形编写.
  本系列的文章链接如下:
  1). 需求分析和目标创新 
  2). 游戏的基本框架和实现
  3). 游戏的AI算法 
  这些博文和代码基本是同步的, 并不确定需求是否会改变, 进度是否搁置, 但期翼自己能坚持和实现.

演示&下载:

  在线版本, 点击试玩(求点击, 求轻拍, ^_^).
  该版本界面依旧简陋, 效果如图所示:
   
  注: 左边为玩家, 右边为机器人, 使用键盘方向键(上下左右)控制.

  代码下载地址: http://pan.baidu.com/s/1gd2Hl6b
  下载解压目录结构如下所示:
  
  点击tetris.html, 在浏览器上运行(由于HTML5程序, 最好在Chrome/Firefox上运行).

游戏策划:
  游戏采用人机对战的方式, 是为了让玩家有个参照物. 这样在游戏过程中, 始终处于之中激烈的竞技状态中, 同时又有明确的目标(打败对方).
  当前整个游戏还不是很完全, 只是简单做了改造.
  1). 引入准备界面
  
  犹如短跑的发枪令一样, 让玩家有短暂时间去准备.
  2). 限定游戏时间
  
  由于AI机器人的强大(跑一天也不会挂), 因此无时间限定的挑战, 用户玩家必然会崩溃. 由此引入一个合适的时间限定. 在这个时间窗口中, 谁得分高, 谁就是最后的赢家.
  引入了这两个之后, 感觉游戏的可玩性强了很多, ^_^.

源码解读:
  代码文件结构如图所示:
  
  • game_engine.js: 定义了游戏引擎了一些基本类.
  • tetris_player.js: 封装了玩家和机器人的agent类.
  • tetris_game.js: 实现了具体的scene和layer类, 并用状态模式串联.
  游戏编程中, 状态模式(state pattern)以及状态机(state machine)尤被推崇. 程序中并没有完全按照该模式来实现, 不过多少有些影子.
  场景(Scene)和画板层(Layer)的类结构如下所示:
  
  BaseScene的类定义如下:

    function BaseScene() {
this.currentLayer = null;
} BaseScene.prototype.switchLayer = function(baseLayer) {
// *) 上一个画板层执行 exitLayer的操作
if ( this.currentLayer != null ) {
this.currentLayer.exitLayer();
}
this.currentLayer = baseLayer;
// *) 下一个画板层执行 entryLayer的操作
if ( this.currentLayer != null ) {
this.currentLayer.entryLayer();
}
} BaseScene.prototype.update = function(interval) {
if ( this.currentLayer != null ) {
this.currentLayer.update(interval);
}
} BaseScene.prototype.render = function(ctx) {
if ( this.currentLayer != null ) {
this.currentLayer.render(ctx);
}
}

  BaseLayer的类定义如下:

    function BaseLayer() {
} BaseLayer.prototype.entryLayer = function() {
} BaseLayer.prototype.exitLayer = function() {
} BaseLayer.prototype.update = function(interval) {
} BaseLayer.prototype.render = function(ctx) {
}

  角色之间的交互, 往往采用消息通知的机制来实现. 不过该程序并没有实现. 对于玩家和机器人, 其通过BasePlayer来进行了抽象. 其类结构如下所示:
  
  对于其他部分的代码, 这边不再具体展开, 请详细见该系列的前面几篇文章.

总结:
  人机对战的实现进展还是比较顺利的, 一方面游戏本身比较简单, 另一方面之前做了很多铺垫的工作. 但越写到后面, 越发觉得一个好的游戏引擎对一个游戏编写的重要性. 犹如IDE对于代码编写的重要性. 后续想借助cocos2d-js来实现, 站在巨人的肩膀上, 看得更远.
  希望自己能坚持, 完成最初的目标和设想. 也期待你的关注.

写在最后:
  
如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.

  

H5版俄罗斯方块(4)---火拼对战的雏形的更多相关文章

  1. H5版俄罗斯方块(5)---需求演进和产品迭代

    前言: 产品的形态是不断迭代的, 从粗糙到精致, 从简易到立体. 有了最初的技术积累和时间思考后, 终于明确了该游戏的方向. 我想说的是: 技术不是重点, 产品/用户体验才是核心议题. 结合朋友的游戏 ...

  2. H5版俄罗斯方块(2)---游戏的基本框架和实现

    前言: 上文中谈到了H5版俄罗斯方块的需求和目标, 这次要实现一个可玩的版本. 但饭要一口一口吃, 很多东西并非一蹴而就. 本文将简单实现一个可玩的俄罗斯方块版本. 下一步会引入AI, 最终采用coc ...

  3. H5版俄罗斯方块(1)---需求分析和目标创新

    前言: 俄罗斯方块和五子棋一样, 规则简单, 上手容易. 几乎每个开发者, 都会在其青春年华时, 签下"xx到此一游". 犹记得大一老师在布置大程作业的时候提过: "什么 ...

  4. H5版俄罗斯方块(3)---游戏的AI算法

    前言: 算是"long long ago"的事了, 某著名互联网公司在我校举行了一次"lengend code"的比赛, 其中有一题就是"智能俄罗斯方 ...

  5. Android版俄罗斯方块的实现

    学习Android的基本开发也有一段时间了,可是由于没有常常使用Android渐渐的也就忘记了. Android编程学的不深,不过为了对付逆向,可是有时还是会感到力不从心的.毕竟不是一个计算机专业毕业 ...

  6. 从乐视和小米“最火电视”之战 看PR传播策略

        今年的双11够热闹.一方面,阿里.京东.国美.苏宁等电商巨头卯足了劲儿.试图在双11期间斗个你死我活,剑拔弩张的气势超过了以往不论什么一场双11:还有一方面.不少硬件厂商.家电企业也来凑双11 ...

  7. JS国际化网站中英文切换(理论支持所有语言)应用于h5版APP

    网页框架类APP实现国际化参考文案一 参考:https://blog.csdn.net/CSDN_LQR/article/details/78026254 另外付有自己实现的方法 本人用于H5版的AP ...

  8. # 火题小战 A.玩个球

    火题小战 A.玩个球 题目描述 给你 \(n\) 种颜色的球,每个球有 \(k\) 个,把这 \(n\times k\) 个球排成一排,把每一种颜色的最左边出现的球涂成白色(初始球不包含白色),求有多 ...

  9. 火题小战 B. barbeque

    火题小战 B. barbeque 题目描述 \(Robbery\) 是一个大吃货(雾) 某个神奇的串由牛肉和青椒构成,于是\(Robbery\)购买了\(n\)个餐包来自己做这个串,每个餐包中有一些牛 ...

随机推荐

  1. Sprint(第一天11.14)

    Sprint1第一阶段 1.类名:软件工程-第一阶段 2.时间:11.14-11.23 3.选题内容:点餐系统 4.团队博客地址:http://www.cnblogs.com/iamCarson/ 团 ...

  2. HTML布局与框架

    HTML块 HTML块元素 块元素在显示时,通常会以新行开始 如:<h1>.<p>.<ul> <!DOCTYPE html> <html> ...

  3. px和em的区别(转)

    在国内网站中,包括三大门户,以及“引领”中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位.只有百度好歹做了个可调的表率.而 在大洋彼岸,几乎所有的主流站点都使用em作为字体单位, ...

  4. 解决Cannot find MySQL header files under /usr/include/mysql的错误

    按照下面的步骤能成功,亲测.转帖,做笔记 编译php-5.5-6的mysql支持,出现Cannot find MySQL header files under /usr/include/mysql. ...

  5. python去除空格和换行符的方法

    一.去除空格 strip() " xyz ".strip() # returns "xyz" " xyz ".lstrip() # retu ...

  6. magic_quotes_gpc

    ini里面有这个magic_quotes_gpc设置,是为了防止忘记处理而和mysql有冲突,引起mysql的风险,于是,认为的加上\slash,但是我们在Php中获得值的时候,需要判断如果这个值为1 ...

  7. openssl evp 哈希算法(md5,sha1,sha256)

    1. 简述 openssl提供了丰富密码学工具,一些常用的哈希算法 比如md5,sha 可以直接用提供的md5.h ,sha.h 接口使用: 为了方便开发者使用,openssl 又提供了一个EVP, ...

  8. android 破解工具

    来记录一下本人在平时工作中使用的android上的破解工具 静态破解: apktool: apk包 -> dex dex2jar和enjarify(google官方出品): dex->ja ...

  9. cxf的soap风格+spirng4+maven 服务端

    简介 SOAP 比较复杂,基于XML,有对应规范:REST利用HTTP请请求方式GET,POST,PUT,delete约定具体操作.简单的说,SOAP通过传输XML,XML定义了请求和响应的具体数据, ...

  10. Linux 远程登录

    Linux一般作为服务器使用,而服务器一般放在机房,你不可能在机房操作你的Linux服务器. 这事我们就需要远程登录到Linux服务器来管理维护系统. Linux系统中是通过ssh服务实现的远程登录功 ...