阅读了《JavaScript Pattern》这本书,里面讲了很多js的本质概念以及项目的设计理念。很值得一看,这是我做的摘要,有兴趣的看官可以点这里。里面讲解mediator pattern的时候用了一个小游戏来讲解。但没有使用到ES6相关特性,我认为此编程模式十分重要,且比较有意思,所以对其根据MVC进行了改写和加工。没有做CSS的处理,只关注逻辑。

玩法:

玩家点击指定按键则增加其分数。

需求:

1 用户可以自定义昵称和按键。

2 可以添加多用户,所有用户的昵称和按键都是唯一的。

3 游戏在3秒内完成,并弹出窗口,显示赢家及其分数。

首先定义Player,也就是MVC中的model,具有三个属性:name,key,score,所有玩家列表静态属性players

function Player(name,key) {
this.name = name;
this.key = key;
this.score = 0;
};
Player.players = [];

接下来是view,scoreBoard包含两个方法,一个init初始化,一个update更新列表

const scoreBoard = {
init(players){
let elem = document.getElementById('result');
let msg = '';
for (const player of players) {
msg += `<tr><td><strong>${player.name}</strong></td>
<td>${player.key}</td>
<td id=${player.key}>${player.score}</td></tr>`;
}
elem.innerHTML = msg;
},
update(player){
let elem = document.getElementById(player.key);;
elem.innerHTML = player.score;
}
}

最后是control部分,game包含4个方法:1 初始化init 2 添加按钮的回调onAdd 3 开始按钮回调onStart 4 按键监听

const game = {
init(){
let nameInput,keyInput,addBtn, startBtn; addBtn = document.getElementById('addBtn');
startBtn = document.getElementById('startBtn'); addBtn.addEventListener('click',this.onAdd);
startBtn.addEventListener('click',this.onStart);
},
// 添加按钮事件
onAdd(){
nameInput = document.getElementById('name').value;
keyInput = parseInt(document.getElementById('key').value);
if (nameInput && keyInput) {
//检验是否有重名或按键冲突
for ({name,key} of Player.players) {
if (name === nameInput) {
alert('cannot input same name');
return;
}
if (key === keyInput) {
alert('cannot input same key');
return;
}
}
const player = new Player(nameInput, keyInput);
Player.players.push(player);
scoreBoard.init(Player.players);
document.getElementById('name').value = '';
document.getElementById('key').value = '';
}
},
// 开始按钮事件
onStart(){
document.getElementsByTagName('div')[0].style.display = 'none';
setTimeout(()=>{
window.onkeypress = null;
const max = Player.players.sort((player1,player2)=>player2.score - player1.score)[0];
alert(`game over, winner is ${max.name},score is ${max.score}`);
},3000);
window.onkeypress = game.onKeyPress;
},
// 按键监听
onKeyPress(e){
for (const player of Player.players){
if (e.which === player.key) {
player.score += 1;
scoreBoard.update(player);
}
}
}
}

最后初始化游戏:

game.init();

以下是HTML代码:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>按键小游戏</title>
</head>
<body>
<div>
<table border="1">
<thead>
<tr>
<th>Name</th>
<th>Key</th>
</tr>
</thead>
<tbody>
<td><input id="name" placeholder="name"></td>
<td><input id="key" placeholder="key"></td>
</tbody>
</table>
<button id="addBtn">add player</button>
<button id="startBtn">start</button>
</div>
<div>
<table border="1">
<thead>
<tr>
<th>name</th>
<th>key</th>
<th>value</th>
</tr>
</thead>
<tbody id="result">
</tbody>
</table>
</div>
<script src="自行填写" type="text/javascript"></script>
</body>
</html>

游戏虽小,可以让你联系MVC模式编写代码,也熟悉一下ES5的新模式。希望对你有所帮助。如有问题请留言

