iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 20
1
自我挑戰組

一週程式專案挑戰系列 第 20

[專案03]貓圍棋(五)優化隨機地圖

將程式碼進行優化,今天改得比較可以見人。

【大綱】

  • 優化隨機地圖
  • 心得

【優化隨機地圖】

  • 說明原問題
  • 改善

【說明原問題】

參考:Fisher-Yates Shuffle(不安全)簡稱Fisher

一開始地圖會隨機放7顆棋,
這邊原先用Fisher排序。
不過這方法適合資料間差異性大,
裡面重複數量越少越好,
最好都不相同。

而貓圍棋有121個板塊,
空地113個、棋子7顆、貓1隻,
重複資料實在太多。

假如用Fisher排序,
會從最尾端排到第一個,
固定要排序121次。

當貓和棋子都被抽出來,
剩下的全部都是空地。
基本上繼續排下去,
有點花時間。

【改善】

參考:ccutmis大介紹JS: 快速建立2維陣列(stackoverflow)

程式碼說明

/** initMap(){
*create mapArray init empty
*1D convert 2D
*add cat
*random add chess to map
*/
var mapSize= 11;
const mapData={
		"em":"empty",
		"ch":"chess",
		"ca":"cat",
	};

這邊先建立11x11地圖,
然後全部設定為「空地」。

var mapArr,mapArr2D;
function initMap(){
	//create mapArray 
	mapArr=new Array(mapSize);
	mapArr2D=new Array(mapSize);
	
	//1D Array convert 2D
	console.log("create mapArray init empty:");
	for(let col=0; col<mapSize; col++){
		mapArr[col]= "em";
	}
	for(let row=0; row<mapSize; row++){
		mapArr2D[row] = mapArr.slice(0);
	}

放入「貓咪」

	//add cat
	mapArr2D[catRow][catCol]="ca";
	console.log(mapArr2D);

隨機抽出一個板塊,
如果這個板塊是「空地」,
則放入「棋子」。

	//random add chess to map
	console.log("random add chess to map:")
	var chess= 0;
    
	while(chess<chessSize){
		let row = Math.floor(Math.random()*(mapSize));
		let col = Math.floor(Math.random()*(mapSize));
		
		if(mapArr2D[row][col]=="em"){
			chess+=1;
			mapArr2D[row][col]= "ch";
		}
	}
	console.log(mapArr2D);
}

建立陣列方法改成參考
速度會比較快,
整段程式也變得清楚許多。

隨機方法改善,
運氣好的話抽7次就可以結束。


【心得】

這陣子常常修壞檔案,
讓我學會一句話git checkout --catGO.html
它可以回到檔案還活著的時候。

感謝撥冗閱讀,
有錯誤地方請多指教。


上一篇
[專案03]貓圍棋(五)貓咪AI
下一篇
[專案03]貓圍棋(六)總結
系列文
一週程式專案挑戰26

尚未有邦友留言

立即登入留言