其实在2016年,我就准备写这个小游戏了。但是奈何当时没文化?,也还没有转行成前端。既没有面向对象的思想,也不懂什么寻径算法,更不了解模块化,只是掌握了canvas的基本知识。所以以当时的水平,就搞了一段时间后,把羊,狼,砖块画了出来,具体怎么运动?搞不下去,就搁置下来了。时间飞逝,这个小游戏就这么静静地烂尾了两年多,直到前几天,在codepen上看到了一个寻径的demo,才又重新捡起来。

现在再捡起来,感觉得心应手应手了许多,尽管中间也碰到了一些坑,但不至于无从下手。尽管还有许多可以改进的地方,代码写的也不怎么规范,断断续续搞了一周多,好歹搞出来一个能用的版本。下面说说开发过程中遇到的一些问题,和学到的知识。

这里是试玩地址:https://www.imgss.top/demo/wAs/
github: https://github.com/imgss/wAs

一 devicePixelRatio

在手机上打开这个小游戏时,游戏画面会变得比较模糊,这是由于手机屏幕的css尺寸和真实的物理像素数量是不一样的。这也是window.devicePixelRatio这个属性存在的意义。同时canvas的css宽度和canvas本身的宽度也是这个区别。举个例子:

一个手机的 devicePixelRatio 是3,canvas的css宽度是500px,要想使canvas绘制出的图片不模糊,需要给canvas的宽度设置成多少?答案是500 * 3 = 1500。写成代码是:

    var ratio = window.devicePixelRatio;var oldWidth = canvas.width;var oldHeight = canvas.height;canvas.width = oldWidth * ratio; //根据radio设置新的width,解决图片模糊问题canvas.height = oldHeight * ratio;canvas.style.width = oldWidth + "px";canvas.style.height = oldHeight + "px";//使canvas在屏幕上的显示和之前保持一致

二 寻径算法

这也是整个游戏最难的地方,游戏中羊是在不断运动的,狼需要根据羊当前的位置计算出行动路径。在实现中,我参考了codepen上的这个demo,具体的思路是,用一个二维数组来表示整张地图,从目标节点(羊的位置)开始,向上下左右遍历,如果碰到墙或者边界就停止,并标记为访问过。再根据这些节点的兄弟节点进行遍历,直到找到狼所在的位置,或者整个地图全部搜索了一遍。

当在遍历中找到狼的位置后,进行一次回溯,就拿到了狼的运动路径。

整个算法在search.js中,是根据上面的那个demo修改的,实现了一个pathFinder类;

export default class Pathfinder{constructor(gridData, targetPosition, foundCallback) {this.gridData = gridData;this.targetPosition = targetPosition;this.foundCallback = foundCallback;this.width = this.gridData[0].length;this.height = this.gridData.length;}// 将二维地图转换成节点数据parseGridData() {...}

了解更多的寻径算法知识可以看这篇文章: https://www.redblobgames.com/pathfinding/a-star/introduction.html

三 一个有用的库

在开发过程中发现手机端的操作不是很流畅,找到了一个叫nipplejs的虚拟摇杆的库。使用方法也很简单,虚拟摇杆可以是固定在屏幕的某个地方,也可以是显示在屏幕的任何一个地方。但是在实际中使用发现,用摇杆操作,很容易导致羊多跑或者少跑一两格,对于这个游戏来说,不如箭头控制精度好,最终还是放弃了。

游戏里还用到一个sweetalert库,用来做弹出框的,没有依赖,用起来很方便(其实是做不出酷炫的弹窗特效)。

后记

整个过程中,加深了自己对算法重要性的认识,虽然前端很少涉及高深的算法,但是多懂一点算法知识绝对大有裨益。小游戏中还有许多值得优化的地方,也还有几个bug,这些以后再慢慢优化吧。(完)

转载于:https://www.cnblogs.com/imgss/p/10994076.html

写一个狼吃羊的小游戏相关推荐

  1. java狼追着羊跑的程序_写一个狼吃羊的小游戏 - osc_3xmkn220的个人空间 - OSCHINA - 中文开源技术交流社区...

    其实在2016年,我就准备写这个小游戏了.但是奈何当时没文化

  2. 使用Qt写一个简单的五子棋单机小游戏

