var w,h,g,my={};function freecellMain(){var version='0.64';w=670;h=450;my.suitRules=[{id:'any',name:'Any'},{id:'alt',name:'Alternating Red Black'},{id:'same',name:'Same'},];my.suitRule=my.suitRules[0] my.cardWd=73 my.cardHt=98 my.gap={x:80,y:19} my.freePt={x:8,y:48} my.fndPt={x:345,y:48} my.tabPt={x:15,y:160} my.tabMax=8 my.imgHome=(document.domain=='localhost')?'/mathsisfun/games/images/':'/games/images/' var s='';s+='' my.sndHome=(document.domain=='localhost')?'/mathsisfun/images/sounds/':'/images/sounds/' s+='';s+='';s+='';s+='
';s+='';s+='';s+='';s+='
';s+='
';s+='
' s+='
' s+='' s+='' my.snds=[];my.soundQ=true s+='   ' s+=soundBtnHTML() s+='   ' s+='' s+='
' s+='';s+=optPopHTML();s+='
';s+='
© 2019 MathsIsFun.com v'+version+'
';s+='
';s+='
';s+='
';document.write(s);var el=document.getElementById('canvas1');var ratio=3;el.width=w*ratio;el.height=h*ratio;el.style.width=w+"px";el.style.height=h+"px";g=el.getContext("2d");g.setTransform(ratio,0,0,ratio,0,0);my.drag={onQ:false} window.addEventListener('mousemove',function(ev){mouseMove(ev)}) window.addEventListener('touchmove',function(ev){console.log('touchmove') var touch=ev.targetTouches[0];ev.clientX=touch.clientX;ev.clientY=touch.clientY;ev.touchQ=true;mouseMove(ev)}) my.zIndex=20;my.autoFdnQ=true my.deck=new Deck();} function mouseMove(ev){if(!my.drag.onQ)return var div=my.drag.div var lt=parseFloat(div.style.left)+ev.clientX-my.drag.x div.style.left=lt+'px' my.drag.x=ev.clientX var tp=parseFloat(div.style.top)+ev.clientY-my.drag.y div.style.top=tp+'px' my.drag.y=ev.clientY for(var i=0;i'+h.pTo.id,h)} var h=my.hist.pop() console.log('hist',h.card.name,h.pFr.id+'->'+h.pTo.id,h) var card=h.card var pFr=h.pTo var pTo=h.pFr pFr.sub(card) pTo.add(card) for(var i=0;i=8)n=0} for(var i=0;imax){maxi=i max=v}}} console.log('pileDrop',max,maxi) if(max>0){var pFr=me.pile var pTo=my.piles[maxi] pFr.sub(me) pTo.add(me) my.hist.push({pFr:pFr,pTo:pTo,card:me,alsos:me.drag.alsos.slice()}) for(var i=0;i0){var card=pFr.cards[pFr.cards.length-1] var s=autoPiles(card) if(s.length>0){soundPlay('sndAuto',true) setTimeout(autoFdn,200);return}}} return ''} function autoPiles(card){for(var j=0;jr1.rt||r2.rtr1.bt||r2.bt0){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 suitRuleChg(){var id=document.querySelector('input[name="suitRule"]:checked').id var n=(id.match(/\d+$/)||[]).pop() my.suitRule=my.suitRules[n] console.log('suitRule',id,n,my.suitRule)} function radioHTML(prompt,id,lbls,func){var s='';s+='
';s+=prompt;s+='
';s+='
';for(var i=0;i';s+='';} s+='
';return s;} function optPopHTML(){var s='';s+='
';s+='
';s+=radioHTML('Suit Order:','suitRule',my.suitRules,'suitRuleChg');s+='
' s+='
';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=(w-340)/2+'px';} function optYes(){var pop=document.getElementById('optpop');pop.style.opacity=0;pop.style.zIndex=1;pop.style.left='-999px';gameNew()} function optNo(){var pop=document.getElementById('optpop');pop.style.opacity=0;pop.style.zIndex=1;pop.style.left='-999px';} function autoFdnToggle(){my.autoFdnQ=!my.autoFdnQ;toggleBtn("autoFdnBtn",my.autoFdnQ);autoFdn()} 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");}} function Deck(){var files=[{name:'Basic',filename:'card-deck-a.png',rect:{lt:0,tp:0,wd:73,ht:98,gapx:0,gapy:0}},{name:'Pierce',filename:'card-deck-r.svg',rect:{lt:0,tp:0,wd:79,ht:123,gapx:0,gapy:0}},{name:'Deck B',filename:'card-deck-b.png',rect:{lt:9,tp:8,wd:124,ht:171.3,gapx:8.2,gapy:15}},{name:'Deck C',filename:'card-deck-c.svg',rect:{lt:9,tp:8,wd:124,ht:171.3,gapx:8.2,gapy:15}},{name:'Deck D',filename:'card-deck-d.svg',rect:{lt:9,tp:8,wd:124,ht:171.3,gapx:8.2,gapy:15}},{name:'Deck E',filename:'card-deck-e.jpg',rect:{lt:9,tp:8,wd:124,ht:171.3,gapx:8.2,gapy:15}},] this.file=files[0];this.names=['A','2','3','4','5','6','7','8','9','10','J','Q','K'];this.suits=['Club','Spade','Heart','Diamond'];this.cards=[];this.backImg=new Image();this.backImg.setAttribute('crossOrigin','anonymous');var svg=document.getElementById('svg1');var xml=(new XMLSerializer).serializeToString(svg);this.backImg.src='data:image/svg+xml;charset=utf-8,'+xml;this.frontImg=new Image();this.frontImg.setAttribute('crossOrigin','anonymous');this.frontImg.onload=this.loadCards.bind(this);this.frontImg.src=my.imgHome+this.file.filename;} Deck.prototype.loadCards=function(){for(var i=0;i0;i-=1){var j=Math.floor(Math.random()*(i+1));var temp=this.cards[i];this.cards[i]=this.cards[j];this.cards[j]=temp;}} Deck.prototype.redraw=function(){for(var i=0;iemptyN)return[] var alsos=[] var cardCurr=card for(var i=this.cards.length-n+1;i0)return false return(this.cards.length==0) case 'fdn':if(card.drag.alsos.length>0)return false if(card.val==this.cards.length+1){if(this.cards.length==0){return true}else{return(card.suit==this.cards[0].suit)}} return false case 'tab':if(this.cards.length==0){return true}else{var topCard=this.cards[this.cards.length-1];return topCard.nextOKQ(card)} return false} return false} Pile.prototype.add=function(card){this.cards.push(card) card.pile=this} Pile.prototype.sub=function(card){for(var i=0;i