JavaScript实现2048小游戏,我终于赢了一把(1)

效果图

================================================================

在这里插入图片描述

实现思路

=================================================================

  1. 编写页面和画布代码。

  2. 绘制背景。

  3. 绘制好全部卡片。

  4. 随机生成一个卡片(2或者4)。

  5. 键盘事件监听(上、下、左、右键监听)。

  6. 根据键盘的方向,处理数字的移动合并。

  7. 加入成功、失败判定。

  8. 处理其他收尾工作。

代码实现

=================================================================

编写页面代码


2048

重开

添加画布


在2048.js编写代码

  1. 创建函数

function G2048(){

this.renderArr=[];//渲染数组

this.cards=initCardArray();

//游戏标记

this.flag=‘start’;

}

//初始化数组

function initCardArray(){

var cards = new Array();

for (var i = 0; i < 4; i++) {

cards[i] = new Array();

for (var j = 0; j < 4; j++) {

//cards[i][j]=null;

}

}

return cards;

}

  1. 初始化和绘制背景代码(在2048.js中编写)

//初始化

G2048.prototype.init=function(el,musicObj){

if(!el) return ;

this.el=el;

var canvas = document.createElement(‘canvas’);//创建画布

canvas.style.cssText=“background:white;”;

var W = canvas.width = 370; //设置宽度

var H = canvas.height = 370;//设置高度

el.appendChild(canvas);//添加到指定的dom对象中

this.ctx = canvas.getContext(‘2d’);

this.draw();

}

//绘制入口

G2048.prototype.draw=function(){

//创建背景

this.drawGB();

//渲染到页面上

this.render();

}

//创建背景

