var my={};var player=0;var inPlay=false function mancalaMain(){var version='0.52';document.documentElement.style.setProperty('vw',`5px`);my.players=[{name:'Player 1',sttN:0,bankN:6},{name:'Player 2',sttN:7,bankN:13},] my.opts={playerN:1,beadN:4} my.pit={wd:12,ht:14,bankHt:37.5} my.pits=[];for(var i=0;i<6;i++){my.pits[i]=new Pit(73-i*11.5,4,my.pit.wd,my.pit.ht,false) my.pits[i+7]=new Pit(15.5+i*11.5,28,my.pit.wd,my.pit.ht,false)} my.pits[6]=new Pit(3,4,my.pit.wd,my.pit.bankHt,true) my.pits[13]=new Pit(85,4,my.pit.wd,my.pit.bankHt,true) console.log('pits',my.pits) my.playerNs=[{id:1,name:1},{id:2,name:2}];my.beadNs=[{id:2,name:2},{id:3,name:3},{id:4,name:4},{id:5,name:5},{id:6,name:6},{id:7,name:7}];my.computerTry=0;my.timers=[];my.timerCount=0 my.imgHome=(document.domain=='localhost')?'/mathsisfun/games/images/':'/games/images/' var s='';s+=`` s+=`` my.sndHome=(document.domain=='localhost')?'/mathsisfun/images/sounds/':'/images/sounds/' s+='';s+='';s+='';s+='';s+='';s+='';s+='';s+='
';s+='
' s+='' my.snds=[];my.soundQ=true s+='   ' s+=soundBtnHTML() s+='   ' s+='
' s+=optPopHTML() s+=`

' s+='
';s+=`
© 2019 MathsIsFun.com v${version}  
` s+='
';s+='
' document.write(s);my.zIndex=20;pitEventHandlers();gameNew()} function msg(s,clr){clr=typeof clr!=='undefined'?clr:'black' var div=document.getElementById('msg') div.innerHTML=s div.style.color=clr} function pitEventHandlers(){var makePitClickHandler=function(pitNo){return function(){pitSelected(pitNo,true);};};for(var pitNo=0;pitNo<13;pitNo++){if(pitNo!=6){document.getElementById(`pit${pitNo}`).addEventListener('click',makePitClickHandler(pitNo),false);}}} function gameNew(){var playerN=optGet('playerN') if(playerN==1){my.players[0].name='Human' my.players[1].name='Computer'}else{my.players[0].name='Player 1' my.players[1].name='Player 2'} console.log('playerN',playerN,my.players) document.getElementById("gamediv").style.display="inline";boardReset() scoresUpdate()} function scoresUpdate(){document.getElementById("player1-score_text").innerHTML=my.player1score document.getElementById("player2-score_text").innerHTML=my.player2score} function beadsDraw(pit){var count=pit.n pit.beads=[] for(var i=0;ivalBest){valBest=val locnBest={x:x,y:y}}} return locnBest} function dist(dx,dy){return Math.sqrt(dx*dx+dy*dy)} function beadMove(fromPitN,toPitN){my.timerCount--;var fromPit=my.pits[fromPitN] if(fromPit.beads.count==0)return var toPit=my.pits[toPitN] var locn=pitLocnBest(toPit) var bead=fromPit.beads[0] fromPit.beads.shift() toPit.beads.push(bead) bead.x=toPit.x+locn.x bead.y=toPit.y+locn.y var xdiff=toPit.x+locn.x-bead.stt.x var ydiff=toPit.y+locn.y-bead.stt.y var div=document.getElementById('gamediv') console.log('pctToPx',div.clientWidth) var pctToPx=div.clientWidth/100 bead.img.style.transform='translate('+xdiff*pctToPx+'px,'+ydiff*pctToPx+'px)';bead.img.style.zIndex=my.zIndex++ my.pits[fromPitN].n--;my.pits[toPitN].n++;window.setTimeout('countShow('+fromPitN+', '+my.pits[fromPitN].n+')',1000);window.setTimeout('countShow('+toPitN+', '+my.pits[toPitN].n+')',1000);} function isGameEnd(){var winner=-1;for(var p=0;p<2;p++){var p2=1-p var isEmpty=true;for(var cnt=my.players[p].sttN;cnt0){while(my.pits[cnt].n>0){beadMove(cnt,my.players[p2].bankN);} countShow(cnt,0);}} if(my.pits[my.players[0].bankN].n>my.pits[my.players[1].bankN].n){winner=0;}else if(my.pits[my.players[0].bankN].n6&&nummy.players[0].bankN&&playerPit0)&&(my.pits[playerPit].n==1)){return true;}} return false;} function stealStones(end){var otherside=12-end;for(var x=0;xmy.players[0].bankN&&end=my.players[0].bankN)||(player==1&&(num<=my.players[0].bankN||num==my.players[1].bankN))){msg('Not one of your pits') setHighlight();inPlay=false;}else{msg('') for(var i=0;i<6;i++){document.getElementById(`pit${i}`).style.opacity=0} for(var i=7;i<13;i++){document.getElementById(`pit${i}`).style.opacity=0} for(stones;stones>0;stones--){if((player==0)&&(start==my.players[1].bankN)){start=0;}else if((player==1)&&(start==my.players[0].bankN)){start=7;} var object=window.setTimeout('beadMove('+pitMoveFrom+', '+start+')',my.timerCount*400);my.timers[my.timerCount++]=object;if(stones===1){window.setTimeout('checkStealState('+start+')',origStones*500);} start++;if(start==14){start=0;}}}} function optGet(name){var val=localStorage.getItem(`mancala.${name}`) if(val==null)val=my.opts[name] return val} function optSet(name,val){localStorage.setItem(`mancala.${name}`,val) my.opts[name]=val} function changeTurns(){var winner=isGameEnd();if(winner==0||winner==1){console.log('changeTurns',winner,optGet('playerN')) if(optGet('playerN')==1&&winner==1){soundPlay('sndLose',true)}else{soundPlay('sndWin',true)} msg(`${my.players[winner].name} Wins!`) inPlay=false;return;}else if(winner==2){soundPlay('sndTie',true) msg(`It's a tie!`) inPlay=false;return;}else{if(my.keepThisPlayer){msg('Bonus turn') soundPlay('sndBonus',true) setHighlight();inPlay=false;}else{if(player==1){player=0;msg(`${my.players[player].name}'s turn`)}else{player=1;msg(`${my.players[player].name}'s turn`)} inPlay=false;setHighlight();} if((player==1)&&(optGet("playerN")==1)){var computerChoice=Math.floor(Math.random()*5+7);my.computerTry=7;setTimeout('pitSelected('+computerChoice+', false)',500);}}} function boardReset(){var div=document.getElementById("gamediv");for(var i=0;i0){var div=document.getElementById(name) if(div.currentTime>0&&div.currentTime0)soundPlayQueue();};} function soundToggle(){var btn='sound' if(my.soundQ){my.soundQ=false document.getElementById(btn).classList.add("mute")}else{my.soundQ=true document.getElementById(btn).classList.remove("mute")}} function radioHTML(prompt,id,lbls,checkId,func){var s='';s+='
';s+='
';s+=prompt;s+='
';s+='
';for(var i=0;i';s+='';} s+='
';s+='
';return s;} function optPopHTML(){var s='';s+=`
` s+=radioHTML('Players:','playerN',my.playerNs,optGet('playerN'),'');s+=radioHTML('Beads per pit:','beadN',my.beadNs,optGet('beadN'),'');s+='
';s+='';s+=' ' s+='';s+='
';s+='
';return s;} function optPop(){var pop=document.getElementById('optpop');pop.style.transitionDuration="0.3s";pop.style.opacity=1;pop.style.zIndex=my.zIndex+1 pop.style.left='25vw';} function optYes(){var pop=document.getElementById('optpop');pop.style.opacity=0;pop.style.zIndex=1;pop.style.left='-200vw';var playerN=document.querySelector('input[name="playerN"]:checked').value var beadN=document.querySelector('input[name="beadN"]:checked').value console.log('optYes',playerN,beadN) optSet('playerN',playerN) optSet('beadN',beadN) gameNew()} function optNo(){var pop=document.getElementById('optpop');pop.style.opacity=0;pop.style.zIndex=1;pop.style.left='-200vw';} function toggleBtn(btn,onq){if(onq){document.getElementById(btn).classList.add("hi");document.getElementById(btn).classList.remove("lo");}else{document.getElementById(btn).classList.add("lo");document.getElementById(btn).classList.remove("hi");}} class Pit{constructor(x,y,wd,ht,bankQ){this.x=x this.y=y this.bankQ=bankQ this.wd=wd this.ht=ht this.n=0 this.beads=[] this.div=null}}