求一个用JS写的21点游戏代码

javascript游戏21点_百度知道
javascript游戏21点
帮忙优化一下
&title&Js版21点游戏&/title&
&/head&&body&
&!--以下代码在&Body&&/Body&之间--&
&SCRIPT LANGUAGE=&JavaScript&&
&!-- Hide from non-JavaScript browsers
function random(maxValue)
day = new Date();
2124 saolei jielong
我有更好的答案
代码好不严谨参考一下代码百度hi我下代码太长贴不上来
采纳率:33%
为您推荐:
其他类似问题
您可能关注的内容
javascript的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。  去年2048很火, 本来我也没玩过, 同事说如果用JS写2048 只要100多行代码;
  PS(iWeb峰会暨攻城师嘉年华2015嘉年华要来啦, 在文章结尾有具体的地址和时间);
  今天试了一下, 逻辑也不复杂, 主要是数据构造函数上的数据的各种操作, 然后通过重新渲染DOM实现界面的更新, 整体不复杂, JS,css,和HTML合起来就300多行;
  界面的生成使用了underscore.js的template方法, 使用了jQuery,主要是DOM的选择和操作以及动画效果,事件的绑定只做了PC端的兼容,只绑定了keydown事件;
  把代码放到github-page上, 通过点击这里查看 实例: ;
  效果图如下:
  所有的代码分为两大块,Data, V
  Data是构造函数, 会把数据构造出来, 数据会继承原型上的一些方法;
  View是根据Data的实例生成视图,并绑定事件等, 我直接把事件认为是controller了,和View放在了一起, 没必要分开;
  Data的结构如下:
* @desc 构造函数初始化
init : function
* @desc 生成了默认的数据地图
* @param void
generateData : function
* @desc 随机一个block填充到数据里面
* @return void
generationBlock : function
* @desc 获取随机数 2 或者是 4
* @return 2 || 4;
getRandom : function
* @desc 获取data里面数据内容为空的位置
* @return {x:number, y:number}
getPosition : function
* @desc 把数据里第y排, 第x列的设置, 默认为0, 也可以传值;
* @param x, y
set : function
* @desc 在二维数组的区间中水平方向是否全部为0
* @desc i明确了二维数组的位置, k为开始位置, j为结束为止
no_block_horizontal : function
no_block_vertica : function
* @desc 往数据往左边移动,这个很重要
moveLeft : function
moveRight : function
moveUp : function
moveDown : function
  有了数据模型,那么视图就简单了,主要是用底线库underscore的template方法配合数据生成html字符串,然后对界面进行重绘:
View的原型方法:
renderHTML : function //生成html字符串,然后放到界面中
init : function //构造函数初始化方法
bindEvents : function //给str绑定事件, 认为是控制器即可
  因为原始的2048有方块的移动效果, 我们独立起来了一个服务(工具方法,这个工具方法会被View继承), 主要是负责界面中的方块的移动, getPost是给底线库用的, 在模板生成的过程中需要根据节点的位置动态生成横竖坐标,然后定位:
