<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        [html5游戲開發]數獨游戲-完整算法-開源講座

        來源:懂視網 責編:小采 時間:2020-11-27 15:12:12
        文檔

        [html5游戲開發]數獨游戲-完整算法-開源講座

        [html5游戲開發]數獨游戲-完整算法-開源講座:開言:本次講一下數獨游戲的開發,數獨游戲是一個填數字的游戲,在一個9x9的方格內,這個9x9的大格子又可以分為9個3x3的小的九宮格,在這些格子內填寫上1至9的數字,使得每一行,每一列,并且每個小的九宮格內的數字都不重復,游戲玩法簡單,數字組合千變萬化
        推薦度:
        導讀[html5游戲開發]數獨游戲-完整算法-開源講座:開言:本次講一下數獨游戲的開發,數獨游戲是一個填數字的游戲,在一個9x9的方格內,這個9x9的大格子又可以分為9個3x3的小的九宮格,在這些格子內填寫上1至9的數字,使得每一行,每一列,并且每個小的九宮格內的數字都不重復,游戲玩法簡單,數字組合千變萬化

        開言:

        本次講一下數獨游戲的開發,數獨游戲是一個填數字的游戲,在一個9x9的方格內,這個9x9的大格子又可以分為9個3x3的小的九宮格,在這些格子內填寫上1至9的數字,使得每一行,每一列,并且每個小的九宮格內的數字都不重復,游戲玩法簡單,數字組合千變萬化,所以玩起來特別有意思。

        在中國數獨游戲似乎沒那么流行,但是在日本這個游戲非常受歡迎,在通勤的電車上,經常能看到一些人一個手拿著一本數獨游戲的書,另一個手拿著一支鉛筆,就這么一路計算著。現在我用lufylegend.js引擎來將這款游戲搬到瀏覽器上來,游戲界面如下圖所示。


        圖1

        游戲分為兩個階段,第一個階段,是比較簡單的玩法,只需要橫,豎,沒有重復的數字就可以了,另一個高級階段,還需要保證每一個小的九宮格內的數字也不重復。想挑戰一下的朋友,可以點擊下面的游戲鏈接試一下自己能通過幾關。

        http://lufylegend.com/demo/sudoku

        和之前的推箱子游戲一樣,一共6關,游戲里也有排名系統,每過一關可以上傳自己的成績,跟大家比拼一下。

        制作開始

        一,首先,你需要下載lufylegend.js引擎

        下面是我在博客的lufylegend-1.6發布帖

        http://blog.csdn.net/lufy_legend/article/details/8593968

        下面一步步來進入開發正題。

        二,游戲算法

        這個游戲,我們首先要解決的就是數字如何打亂的問題,因為不但要把數字打亂,還要保證這些數字被打亂后,依然符合數獨的規則,然后在打亂的數字中隱藏一部分,就可以開始游戲了。

        我們先來看一組數字

        圖2

        可以看到,在這組數字中,它的橫,豎列上的數字都是不重復的。我們如何來把它的順序打亂呢?不難看出,如果我們只把它的每一行打亂,那么它的完整性是不受影響的。同樣,我們只把它的每一列進行打亂,它也是不會受到影響的。所以,要打亂它只需要以行和列為單位進行打亂就行了,算法如下。

        function randomNum01(lv){
        	var i,j,list = new Array(),result = new Array();
        	for(i=0;i<9;i++){
        	list.push([1,2,3,4,5,6,7,8,9]);
        	for(j=0;j.5?-1:1;});
        	var rand = new Array(0,1,2,3,4,5,6,7,8).sort(function(a,b){return Math.random()>.5?-1:1;});
        	for(i=0;i<9;i++){
        	for(j=0;j<9;j++){
        	result[i].push(list[i][rand[j]]);
        	}
        	}
        
        	for(i=0;i<9;i++){
        	for(j=0;j>> 0;
        	result[i][ran1] = 0;
        	ran1 = Math.random()*9 >>> 0;
        	result[ran1][i] = 0;
        	}
        	}
        	return result;
        }

        上面的函數,我首先生成了一組有規律的數字,然后按照行和咧進行打亂,最后,隨機拿掉一些數字。

        下面再看另一組數字。

        圖3

        這種情況下,我們還要保證每個小九宮格內的數字的完整性,又要怎么做呢?在這里我有一種偷懶的算法,看下面的圖4。


        圖4

        我們將行和列每3個作為一個單位進行打亂,就很簡單的達到了目的了,當然這只是一種偷懶的算法,如果你有更好的算法,歡迎一起討論,我的算法如下。

        function randomNum02(lv){
        	var i,j,k,list = [],result = [],rand;
        	for(i=0;i<9;i++){
        	list.push([1,2,3,4,5,6,7,8,9]);
        	for(j=0;j.5?-1:1;}).concat(
        	new Array(3,4,5).sort(function(a,b){return Math.random()>.5?-1:1;}),
        	new Array(6,7,8).sort(function(a,b){return Math.random()>.5?-1:1;})
        	);
        	for(i=0;i<9 i="" result="" push="" list="" rand="" i="" list="result;" rand="new" array="" 0="" 1="" 2="" sort="" function="" a="" b="" return="" math="" random="">.5?-1:1;}).concat(
        	new Array(3,4,5).sort(function(a,b){return Math.random()>.5?-1:1;}),
        	new Array(6,7,8).sort(function(a,b){return Math.random()>.5?-1:1;})
        	);
        	result = [];
        	for(i=0;i<9;i++){
        	result.push([]);
        	for(j=0;j<9;j++){
        	result[i].push(list[i][rand[j]]);
        	}
        	}
        
        	for(i=0;i<9;i++){
        	for(j=0;j>> 0;
        	result[i][ran1] = 0;
        	ran1 = Math.random()*9 >>> 0;
        	result[ran1][i] = 0;
        	}
        	}
        	return result;
        }

        三,判斷數字的正確性

        當玩家將所有被取走的數字都恢復了之后,就要判斷一下他們填寫的數字是否正確,是不是符合數獨的游戲規則,方法很簡單,就是驗證每一行,每一列,以及高級階段的時候每個九宮格內的數字,是不是沒有重復,下面是代碼

        function checkWin(){
        	var check01,check02;
        	for(var i=0;i<9;i++){
        	check01 = [];
        	check02 = [];
        	for(var j=0;j<9 j="" if="" stagenumlist="" i="" j="" value=""> 0)check01.push(stageNumList[i][j].value);
        	if(stageNumList[j][i].value > 0)check02.push(stageNumList[j][i].value);
        	}
        	check01 = deleteEleReg(check01);
        	check02 = deleteEleReg(check02);
        	if(check01.length < 9)return false;
        	if(check02.length < 9)return false;
        	}
        	var stage = stageMenu[stageIndex];
        	if(stage.flag){
        	return checkWin02();
        	}
        	return true;
        }
        function checkWin02(){
        	for(var i=0;i<3;i++){
        	for(var j=0;j<3;j++){
        	if(!check_mini(i,j))return false;
        	}
        	}
        	return true;
        }
        function check_mini(i2,j2){
        	var check_arr = [];
        	for(var i=i2*3;i<i2*3+3;i++){
        	for(var j=j2*3;j<j2*3+3;j++){
        	if(check_arr[stageNumList[i][j].value])return false;
        	check_arr[stageNumList[i][j].value] = 1;
        	}
        	}
        	return true;
        }

        這個游戲很簡單,以上,整個游戲的核心算法都已經解決了。

        四,建一個開始畫面

        如下。

        圖4

        上次我也說了,使用lufylegend.js引擎做個界面,可以說毫無難度,代碼如下。

        function GameLogo(){
        	base(this,LSprite,[]);
        	var self = this;
        	
        	var logolist = [[1,1,1,1],[1,2,4,1],[1,4,2,1],[1,1,1,1]];
        	var bitmap,logoLayer;
        	logoLayer = new LSprite();
        	bitmap = new LBitmap(new LBitmapData(imglist["logo"]));
        	bitmap.scaleX = bitmap.scaleY = 2;
        	logoLayer.addChild(bitmap);
        	self.addChild(logoLayer);
        	var social = new Social();
        	social.x = 60;
        	social.y = 500;
        	self.addChild(social);
        	
        	labelText = new LTextField();
        	labelText.font = "HG行書體";
        	labelText.size = 14;
        	labelText.x = 50;
        	labelText.y = 650;
        	labelText.text = "- Html5 Game Engine lufylegend.js";
        	self.addChild(labelText);
        	labelText = new LTextField();
        	labelText.color = "#006400";
        	labelText.font = "HG行書體";
        	labelText.size = 14;
        	labelText.x = 50;
        	labelText.y = 700;
        	labelText.text = "http://www.lufylegend.com/lufylegend";
        	self.addChild(labelText);
        	
        	self.addEventListener(LMouseEvent.MOUSE_UP,menuShow);
        };

        這一次我用了一張圖片做界面,代碼就更簡單了,文字顯示依然是LTextField對象,使用方法請參考官方API文檔。

        五,建一個選擇畫面

        如下。

        圖5

        代碼如下。

        function GameMenu(){
        	base(this,LSprite,[]);
        	var self = this;
        	
        	var menuLayer;
        	menuLayer = new LSprite();
        	bitmap = new LBitmap(new LBitmapData(imglist["menu_back"]));
        	bitmap.scaleX = bitmap.scaleY = 2;
        	menuLayer.addChild(bitmap);
        	self.addChild(menuLayer);
        	
        	labelText = new LTextField();
        	labelText.color = "#B22222";
        	labelText.font = "HG行書體";
        	labelText.size = 40;
        	labelText.x = 30;
        	labelText.y = 700;
        	labelText.stroke = true;
        	labelText.lineWidth = 4;
        	labelText.text = "Please select !!";
        	menuLayer.addChild(labelText);
        	
        	for(var i=0;i<stageMenu.length;i++){
        	self.stageVsMenu(stageMenu[i]);
        	}
        };
        GameMenu.prototype.stageVsMenu = function(obj){
        	var self = this;
        	
        	var menuButton = new LSprite();
        	var bitmap = new LBitmap(new LBitmapData(imglist["menu_stage"]));
        	menuButton.addChild(bitmap);
        	menuButton.x = obj.x * 220 + 30; 
        	menuButton.y = obj.y * 200 + 50;
        	self.addChild(menuButton);
        	if(obj.open){
        	labelText = new LTextField();
        	labelText.color = "#ffffff";
        	labelText.font = "HG行書體";
        	labelText.size = 20;
        	labelText.x = 50;
        	labelText.y = 90;
        	menuButton.addChild(labelText)
        	labelText.text = "第"+(obj.index+1)+"關";
        	
        	labelText = new LTextField();
        	labelText.color = "#ffffff";
        	labelText.font = "HG行書體";
        	labelText.size = 12;
        	labelText.x = 30;
        	labelText.y = 30;
        	menuButton.addChild(labelText)
        	labelText.text = "times:"+obj.times;
        	menuButton.obj = obj;
        	menuButton.addEventListener(LMouseEvent.MOUSE_UP,function(event,self){
        	gameStart(self.obj.index);
        	});
        	}else{
        	labelText = new LTextField();
        	labelText.color = "#ffffff";
        	labelText.font = "HG行書體";
        	labelText.size = 20;
        	labelText.x = 60;
        	labelText.y = 40;
        	menuButton.addChild(labelText)
        	labelText.text = "???";
        	};
        }

        好了,游戲基本的代碼已經都貼出來了。

        源碼

        下面提供完整游戲源代碼,想研究一下的朋友可以點擊下面的連接下載。

        http://lufylegend.com/lufylegend_download/sudoku.rar

        注意:該附件只包含本次文章源碼,lufylegend.js引擎請到http://www.gxlcms.com/進行下載。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        [html5游戲開發]數獨游戲-完整算法-開源講座

        [html5游戲開發]數獨游戲-完整算法-開源講座:開言:本次講一下數獨游戲的開發,數獨游戲是一個填數字的游戲,在一個9x9的方格內,這個9x9的大格子又可以分為9個3x3的小的九宮格,在這些格子內填寫上1至9的數字,使得每一行,每一列,并且每個小的九宮格內的數字都不重復,游戲玩法簡單,數字組合千變萬化
        推薦度:
        標簽: 游戲 開發 html5
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲国产精品久久久久婷婷老年 | 一级女人18片毛片免费视频| 免费电视剧在线观看| 蜜芽亚洲av无码精品色午夜| 国产偷伦视频免费观看| 亚洲国产精品一区二区第一页| eeuss免费天堂影院| 亚洲精品蜜桃久久久久久| 成人爽a毛片免费| 亚洲成年轻人电影网站www| 久久免费精彩视频| 亚洲第一永久在线观看| 毛色毛片免费观看| 小说区亚洲自拍另类| 亚洲AV无码乱码在线观看性色扶 | 亚洲国产精品国产自在在线| 免费无遮挡无码视频在线观看| 亚洲午夜福利精品无码| 中文成人久久久久影院免费观看| 亚洲国产精品国自产拍AV| 最近免费中文字幕高清大全| 亚洲乱码在线观看| 国产人成免费视频| 两个人看的www免费高清| 亚洲视频国产视频| 免费高清av一区二区三区| 一级做a爰全过程免费视频毛片| 久久亚洲精品成人| 亚洲成人免费网址| 无码一区二区三区亚洲人妻| 亚洲中文字幕第一页在线| 91大神免费观看| 亚洲av无码偷拍在线观看| 亚洲永久无码3D动漫一区| 57PAO成人国产永久免费视频 | 亚洲成av人片一区二区三区| 免费日本一区二区| 亚洲国产成人手机在线观看| 亚洲男人的天堂www| 无码中文在线二区免费| xxxxxx日本处大片免费看|