JavaScript 运用ES2015特性的小项目的更多相关文章

  1. web实践小项目<一>:简单日程管理系统(涉及html/css,javascript,python,sql,日期处理)

    暑假自学了些html/css,javascript和python,苦于学完无处练手几乎过目即忘...最后在同学的建议下做了个简单日程管理系统.借第一版完成之际,希望能将实践期间犯过的错误和获得的新知进 ...

  2. IOS-小项目(饿了么 网络部分 简单实现)

    在介绍小项目之前,在此说明一下此代码并非本人所写,我只是随笔的整理者. 在介绍之前先展现一下效果图. 看过效果图大家应该很熟悉了,就是饿了么的一个界面而已,值得注意的是,实现时并没有采用本地连接,而是 ...

  3. 前端学习 第三弹: JavaScript语言的特性与发展

    前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...

  4. 【PHP小项目使用MVC架构】

    小项目名称是雇员管理系统. mvc是一种项目的开发模式,中文名称为模式视图控制器,是强制程序员将数据的输入.处理.输出分开的一种开发模式. 在这个小项目中,控制器使用service作为后缀名. 项目u ...

  5. Web前端开发:SQL Jsp小项目(一)

    Jsp的学习算是告一段落,针对这段时间的学习,写了一个Jsp小项目来巩固学到的知识. 框架示意图 User list process UserAdd process 需要的界面效果: 需要工具:Ecl ...

  6. 《Javascript网页经典特性300例》

    <Javascript网页经典特性300例> 基础篇 第1章:网页特性 刷新.后退.前进.关闭.标题.跳转禁止网页放入框架动态加载js避免浏览器使用缓存加载页面 第2章:DOM操作 根据n ...

  7. 小项目:聊天室 (jQuery,PHP,MySQL)

    这几天写了一个小项目,初衷是自己写一个有前端,有后端的东西练练手,所以,实际意义并不大,只是拿来试试手而已. 我对这个聊天室的构想是这样的:先建两个数据库,一个保存用户名和密码,另一个保存用户名和发送 ...

  8. JavaScript的动态特性(通过eval,call,apply和bind来体现)

    JavaScript的动态特性(通过eval,call,apply和bind来体现) JavaScript是一种基于面向对象的.函数式的.动态的编程语言.现在发展到已经可以用在浏览器和服务器端了. 这 ...

  9. 最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/

    最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/,帮忙找找bug,网站里有源码地址 网站说明 甲壳虫社区(Beetle Community) 一个开源 ...

随机推荐

  1. 基于agenda的Nodejs定时任务管理框架搭建

    0.背景 在大型项目中,定时任务的应用场景越来越广.一般来说,按照微服务的思想,我们会将定时任务单独部署一套服务,核心的业务接口独立到另一个服务中,从而降低相互之间的耦合程度.在需要使用定时任务时,只 ...

  2. Spring-Security自定义登录页&inMemoryAuthentication验证

    Spring Security是为基于Spring的应用程序提供声明式安全保护的安全性框架.框架下内容比较多,可以做到按照角色权限对请求路径进行限制.今天主要验证自定义登录页,在内存用户存储中进行请求 ...

  3. Nginx拦截算法

    Nginx流量拦截算法 nginx 夏日小草 2015年10月22日发布 |   1 收藏  |  40 4.2k 次浏览 0x00.About 电商平台营销时候,经常会碰到的大流量问题,除了做流量分 ...

  4. 彻底解决Yii2中网页刷新时验证码不刷新的问题

    修改vendor/yiisoft/yii2/captcha/CaptchaValidator.php这个文件就可以了,修改的地方见下图: 总结 归根到底,是因为yii2在渲染网页的时候,会先输出js验 ...

  5. hiho第151周 Building in Sandbox floodfill

    题意:题目背景是<<我的世界>>,堆方块造房子,堆的规则是:新堆的方块必须和已有方块有重合面,而且不能往封闭空间里堆. 在三维空间中,给定一个堆的序列,判断符不符合规则. 数据 ...

  6. hdu1496 打表

    通常可以想到直接四个for枚举,但是会超时.就算只用三个for也很危险.可以用打表的方法将时间复杂度降到O(n^2),注意到x1,x2,x3,x4的取值区间是关于零对称的,因此可以只考虑正整数部分,洗 ...

  7. python file文件操作--内置对象open

    说明: 1. 函数功能打开一个文件,返回一个文件读写对象,然后可以对文件进行相应读写操作. 2. file参数表示的需要打开文件的相对路径(当前工作目录)或者一个绝对路径,当传入路径不存在此文件会报错 ...

  8. Ambari安装小记

    在Ambari配置过程中,组件的定制与分配很重要

  9. Android安全开发之WebView中的大坑

    0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等.WebView功能强大 ...

  10. R分词

    #用于下载安装rJava 和 Rwordseg,如果安装了就注释掉 install.packages("rJava") install.packages("Rwordse ...