G2048.prototype.drawGB=function(){

var bg = new _.Rect({x:0,y:0,width:364,height:364,fill:true,fillStyle:‘#428853’});

this.renderArr.push(bg);

}

//渲染图形

G2048.prototype.render=function(){

var context=this.ctx;

this.clearCanvas();

_.each(this.renderArr,function(item){

item && item.render(context);

});

}

//清洗画布

G2048.prototype.clearCanvas=function() {

this.ctx.clearRect(0,0,parseInt(this.w),parseInt(this.h));

}

  1. 在页面代码中加入以下 js 代码

var box = document.getElementById(‘box’);

g2048.init(box);

在这里插入图片描述

运行效果:

在这里插入图片描述

绘制好全部卡片


  1. 创建Card

//定义Card

function Card(i,j){

this.i=i;//下标i

this.j=j;//下标j

this.x=0;// x坐标

this.y=0;// y坐标

this.h=80;//高

this.w=80;//宽

this.start=10;//偏移量(固定值)

this.num=0;//显示数字

this.merge=false;//当前是否被合并过,如果合并了,则不能继续合并,针对当前轮

//初始化创建

this.obj = this.init();

//创建显示数字对象

this.numText = this.initNumText();

}

//初始创建

Card.prototype.init=function(){

return new _.Rect({x:this.x,y:this.y,width:this.w,height:this.h,fill:true});

}

//根据i j计算x y坐标

Card.prototype.cal=function(){

this.x = this.start + this.j*this.w + (this.j+1)*5;

this.y = this.start + this.i*this.h + (this.i+1)*5;

//更新给obj

this.obj.x=this.x;

this.obj.y=this.y;

//设置填充颜色

this.obj.fillStyle=this.getColor();

//更新文字的位置

this.numText.x = this.x+40;

this.numText.y = this.y+55;

this.numText.text=this.num;

}

//初始化显示数字对象

Card.prototype.initNumText=function(){

var font = “34px 思源宋体”;

var fillStyle = “#7D4E33”;

return new _.Text({x:this.x,y:this.y+50,text:this.num,fill:true,textAlign:‘center’,font:font,fillStyle:fillStyle});

}

//获取color

Card.prototype.getColor=function(){

var color;

//根据num设定颜色

switch (this.num) {

case 2:

color = “#EEF4EA”;

break;

case 4:

color = “#DEECC8”;

break;

case 8:

color = “#AED582”;

break;

case 16:

color = “#8EC94B”;

break;

case 32:

color = “#6F9430”;

break;

case 64:

color = “#4CAE7C”;

break;

case 128:

color = “#3CB490”;

break;

case 256:

color = “#2D8278”;

break;

case 512:

color = “#09611A”;

break;

case 1024:

color = “#F2B179”;

break;

case 2048:

color = “#DFB900”;

break;

default://默认颜色

color = “#5C9775”;

break;

}

return color;

}

Card.prototype.render=function(context){

//计算坐标等

this.cal();

//执行绘制

this.obj.render(context);

//是否绘制文字的处理

if(this.num!=0){

this.numText.render(context);

}

}

}

  1. 创建卡片

//创建卡片

G2048.prototype.drawCard=function(){

var that=this;

var card;

for (var i = 0; i < 4; i++) {

for (var j = 0; j < 4; j++) {

card = new Card(i,j);

that.cards[i][j]=card;

that.renderArr.push(card);

}

}

}

  1. 调用绘制代码

在这里插入图片描述

运行效果:

在这里插入图片描述

  1. 修改一下卡片的默认数字

在这里插入图片描述

在这里插入图片描述

随机生成一个卡片,2或者4


  1. 先把Card中 num 默认改成0
  1. 因为2跟4出现的比例是1:4,所以采用随机出1-5的数字,当是1的时候就表示,当得到2、3、4、5的时候就表示要出现数字2.
  1. 随机获取i,j 就可以得到卡片的位置,割接i,j取到card实例,如果卡片没有数字,就表示可以,否则就递归继续取,取到为止。
  1. 把刚才取到的数字,设置到card实例对象中就好了。

代码如下:

//随机创建一个卡片

G2048.prototype.createRandomNumber=function(){

var num = 0;

var index = _.getRandom(1,6);//这样取出来的就是1-5 之间的随机数

//因为2和4出现的概率是1比4,所以如果index是1,则创建数字4,否则创建数字2(1被随机出来的概率就是1/5,而其他就是4/5 就是1:4的关系)

console.log(‘index===’+index)

if(index==1){

num = 4;

}else {

num = 2;

}

//判断如果格子已经满了,则不再获取,退出

if(this.cardFull()){

return ;

}

//获取随机卡片,不为空的

var card = this.getRandomCard();

//给card对象设置数字

if(card!=null){

card.num=num;

}

}

//获取随机卡片,不为空的

G2048.prototype.getRandomCard=function(){

var i = _.getRandom(0,4);

var j = _.getRandom(0,4);

var card = this.cards[i][j];

if(card.num==0){//如果是空白的卡片,则找到了,直接返回

return card;

}

//没找到空白的,就递归,继续寻找

return this.getRandomCard();

}

//判断格子满了

G2048.prototype.cardFull=function() {

var card;

for (var i = 0; i < 4; i++) {

for (var j = 0; j < 4; j++) {

card = this.cards[i][j];

if(card.num==0){//有一个为空,则没满

return false;

}

}

}

return true;

}

draw方法中调用,表示打开游戏默认一个数字

在这里插入图片描述

运行效果:

在这里插入图片描述

加入键盘事件


同样要在draw方法中调用哦

//按键的控制

G2048.prototype.control=function(){

var that=this;

global.addEventListener(‘keydown’,function(e){

console.log(that.flag)

if(that.flag!=‘start’) return ;

var dir;

switch (e.keyCode){

case 87://w

case 38://上

dir=1;//上移动

break;

case 68://d

case 39://右

dir=2;//右移动

break;

case 83://s

case 40://下

dir=3;//下移动

break;

case 65://a

case 37://左

dir=4;//左移动

break;

}

//卡片移动的方法

that.moveCard(dir);

});

}

  1. 加入移动逻辑处理代码

//卡片移动的方法

G2048.prototype.moveCard=function(dir) {

//将卡片清理一遍,因为每轮移动会设定合并标记,需重置

this.clearCard();

if(dir==1){//向上移动

this.moveCardTop(true);

}else if(dir==2){//向右移动

this.moveCardRight(true);

}else if(dir==3){//向下移动

this.moveCardBottom(true);

}else if(dir==4){//向左移动

this.moveCardLeft(true);

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

自学几个月前端,为什么感觉什么都没学到??


这种现象在很多的初学者和自学前端的同学中是比较的常见的。

因为自学走的弯路是比较的多的,会踩很多的坑,学习的过程中是比较的迷茫的。

最重要的是,在学习的过程中,不知道每个部分该学哪些知识点,学到什么程度才算好,学了能做什么。

很多自学的朋友往往都是自己去找资料学习的,资料上有的或许就学到了,资料上没有的或许就没有学到。

这就会给人一个错误的信息就是,我把资料上的学完了,估计也-就差不多的了。

但是真的是这样的吗?非也,因为很多人找的资料就是很基础的。学完了也就是掌握一点基础的东西。分享给你一份前端分析路线,你可以参考。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

还有很多的同学在学习的过程中一味的追求学的速度,很快速的刷视频,写了后面忘了前面,最后什么都没有学到,什么都知道,但是什么都不懂,要具体说,也说不出个所以然。

习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-zbVAHC7i-1712084861999)]

自学几个月前端,为什么感觉什么都没学到??


这种现象在很多的初学者和自学前端的同学中是比较的常见的。

因为自学走的弯路是比较的多的,会踩很多的坑,学习的过程中是比较的迷茫的。

最重要的是,在学习的过程中,不知道每个部分该学哪些知识点,学到什么程度才算好,学了能做什么。

很多自学的朋友往往都是自己去找资料学习的,资料上有的或许就学到了,资料上没有的或许就没有学到。

这就会给人一个错误的信息就是,我把资料上的学完了,估计也-就差不多的了。

但是真的是这样的吗?非也,因为很多人找的资料就是很基础的。学完了也就是掌握一点基础的东西。分享给你一份前端分析路线,你可以参考。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

还有很多的同学在学习的过程中一味的追求学的速度,很快速的刷视频,写了后面忘了前面,最后什么都没有学到,什么都知道,但是什么都不懂,要具体说,也说不出个所以然。

所以学习编程一定要注重实践操作,练习敲代码的时间一定要多余看视频的时间。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript小游戏包括贪吃蛇游戏、俄罗斯方块、扫雷小游戏和网红太空人表盘等。此外,还有其他一些Java小游戏,如飞机大战、植物大战僵尸等,以及一些JavaWeb项目实战,如图书管理、在线考试、宿舍管理等。如果想要实现JavaScript小游戏,可以使用一些具体的代码实现,比如绑定游戏结束时的取消按钮点击事件和再来一把按钮点击事件。这些代码可以用来重置游戏状态、重新开始游戏等操作。不同的游戏可能会有不同的代码实现方式,具体的实现方法可以根据游戏的需求和设计进行调整和修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [JavaScript实现2048小游戏,我终于一把](https://blog.csdn.net/dkm123456/article/details/120228893)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [JavaScript实现贪吃蛇小游戏](https://blog.csdn.net/qq_45801299/article/details/121171367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值