借助HTML5 Canvas API制作一个简单的猜字游戏


Posted in HTML / CSS onMarch 25, 2016

二话不说,先上效果图以及源代码~
借助HTML5 Canvas API制作一个简单的猜字游戏

HTML代码

XML/HTML Code复制内容到剪贴板
  1. <!doctype html>  
  2. <html lang="en">  
  3.     <head>  
  4.         <meta charset="utf-8" />  
  5.         <script type="text/javascript" src="chp1_guess_the_letter.js"></script>  
  6.         <script type="text/javascript" src="modernizr.custom.99886.js"></script>  
  7.     </head>  
  8.     <body>  
  9.         <canvas id="canvas_guess_the_letter" width="500" height="300">  
  10.             你的浏览器不支持HTML5 Canvas   
  11.         </canvas>  
  12.         <form>  
  13.             <input type="button" id="createImageData" value="Export Canvas Image" />;   
  14.         </form>  
  15.     </body>  
  16. </html>  

JS代码

JavaScript Code复制内容到剪贴板
  1. /**  
  2.  * @author Rafael  
  3.  */  
  4. window.addEventListener("load", eventWindowLoaded, false);   
  5.   
  6. var Debugger = function() {   
  7.        
  8. };   
  9. Debugger.log = function(message) {   
  10.     try {   
  11.         console.log(message);   
  12.     } catch(exception) {   
  13.         return;   
  14.     }   
  15. }   
  16.   
  17. function eventWindowLoaded() {   
  18.     canvasApp();   
  19. }   
  20.   
  21. function canvasSupport() {   
  22.     return Modernizr.canvas;   
  23. }   
  24.   
  25. function canvasApp() {   
  26.     var guesses = 0;   
  27.     var message = "Guess The Letter From a(lower) to z(higher)";   
  28.     var letters = ["a","b","c","d","e","f","g","h","i","j","k","l",   
  29.                     "m","n","o","p","q","r","s","t","u","v","w","x","y","z"];   
  30.     var today = new Date();   
  31.     var letterToGuess = "";   
  32.     var higherOrLower = "";   
  33.     var letterGuessed = [];   
  34.     var gameOver = false;   
  35.        
  36.     if(!canvasSupport()) {   
  37.         return;   
  38.     }   
  39.        
  40.     var theCanvas = document.getElementById("canvas_guess_the_letter");   
  41.     var context = theCanvas.getContext("2d");   
  42.        
  43.     initGame();   
  44.        
  45.     function initGame() {   
  46.         var letterIndex = Math.floor(Math.random() * letters.length);   
  47.         letterToGuess = letters[letterIndex];   
  48.         guesses = 0;   
  49.         lettersGuessed = [];   
  50.         gameOver = false;   
  51.         window.addEventListener("keyup", eventKeyPressed, true);   
  52.         var formElement = document.getElementById("createImageData");   
  53.         formElement.addEventListener('click', createImageDataPressed, false);   
  54.         drawScreen();   
  55.     }   
  56.        
  57.     function eventKeyPressed(e) {   
  58.         if(!gameOver) {   
  59.             var letterPressed = String.fromCharCode(e.keyCode);   
  60.             letterPressed = letterPressed.toLowerCase();   
  61.             guesses++;   
  62.             letterGuessed.push(letterPressed);   
  63.             if(letterPressed == letterToGuess) {   
  64.                 gameOver = true;   
  65.             } else {   
  66.                 letterIndex = letters.indexOf(letterToGuess);   
  67.                 guessIndex = letters.indexOf(letterPressed);   
  68.                 if(guessIndex < 0) {   
  69.                     higherOrLower = "请输入正确的字符";   
  70.                 } else if(guessIndex < letterIndex) {   
  71.                     higherOrLower = "小了";   
  72.                 } else {   
  73.                     higherOrLower = "大了";   
  74.                 }   
  75.             }   
  76.             drawScreen();   
  77.         }   
  78.     }   
  79.        
  80.     function drawScreen() {   
  81.         //背景   
  82.         context.fillStyle = "#ffffaa";   
  83.         context.fillRect(0, 0, 500, 300);   
  84.            
  85.         //箱子   
  86.         context.strokeStyle = "#000000";   
  87.         context.strokeRect(5, 5, 490, 290);   
  88.         context.textBaseLine = "top";   
  89.            
  90.         //日期   
  91.         context.fillStyle = "#000000";   
  92.         context.font = "10px _sans";   
  93.         context.fillText(today, 150, 20);   
  94.            
  95.         //消息   
  96.         context.fillStyle = "#FF0000";   
  97.         context.font = "14px _sans";   
  98.         context.fillText(message, 125, 40);   
  99.            
  100.         //猜测次数   
  101.         context.fillStyle = "#109900";   
  102.         context.font = "16px _sans";   
  103.         context.fillText("猜测次数: "+guesses, 215, 60);   
  104.            
  105.         //大还是小   
  106.         context.fillStyle = "#000000";   
  107.         context.font = "16px _sans";   
  108.         context.fillText("大还是小: "+higherOrLower, 150, 135);   
  109.            
  110.         //已经猜测的字符   
  111.         context.fillStyle = "#FF0000";   
  112.         context.font = "16px _sans";   
  113.         context.fillText("已经猜测的字符: "+letterGuessed.toString(), 10, 260);   
  114.            
  115.         if(gameOver) {   
  116.             context.fillStyle = "#FF0000";   
  117.             context.font = "40px _sans";   
  118.             context.fillText("你猜中了", 150, 180);   
  119.         }   
  120.     }   
  121.        
  122.     function createImageDataPressed(e) {   
  123.         window.open(theCanvas.toDataURL(), "canvasImage","left=0, top=0, width="+theCanvas.width+", height="+theCanvas.height+", toolbar=0, resizable=0");   
  124.     }   
  125. }  

从游戏名称可以看出,该游戏是猜字游戏。每局系统都会自动生成一个字母,玩家会按键盘来猜测该字母是哪一个。

例如生成的是s,玩家按了h,则游戏就会提示《小了》,因为英文字母当中h的索引比s的索引更靠前。

案例当中涉及的变量。

guesses:猜测次数
message:文字提示,指导用户如何玩该游戏
letters:文字数组,存放我们要猜测的文字的集合。这个例子用的是a到z
today:今天的日期
letterToGuess:要猜测的文字
higherOrLower:是《大了》还是《小了》
letterGuessed:已经猜测过得文字
gameOver:游戏是否结束,是布尔变量,开始的时候是false,猜对后设为true

变量的声明

JavaScript Code复制内容到剪贴板
  1. var guesses = 0;   
  2. var message = "Guess The Letter From a(lower) to z(higher)";   
  3. var letters = ["a","b","c","d","e","f","g","h","i","j","k","l",   
  4.                 "m","n","o","p","q","r","s","t","u","v","w","x","y","z"];   
  5. var today = new Date();   
  6. var letterToGuess = "";   
  7. var higherOrLower = "";   
  8. var letterGuessed = [];   
  9. var gameOver = false;  

初始化游戏

JavaScript Code复制内容到剪贴板
  1. function initGame() {   
  2.         var letterIndex = Math.floor(Math.random() * letters.length);   
  3.         letterToGuess = letters[letterIndex];   
  4.         guesses = 0;   
  5.         lettersGuessed = [];   
  6.         gameOver = false;   
  7.         window.addEventListener("keyup", eventKeyPressed, true);   
  8.         var formElement = document.getElementById("createImageData");   
  9.         formElement.addEventListener('click', createImageDataPressed, false);   
  10.         drawScreen();   
  11.     }  

通过使用Math的random()函数和floor()函数,根据文字的数组生成要猜测的文字。

并且当用户按键盘的时候监听《keyup》事件,根据传递过来的event,生成按下的键值。

因猜测游戏对大小写不敏感,为防止用户按大写字母,我们需要把值转换成小写形式。

猜测次数+1

猜测出来的文字添加到已经猜测的文字数组当中

JavaScript Code复制内容到剪贴板
  1. var letterPressed = String.fromCharCode(e.keyCode);   
  2. letterPressed = letterPressed.toLowerCase();   
  3. guesses++;   
  4. letterGuessed.push(letterPressed);   

剩下的就只有判断 大和小了。