    使用Qt写一个简单的五子棋单机小游戏 刚学,不够专业请勿喷,有不对的地方还请指出,我渴望进步!现在贴出这个游戏我原创的所有代码.希望可以帮到有需要的人. 游戏界面: 因为后面添加了.wav的音频文件, ...

  3. 中秋写了个狼吃羊的智力游戏

    棋子游戏类 狼吃羊(相传起源于北魏) 游戏人数:2人PK 游戏道具,石子,橡皮,粉笔头等块状物质均可 游戏规则:先在地上划出一个5X5的方格,摆放位置如下,狼先走,之后双方轮流走子,每次走一格,狼隔空 ...

  4. 写一个简单的实时互动小游戏

    在写之前,我们先回顾上一篇文章,从需求.架构.设计.开发上讲述并演示了搭建一个实时通信客户端的过程,并附了图片与视频. 写这篇文章的之前,第一个互动的游戏DEMO已经写好了,先附上截图 很奇怪的一张图 ...

  5. 无聊的时候怎么办?教你用java写一个简单挂机打金币小游戏吧!

    无聊的时候怎么办?教你用java写一个超简单挂机打金币小游戏吧! Java写一个挂机打金币程序 1.Java的面向对象 2.基础打金的分析 3. Robot介绍以及Demo演示 4.挂机打金程序如何去 ...

  6. 用Python写一个双人对战足球小游戏,堪比国足的技术【附带源码】

    开发环境 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理介绍 这是一个 ...

  7. 基于面向对象 来写一个简单的贪吃蛇小游戏(代码可直接用)

    分析一下用到的对象(这个案例的地图过于简单,可以不用创建为对象)     食物对象(food)     蛇对象(snake)     游戏对象(game) 1.food对象     属性 :x, y, ...

  8. 用python3写一个小球转动的抽奖小游戏

    最近老师在讲 tkinter,所以我做了一个抽奖小游戏 一.效果图 先上效果图.红色的小球会围绕蓝色小球做环形运动.我设置的四个角是奖品,其余的都是再接再厉. 二.方法 基于tkinter中的butt ...

  9. java 狼捉羊游戏背景_Js 写了一个 “狼吃羊” 小游戏。

    7 2019-04-14 17:12:01 +08:00 想起我最开始上学习的 VB 课,最后的大作业一个游戏就是这样的风格 ```vb If keyascii = 119 Then Image1.T ...

最新文章

  1. imrot matlab,Matlabtuxiangpipei
  2. XCOM串口助手打印不出数据
  3. 传统企业建模原理及建模体系介绍
  4. php语言中字符,PHP开发语言中字符窜的高效率写法
  5. Task.Factory.StartNew 和 Task.Factory.FromAsync 有什么区别?
  6. c语言设计 数组的知识点,C语言程序设计知识点及示例.pdf
  7. 客户端配置_交换机作为STelnet客户端登录其他设备配置示例
  8. HTML5中本地储存概念是什么,什么优点 ,与cookie有什么区别?
  9. CentOS7 安装 Nginx PHP
  10. fir滤波器课程设计matlab,Matlab课程设计---FIR数字滤波器
  11. 廖雪峰介绍Node.js
  12. 2016/03/30
  13. matlab std函数_MATLAB金融工具箱:11:根据基准优化投资组合
  14. 简单的redis使用watch完成秒杀抢购功能
  15. Visual Studio 2008破解激活升级方法
  16. python查找两文本不同字符及其相对重复率等及其pyqt5界面
  17. Showwindow 及参数
  18. 程序员有趣的面试智力题
  19. 计算机丢失GetU,u盘启动引导文件丢失如何修复
  20. 牛顿迭代法 简单入门

热门文章

  1. Javascript刷新页面的几种方法。
  2. 南邮《Linux编程》2018-2019学年第一学期期末考试回忆
  3. Java中modal dialog,showModalDialog模态对话框的使用详解以及浏览器兼容
  4. 量水堰槽水位计的用途和使用方法说明
  5. 【Bug】AttributeError: module ‘cv2‘ has no attribute ‘imread‘
  6. 数据类型——计算物体自由下落的距离(C语言程序设计)
  7. selectKey标签详解
  8. 【转载】从假装在腾讯,到真的360 —— 一个应届准PM的独白(面经干货)
  9. 基于 HTML5 WebGL 的 3D 仓储管理系统
  10. 大数据Linux命令之命令安装、文件编辑、软件上传与下载