Skip to content

Instantly share code, notes, and snippets.

@Nick0603
Last active August 8, 2017 12:29
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Nick0603/6eaf99f61cb7359366c15e939a5ed5df to your computer and use it in GitHub Desktop.
Save Nick0603/6eaf99f61cb7359366c15e939a5ed5df to your computer and use it in GitHub Desktop.
看到FB朋友po自製的 網頁版採地雷遊戲,真的太懷念了,玩玩幾次之後突發奇想寫寫AI
function getSize(){
var rows = 0;
while(true){
var nextRowGrid = document.getElementById("position-1-" + (rows+1));
if(nextRowGrid){
rows++
}else{
break;
}
}
var cols = 0;
while(true){
var nextColGrid = document.getElementById("position-" + (cols+1) + "-1");
if(nextColGrid){
cols++
}else{
break;
}
}
return [rows,cols];
}
function getGrid(grids,row,col){
if( 1 <= row && row <= rows &&
1 <= col && col <= cols ){
return grids[(row-1) * rows + (col-1)];
}else{
return null;
}
}
function getPosition(posString){
// str format: position-<row>-<col>
var cutStrs = posString.split("-");
var row = parseInt( cutStrs[1] );
var col = parseInt( cutStrs[2] );
return {row:row,col:col};
}
function hasClass(elem,className){
classNames = elem.className.split(" ");
if(classNames.indexOf(className) != -1){
return true;
}else{
return false;
}
}
function isPosInArray(pos,posArray){
for(var i = 0 ; i<posArray.length;i++){
if(posArray[i].r == pos.r &&
posArray[i].c == pos.c){
return true;
}
}
return false
}
function getRandom(min,max){
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function initiDate(){
var grids = document.querySelectorAll(".grid-unit");
[rows,cols] = getSize();
}
function randomClickGrid(rows,cols){
var changeModeBtn = document.getElementById("change-mode")
var enabledGrids = document.querySelectorAll(".enabled");
if(changeModeBtn.innerText != "Trigger Mode")changeModeBtn.click();
var grid = enabledGrids[getRandom(0,enabledGrids.length)];
grid.click();
}
function playGame(){
var grids = document.querySelectorAll(".grid-unit");
var sweptGrids = document.querySelectorAll(".swept");
// item format [ {row: , col:},{row: , col:}]
var thisTurnFindMines = [];
var thisTurnFindSecure = [];
for(let item=0;item<sweptGrids.length;item++){
var grid = sweptGrids[item];
//id == position / position-<row>-<col>
var pos = getPosition( grid["id"] );
// format : "grid-unit swept swept-num-<number>"
var mineNumberClass = grid.className.split(" ")[2]
// format : swept-num-<number>"
var mineNumber = parseInt(mineNumberClass.split("-")[2])
var flaggedCounter = 0;
var enableCounter = 0;
var enablePos = [];
for(var r = pos["row"]-1 ; r <= pos["row"]+ 1 ; r++){
for(var c = pos["col"]-1 ; c <= pos["col"]+ 1 ; c++){
if(r == pos["row"] && c == pos["col"])continue;
targetGrid = getGrid(grids,r,c);
if(targetGrid != null){
if(hasClass(targetGrid,"flagged")){
flaggedCounter ++;
}
if(hasClass(targetGrid,"enabled")){
enableCounter++;
enablePos.push({r,c});
}
}
}
}
if(mineNumber - flaggedCounter == enableCounter){
for(let i =0;i<enablePos.length;i++){
if(!isPosInArray(enablePos[i],thisTurnFindMines)){
thisTurnFindMines.push(enablePos[i]);
}
}
}else if(mineNumber - flaggedCounter == 0){
for(let i =0;i<enablePos.length;i++){
if(!isPosInArray(enablePos[i],thisTurnFindSecure)){
thisTurnFindSecure.push(enablePos[i]);
}
}
}
}
var changeModeBtn = document.getElementById("change-mode")
if(sweptGrids.length == 0){
randomClickGrid(rows,cols);
}else{
if(changeModeBtn.innerText != "Flag Mode")changeModeBtn.click();
for(var i=0;i<thisTurnFindMines.length;i++){
pos = thisTurnFindMines[i];
grid = getGrid(grids,pos["r"],pos["c"]);
grid.click();
}
if(changeModeBtn.innerText != "Trigger Mode")changeModeBtn.click();
for(var i=0;i<thisTurnFindSecure.length;i++){
pos = thisTurnFindSecure[i];
grid = getGrid(grids,pos["r"],pos["c"]);
grid.click();
}
}
return sweptGrids.length;
}
function isSuccess(){
var successDiv = document.getElementById("success-modal");
if(successDiv.style.display == "block"){
return true;
}else{
return false;
}
}
function work(){
if( isSuccess() ){
stop();
}
thisSweptGrids = playGame();
if(lastSweptGrids === thisSweptGrids){
cantFoundWorkCounter ++;
if(cantFoundWorkCounter >= 3){
randomClickGrid();
}
}else{
cantFoundWorkCounter = 0;
lastSweptGrids = thisSweptGrids;
}
}
function start(millis){
if(!millis)millis = 500;
AIIntervalID = setInterval(work,millis);
}
function stop(){
clearInterval(AIIntervalID);
}
var rows = null;
var cols = null;
var lastSweptGrids = null;
var cantFoundWorkCounter = 0;
var AIIntervalID = null;
initiDate();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment