借助HTML5 Canvas API制作一個簡單的猜字游戲

二話不說,先上效果圖以及源代碼~
HTML代碼
- <!doctype html>
- <html lang="en">
- <head>
- <meta charset="utf-8" />
- <script type="text/javascript" src="chp1_guess_the_letter.js"></script>
- <script type="text/javascript" src="modernizr.custom.99886.js"></script>
- </head>
- <body>
- <canvas id="canvas_guess_the_letter" width="500" height="300">
- 你的瀏覽器不支持HTML5 Canvas
- </canvas>
- <form>
- <input type="button" id="createImageData" value="Export Canvas Image" />;
- </form>
- </body>
- </html>
JS代碼
- /**
- * @author Rafael
- */
- window.addEventListener("load", eventWindowLoaded, false);
- var Debugger = function() {
- };
- Debugger.log = function(message) {
- try {
- console.log(message);
- } catch(exception) {
- return;
- }
- }
- function eventWindowLoaded() {
- canvasApp();
- }
- function canvasSupport() {
- return Modernizr.canvas;
- }
- function canvasApp() {
- var guesses = 0;
- var message = "Guess The Letter From a(lower) to z(higher)";
- var letters = ["a","b","c","d","e","f","g","h","i","j","k","l",
- "m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
- var today = new Date();
- var letterToGuess = "";
- var higherOrLower = "";
- var letterGuessed = [];
- var gameOver = false;
- if(!canvasSupport()) {
- return;
- }
- var theCanvas = document.getElementById("canvas_guess_the_letter");
- var context = theCanvas.getContext("2d");
- initGame();
- function initGame() {
- var letterIndex = Math.floor(Math.random() * letters.length);
- letterToGuess = letters[letterIndex];
- guesses = 0;
- lettersGuessed = [];
- gameOver = false;
- window.addEventListener("keyup", eventKeyPressed, true);
- var formElement = document.getElementById("createImageData");
- formElement.addEventListener('click', createImageDataPressed, false);
- drawScreen();
- }
- function eventKeyPressed(e) {
- if(!gameOver) {
- var letterPressed = String.fromCharCode(e.keyCode);
- letterPressed = letterPressed.toLowerCase();
- guesses++;
- letterGuessed.push(letterPressed);
- if(letterPressed == letterToGuess) {
- gameOver = true;
- } else {
- letterIndex = letters.indexOf(letterToGuess);
- guessIndex = letters.indexOf(letterPressed);
- if(guessIndex < 0) {
- higherOrLower = "請輸入正確的字符";
- } else if(guessIndex < letterIndex) {
- higherOrLower = "小了";
- } else {
- higherOrLower = "大了";
- }
- }
- drawScreen();
- }
- }
- function drawScreen() {
- //背景
- context.fillStyle = "#ffffaa";
- context.fillRect(0, 0, 500, 300);
- //箱子
- context.strokeStyle = "#000000";
- context.strokeRect(5, 5, 490, 290);
- context.textBaseLine = "top";
- //日期
- context.fillStyle = "#000000";
- context.font = "10px _sans";
- context.fillText(today, 150, 20);
- //消息
- context.fillStyle = "#FF0000";
- context.font = "14px _sans";
- context.fillText(message, 125, 40);
- //猜測次數(shù)
- context.fillStyle = "#109900";
- context.font = "16px _sans";
- context.fillText("猜測次數(shù): "+guesses, 215, 60);
- //大還是小
- context.fillStyle = "#000000";
- context.font = "16px _sans";
- context.fillText("大還是小: "+higherOrLower, 150, 135);
- //已經(jīng)猜測的字符
- context.fillStyle = "#FF0000";
- context.font = "16px _sans";
- context.fillText("已經(jīng)猜測的字符: "+letterGuessed.toString(), 10, 260);
- if(gameOver) {
- context.fillStyle = "#FF0000";
- context.font = "40px _sans";
- context.fillText("你猜中了", 150, 180);
- }
- }
- function createImageDataPressed(e) {
- window.open(theCanvas.toDataURL(), "canvasImage","left=0, top=0, width="+theCanvas.width+", height="+theCanvas.height+", toolbar=0, resizable=0");
- }
- }
從游戲名稱可以看出,該游戲是猜字游戲。每局系統(tǒng)都會自動生成一個字母,玩家會按鍵盤來猜測該字母是哪一個。
例如生成的是s,玩家按了h,則游戲就會提示《小了》,因為英文字母當(dāng)中h的索引比s的索引更靠前。
案例當(dāng)中涉及的變量。
guesses:猜測次數(shù)
message:文字提示,指導(dǎo)用戶如何玩該游戲
letters:文字數(shù)組,存放我們要猜測的文字的集合。這個例子用的是a到z
today:今天的日期
letterToGuess:要猜測的文字
higherOrLower:是《大了》還是《小了》
letterGuessed:已經(jīng)猜測過得文字
gameOver:游戲是否結(jié)束,是布爾變量,開始的時候是false,猜對后設(shè)為true
變量的聲明
- var guesses = 0;
- var message = "Guess The Letter From a(lower) to z(higher)";
- var letters = ["a","b","c","d","e","f","g","h","i","j","k","l",
- "m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
- var today = new Date();
- var letterToGuess = "";
- var higherOrLower = "";
- var letterGuessed = [];
- var gameOver = false;
初始化游戲
- function initGame() {
- var letterIndex = Math.floor(Math.random() * letters.length);
- letterToGuess = letters[letterIndex];
- guesses = 0;
- lettersGuessed = [];
- gameOver = false;
- window.addEventListener("keyup", eventKeyPressed, true);
- var formElement = document.getElementById("createImageData");
- formElement.addEventListener('click', createImageDataPressed, false);
- drawScreen();
- }
通過使用Math的random()函數(shù)和floor()函數(shù),根據(jù)文字的數(shù)組生成要猜測的文字。
并且當(dāng)用戶按鍵盤的時候監(jiān)聽《keyup》事件,根據(jù)傳遞過來的event,生成按下的鍵值。
因猜測游戲?qū)Υ笮懖幻舾?,為防止用戶按大寫字母,我們需要把值轉(zhuǎn)換成小寫形式。
猜測次數(shù)+1
猜測出來的文字添加到已經(jīng)猜測的文字數(shù)組當(dāng)中
- var letterPressed = String.fromCharCode(e.keyCode);
- letterPressed = letterPressed.toLowerCase();
- guesses++;
- letterGuessed.push(letterPressed);
剩下的就只有判斷 大和小了。
通過indexOf函數(shù) 我們可以判斷要猜測的文字和我們輸入的文字在字符集上面的索引值。
如果我們輸入的更靠前則提示《小了》反之《大了》
最終用戶猜對了要猜測的文字 我們會在中央用大號字體顯示《你猜對了》
- letterIndex = letters.indexOf(letterToGuess);
- guessIndex = letters.indexOf(letterPressed);
- if(guessIndex < 0) {
- higherOrLower = "請輸入正確的字符";
- } else if(guessIndex < letterIndex) {
- higherOrLower = "小了";
- } else {
- higherOrLower = "大了";
- }
至此這個功能差不多完成了吧,我們還有一個小功能,那就是通過按下按鈕的方式可以把屏幕結(jié)果抓去出來。
用的函數(shù)為toDataUrl(),有興趣的朋友研究一下。
相關(guān)文章
- 下面小編就為大家?guī)硪黄钊胙芯縃TML5實現(xiàn)圖片壓縮上傳功能。小編覺得挺不錯的,現(xiàn)在分享給大家。也給大家一個參考,一起跟隨小編過來看看吧2016-03-25
- 下面小編就為大家?guī)硪黄狧TML5觸摸事件演化tap事件介紹。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家一個參考。一起跟隨小編過來看看吧2016-03-25
jQuery+html5實現(xiàn)企業(yè)年會數(shù)字抽獎特效源碼
jQuery+html5實現(xiàn)企業(yè)年會數(shù)字抽獎特效源碼是一款基于jQuery+HTML5實現(xiàn)的企業(yè)年會電子數(shù)字抽獎代碼。需要的朋友前來下載源碼2016-03-25- 下面小編就為大家分享一篇html5生成柱狀圖(條形圖)效果的實例代碼。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家一個參考。一起跟隨小編過來看看吧2016-03-25
- 下面小編就為大家?guī)硪黄胔tml5繪制折線圖的實例代碼。小編覺得挺不錯的,現(xiàn)在分享給大家。也給大家一個參考。一起跟隨小編過來看看吧2016-03-25
- 這篇文章主要介紹了HTML5 Canvas繪制時指定顏色與透明度的方法,包括全局透明globalAlpha屬性的介紹,需要的朋友可以參考下2016-03-25
- 這篇文章主要介紹了使用HTML5 Canvas繪制陰影效果的方法,包括一個3D拉影+邊緣模糊效果文字的編寫例子,在陰影效果的利用上進一步深入,需要的朋友可以參考下2016-03-25
HTML5 Canvas API中drawImage()方法的使用實例
這篇文章主要介紹了HTML5 Canvas API中drawImage()方法的使用實例,drawImage()方法主要用來對圖像進行縮放或裁剪,文中給出了其坐標及相關(guān)參數(shù)的用法,需要的朋友可以參考下2016-03-25使用HTML5 Canvas API中的clip()方法裁剪區(qū)域圖像
這篇文章主要介紹了使用HTML5 Canvas API中的clip()方法裁剪區(qū)域圖像的實例教程,其中需要特別注意save()和restore()方法的搭配使用,需要的朋友可以參考下2016-03-25- 下面小編就為大家?guī)硪黄苿佣薍TML5實現(xiàn)文件上傳功能【附代碼】。小編覺得聽錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-03-25