var util = {
animateShowBlock : function() {
setTimeout(function() {
this.renderHTML();
}.bind(this),200);
animateMoveBlock : function(prop) {
$("#num"+prop.form.y+""+prop.form.x).animate({top:40*prop.to.y,left:40*prop.to.x},200);
//底线库的模板中引用了这个方法;
getPost : function(num) {
return num*40 + "px";
//这个应该算是服务;
  下面是全部的代码, 引用的JS使用了CDN,可以直接打开看看:
&!DOCTYPE html&
&head lang="en"&
&meta charset="UTF-8"&
&title&&/title&
&script src="http://cdn.bootcss.com/underscore.js/1.8.3/underscore-min.js"&&/script&
&script src="http://cdn.bootcss.com/jquery/2.1.4/jquery.js"&&/script&
.block,.num-block{
height: 40
line-height: 40
text-align:
border-radius: 4
border:1px solid #
box-sizing: border-
.num-block{
color:#27AE60;
font-weight:
&div class="container"&
&div class="row"&
&div id="g"&
&script id="tpl" type="text/template"&
&% for(var i=0; i&data. i++) {%&
&!--生成背景块元素---&
&% for(var j=0; j& data[i]. j++ ) { %&
&div id="&%=i%&&%=j%&" class="block" style="left:&%=util.getPost(j)%&;top:&%=util.getPost(i)%&"
data-x="&%=j%&" data-y="&%=i%&" data-info='{"x":&%=[j]%&,"y":&%=[i]%&}'&
&!--生成数字块元素---&
&% for(var j=0; j& data[i]. j++ ) { %&
&!--如果数据模型里面的值为0,那么不显示这个数据的div---&
&% if ( 0!==data[i][j] ) {%&
&div id="num&%=i%&&%=j%&" class="num-block" style="left:&%=util.getPost(j)%&;top:&%=util.getPost(i)%&" &
&%=data[i][j]%&
var Data = function() {
this.init();
$.extend(Data.prototype, {
* @desc 构造函数初始化
init : function() {
this.generateData();
* @desc 生成了默认的数据地图
* @param void
generateData : function() {
var data = [];
for(var i=0; i&4; i++) {
data[i] = data[i] || [];
for(var j=0; j&4; j++) {
data[i][j] = 0;
this.map =
* @desc 随机一个block填充到数据里面
* @return void
generationBlock : function() {
var data = this.getRandom();
var position = this.getPosition();
this.set( position.x, position.y, data)
* @desc 获取随机数 2 或者是 4
* @return 2 || 4;
getRandom : function() {
return Math.random()&0.5 ? 2 : 4;
* @desc 获取data里面数据内容为空的位置
* @return {x:number, y:number}
getPosition : function() {
var data = this.
var arr = [];
for(var i=0; i&data. i++ ) {
for(var j=0; j& data[i]. j++ ) {
if( data[i][j] === 0) {
arr.push({x:j, y:i});
return arr[ Math.floor( Math.random()*arr.length ) ];
* @desc 把数据里第y排, 第x列的设置, 默认为0, 也可以传值;
* @param x, y
set : function(x,y ,arg) {
this.map[y][x] = arg || 0;
* @desc 在二维数组的区间中水平方向是否全部为0
* @desc i明确了二维数组的位置, k为开始位置, j为结束为止
no_block_horizontal: function(i, k, j) {
for( ;k&j; k++) {
if(this.map[i][k] !== 0)
return false;
return true;
//和上面一个方法一样,检测的方向是竖排;
no_block_vertical : function(i, k, j) {
var data = this.
for(; k&j; k++) {
if(data[k][i] !== 0) {
return false;
return true;
* @desc 往左边移动
moveLeft : function() {
* 往左边移动;
* 从上到下, 从左到右, 循环;
* 从0开始继续循环到当前的元素 ,如果左侧的是0,而且之间的空格全部为0 , 那么往这边移,
* 如果左边的和当前的值一样, 而且之间的空格值全部为0, 就把当前的值和最左边的值相加,赋值给最左边的值;
var data = this.
var result = [];
for(var i=0; i&data. i++ ) {
for(var j=1; j&data[i]. j++) {
if (data[i][j] != 0) {
for (var k = 0; k & k++) {
//当前的是data[i][j], 如果最左边的是0, 而且之间的全部是0
if (data[i][k] === 0 && this.no_block_horizontal(i, k, j)) {
result.push( {form : {y:i,x:j}, to :{y:i,x:k}} );
data[i][k] = data[i][j];
data[i][j] = 0;
//加了continue是因为,当前的元素已经移动到了初始的位置,之间的循环我们根本不需要走了
}else if(data[i][j]!==0 && data[i][j] === data[i][k] && this.no_block_horizontal(i, k, j)){
result.push( {form : {y:i,x:j}, to :{y:i,x:k}} );
data[i][k] += data[i][j];
data[i][j] = 0;
moveRight : function() {
var result = [];
var data = this.
for(var i=0; i&data. i++ ) {
for(var j=data[i].length-2; j&=0; j--) {
if (data[i][j] != 0) {
for (var k = data[i].length-1; k&j; k--) {
//当前的是data[i][j], 如果最左边的是0, 而且之间的全部是0
if (data[i][k] === 0 && this.no_block_horizontal(i, k, j)) {
result.push( {form : {y:i,x:j}, to :{y:i,x:k}} );
data[i][k] = data[i][j];
data[i][j] = 0;
}else if(data[i][k]!==0 && data[i][j] === data[i][k] && this.no_block_horizontal(i, j, k)){
result.push( {form : {y:i,x:j}, to :{y:i,x:k}} );
data[i][k] += data[i][j];
data[i][j] = 0;
moveUp : function() {
var data = this.
var result = [];
// 循环要检测的长度
for(var i=0; i&data[0]. i++ ) {
// 循环要检测的高度
for(var j=1; j&data. j++) {
if (data[j][i] != 0) {
//x是确定的, 循环y方向;
for (var k = 0; k& k++) {
//当前的是data[j][i], 如果最上面的是0, 而且之间的全部是0
if (data[k][i] === 0 && this.no_block_vertical(i, k, j)) {
result.push( {form : {y:j,x:i}, to :{y:k,x:i}} );
data[k][i] = data[j][i];
data[j][i] = 0;
}else if(data[j][i]!==0 && data[k][i] === data[j][i] && this.no_block_vertical(i, k, j)){
result.push( {form : {y:j,x:i}, to :{y:k,x:i}} );
data[k][i] += data[j][i];
data[j][i] = 0;
moveDown : function() {
var data = this.
var result = [];
// 循环要检测的长度
for(var i=0; i&data[0]. i++ ) {
// 循环要检测的高度
for(var j=data.length - 1; j&=0 ; j--) {
if (data[j][i] != 0) {
//x是确定的, 循环y方向;
for (var k = data.length-1; k& k--) {
if (data[k][i] === 0 && this.no_block_vertical(i, k, j)) {
result.push( {form : {y:j,x:i}, to :{y:k,x:i}} );
data[k][i] = data[j][i];
data[j][i] = 0;
}else if(data[k][i]!==0 && data[k][i] === data[j][i] && this.no_block_vertical(i, j, k)){
result.push( {form : {y:j,x:i}, to :{y:k,x:i}} );
data[k][i] += data[j][i];
data[j][i] = 0;
var util = {
animateShowBlock : function() {
setTimeout(function() {
this.renderHTML();
}.bind(this),200);
animateMoveBlock : function(prop) {
$("#num"+prop.form.y+""+prop.form.x).animate({top:40*prop.to.y,left:40*prop.to.x},200);
//底线库的模板中引用了这个方法;
getPost : function(num) {
return num*40 + "px";
//这个应该算是服务;
var View = function(data) {
this.data = data.
this.el = data.
this.renderHTML();
this.init();
$.extend(View.prototype, {
renderHTML : function() {
var str = _.template( document.getElementById("tpl").innerHTML )( {data : this.data.map} );
this.el.innerHTML =
init : function() {
this.bindEvents();
bindEvents : function() {
$(document).keydown(function(ev){
var animationArray = [];
switch(ev.keyCode) {
animationArray = this.data.moveLeft();
animationArray = this.data.moveUp();
animationArray = this.data.moveRight();
animationArray = this.data.moveDown();
if( animationArray ) {
for(var i=0; i&animationArray. i++ ) {
var prop = animationArray[i];
this.animateMoveBlock(prop);
this.data.generationBlock();
this.animateShowBlock();
}.bind(this));
$(function() {
var data = new Data();
//随机生成两个节点;
data.generationBlock();
data.generationBlock();
//生成视图
var view = new View({ data :data, el : document.getElementById("g") });
//继承工具方法, 主要是动画效果的继承;
$.extend( true, view, util );
//显示界面
view.renderHTML();
  最近对HTML5的游戏很感兴趣, 今年8月16号国家会议中心又有WEB开发者大会, 估计H5的游戏大厅又要爆满, 别人那么大, 我想去看看, o(^▽^)o , 想想就想尿一会儿, 太激动了;
  地址是:iWeb峰会暨攻城师嘉年华&3000人+规模的北京站开启报名!8月16日 北京国际会议中心, 有没有要约的童鞋啊, 妹子优先。
  官方网站是:&赶快报名么么哒;
阅读(...) 评论()
再过一百年, 我会在哪里?他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)求21点游戏的C/C++代码
[问题点数:0分]
求21点游戏的C/C++代码
[问题点数:0分]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2007年7月 C/C++大版内专家分月排行榜第一2007年6月 C/C++大版内专家分月排行榜第一2007年5月 C/C++大版内专家分月排行榜第一2007年4月 C/C++大版内专家分月排行榜第一2007年3月 C/C++大版内专家分月排行榜第一2007年2月 C/C++大版内专家分月排行榜第一2007年1月 C/C++大版内专家分月排行榜第一2006年12月 C/C++大版内专家分月排行榜第一2006年11月 C/C++大版内专家分月排行榜第一2006年9月 C/C++大版内专家分月排行榜第一2006年8月 C/C++大版内专家分月排行榜第一2006年7月 C/C++大版内专家分月排行榜第一2006年6月 C/C++大版内专家分月排行榜第一2006年5月 C/C++大版内专家分月排行榜第一2006年4月 C/C++大版内专家分月排行榜第一2006年3月 C/C++大版内专家分月排行榜第一2005年8月 C/C++大版内专家分月排行榜第一
2007年8月 C/C++大版内专家分月排行榜第二2006年10月 C/C++大版内专家分月排行榜第二
2007年7月 C/C++大版内专家分月排行榜第一2007年6月 C/C++大版内专家分月排行榜第一2007年5月 C/C++大版内专家分月排行榜第一2007年4月 C/C++大版内专家分月排行榜第一2007年3月 C/C++大版内专家分月排行榜第一2007年2月 C/C++大版内专家分月排行榜第一2007年1月 C/C++大版内专家分月排行榜第一2006年12月 C/C++大版内专家分月排行榜第一2006年11月 C/C++大版内专家分月排行榜第一2006年9月 C/C++大版内专家分月排行榜第一2006年8月 C/C++大版内专家分月排行榜第一2006年7月 C/C++大版内专家分月排行榜第一2006年6月 C/C++大版内专家分月排行榜第一2006年5月 C/C++大版内专家分月排行榜第一2006年4月 C/C++大版内专家分月排行榜第一2006年3月 C/C++大版内专家分月排行榜第一2005年8月 C/C++大版内专家分月排行榜第一
2007年8月 C/C++大版内专家分月排行榜第二2006年10月 C/C++大版内专家分月排行榜第二
2007年7月 C/C++大版内专家分月排行榜第一2007年6月 C/C++大版内专家分月排行榜第一2007年5月 C/C++大版内专家分月排行榜第一2007年4月 C/C++大版内专家分月排行榜第一2007年3月 C/C++大版内专家分月排行榜第一2007年2月 C/C++大版内专家分月排行榜第一2007年1月 C/C++大版内专家分月排行榜第一2006年12月 C/C++大版内专家分月排行榜第一2006年11月 C/C++大版内专家分月排行榜第一2006年9月 C/C++大版内专家分月排行榜第一2006年8月 C/C++大版内专家分月排行榜第一2006年7月 C/C++大版内专家分月排行榜第一2006年6月 C/C++大版内专家分月排行榜第一2006年5月 C/C++大版内专家分月排行榜第一2006年4月 C/C++大版内专家分月排行榜第一2006年3月 C/C++大版内专家分月排行榜第一2005年8月 C/C++大版内专家分月排行榜第一
2007年8月 C/C++大版内专家分月排行榜第二2006年10月 C/C++大版内专家分月排行榜第二
匿名用户不能发表回复!|更多频道内容在这里查看
爱奇艺用户将能永久保存播放记录
过滤短视频
暂无长视频(电视剧、纪录片、动漫、综艺、电影)播放记录,
按住视频可进行拖动
&正在加载...
收藏成功,可进入
查看所有收藏列表
当前浏览器仅支持手动复制代码
视频地址:
flash地址:
html代码:
通用代码:
通用代码可同时支持电脑和移动设备的分享播放
用爱奇艺APP或微信扫一扫,在手机上继续观看
当前播放时间:
一键下载至手机
限爱奇艺安卓6.0以上版本
使用微信扫一扫,扫描左侧二维码,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
设备搜寻中...
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
连接失败!
请确保您要连接的设备(仅限安卓)登录了同一爱奇艺账号 且安装并开启不低于V6.0以上版本的爱奇艺客户端
部安卓(Android)设备,请点击进行选择
请您在手机端下载爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
其他安装方式:手机浏览器输入短链接http://71.am/udn
下载安装包到本机:
爱奇艺云推送
请您在手机端登录爱奇艺移动APP(仅支持安卓客户端)
使用微信扫一扫,下载爱奇艺移动APP
180秒后更新
打开爱奇艺移动APP,点击“我的-扫一扫”,扫描左侧二维码进行登录
没有安装爱奇艺视频最新客户端?
大神教你用JS在5分钟30秒内写一个Html5游戏「含代码」
正在检测客户端...
您尚未安装客户端,正在为您下载...安装完成后点击按钮即可下载
30秒后自动关闭
大神教你用JS在5分钟30秒内写一个Html5游戏「含代码」">大神教你用JS在5分钟30秒内写一个Html5游戏「含代码」
请选择打赏金额:
播放量12.7万
播放量数据:快去看看谁在和你一起看视频吧~
更多数据:
热门短视频推荐
Copyright (C) 2018 & All Rights Reserved
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制
正在为您下载爱奇艺客户端安装后即可快速下载海量视频
正在为您下载爱奇艺客户端安装后即可免费观看1080P视频
&li data-elem="tabtitle" data-seq="{{seq}}"& &a href="javascript:void(0);"& &span>{{start}}-{{end}}&/span& &/a& &/li&
&li data-downloadSelect-elem="item" data-downloadSelect-selected="false" data-downloadSelect-tvid="{{tvid}}"& &a href="javascript:void(0);"&{{pd}}&/a&
选择您要下载的《
色情低俗内容
血腥暴力内容
广告或欺诈内容
侵犯了我的权力
还可以输入
您使用浏览器不支持直接复制的功能,建议您使用Ctrl+C或右键全选进行地址复制}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信