通过indexOf函数 我们可以判断要猜测的文字和我们输入的文字在字符集上面的索引值。

如果我们输入的更靠前则提示《小了》反之《大了》

最终用户猜对了要猜测的文字 我们会在中央用大号字体显示《你猜对了》

JavaScript Code复制内容到剪贴板
  1. letterIndex = letters.indexOf(letterToGuess);   
  2. guessIndex = letters.indexOf(letterPressed);   
  3. if(guessIndex < 0) {   
  4.     higherOrLower = "请输入正确的字符";   
  5. else if(guessIndex < letterIndex) {   
  6.     higherOrLower = "小了";   
  7. else {   
  8.     higherOrLower = "大了";   
  9. }  

 

至此这个功能差不多完成了吧,我们还有一个小功能,那就是通过按下按钮的方式可以把屏幕结果抓去出来。

用的函数为toDataUrl(),有兴趣的朋友研究一下。

HTML / CSS 相关文章推荐
CSS3教程:新增加的结构伪类
Apr 02 HTML / CSS
css3.0 图形构成实例练习一
Mar 19 HTML / CSS
CSS3实现翘边的阴影效果的代码示例
Jun 13 HTML / CSS
css3翻牌翻数字的示例代码
Feb 07 HTML / CSS
HTML5 Canvas图像模糊完美解决办法
Feb 06 HTML / CSS
前端canvas动画如何转成mp4视频的方法
Jun 17 HTML / CSS
HTML5中实现拖放效果无须借助javascript
Dec 26 HTML / CSS
详解HTML5中表单验证的8种方法介绍
Dec 19 HTML / CSS
吃透移动端 Html5 响应式布局
Dec 16 HTML / CSS
html5响应式开发自动计算fontSize的方法
Jan 13 HTML / CSS
div或img图片高度随宽度自适应的方法
Feb 06 HTML / CSS
Html5移动端网页端适配(js+rem)
Feb 03 HTML / CSS
使用HTML5 Canvas API控制字体的显示与渲染的方法
Mar 24 #HTML / CSS
深入解析HTML5 Canvas控制图形矩阵变换的方法
Mar 24 #HTML / CSS
详解如何用HTML5 Canvas API控制图片的缩放变换
Mar 22 #HTML / CSS
实例讲解利用HTML5 Canvas API操作图形旋转的方法
Mar 22 #HTML / CSS
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
Mar 22 #HTML / CSS
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
Mar 22 #HTML / CSS
使用HTML5 Canvas API绘制弧线的教程
Mar 22 #HTML / CSS
You might like
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
php实现的漂亮分页方法
2014/04/17 PHP
PHP实现的贪婪算法实例
2017/10/17 PHP
Laravel框架运行出错提示RuntimeException No application encryption key has been specified.解决方法
2019/04/02 PHP
php中关于换行的实例写法
2019/09/26 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
js 页面传参数时 参数值含特殊字符的问题
2009/12/13 Javascript
jQuery使用动态渲染表单功能完成ajax文件下载
2013/01/15 Javascript
使用js在页面中绘制表格核心代码
2013/09/16 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
jQuery取得iframe中元素的常用方法详解
2016/01/14 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
js判断手机浏览器操作系统和微信浏览器的方法
2016/04/30 Javascript
VC调用javascript的几种方法(推荐)
2016/08/09 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
微信小程序全局变量改变监听的实现方法
2019/07/15 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
浅谈Vue3 Composition API如何替换Vue Mixins
2020/04/29 Javascript
Python中的True,False条件判断实例分析
2015/01/12 Python
书单|人生苦短,你还不用python!
2017/12/29 Python
Python求出0~100以内的所有素数
2018/01/23 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
pandas取出重复数据的方法
2019/07/04 Python
使用豆瓣源来安装python中的第三方库方法
2021/01/26 Python
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
银行职业规划书范文
2013/12/28 职场文书
调解员先进事迹材料
2014/02/07 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
技术经济专业求职信
2014/09/03 职场文书
无财产离婚协议书范本
2014/10/28 职场文书
整改报告格式
2014/11/06 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
php去除deprecated的实例方法
2021/11/17 PHP