762 for (var i = 0; i < 4; i++) |
762 for (var i = 0; i < 4; i++) |
763 for (var j = 0; j < 4; j++) |
763 for (var j = 0; j < 4; j++) |
764 brd[i][j] = this.brd[4*i + j]; |
764 brd[i][j] = this.brd[4*i + j]; |
765 return brd; |
765 return brd; |
766 } |
766 } |
|
767 BoardObj.prototype.equals = function(brd) { |
|
768 var self = this.brd; |
|
769 return self.aa == brd.aa && self.ad == brd.ad && self.da == brd.da && self.dd == brd.dd |
|
770 && self.ab == brd.ab && self.ac == brd.ac |
|
771 && self.ba == brd.ba && self.ca == brd.ca |
|
772 && self.bd == brd.bd && self.cd == brd.cd |
|
773 && self.db == brd.db && self.dc == brd.dc |
|
774 && self.bb == brd.bb && self.bc == brd.bc && self.cb == brd.cb && self.cc == brd.cc; |
|
775 }; |
|
776 BoardObj.prototype.copy = function(brd) { |
|
777 var self = this.brd; |
|
778 if ( ! brd) { |
|
779 var newBrd = new Object(BoardObj.prototype); |
|
780 newBrd.brd = { aa: self.aa, ab: self.ab, ac: self.ac, ad: self.ad, |
|
781 ba: self.ba, bb: self.bb, bc: self.bc, bd: self.bd, |
|
782 ca: self.ca, cb: self.cb, cc: self.cc, cd: self.cd, |
|
783 da: self.da, db: self.db, dc: self.dc, dd: self.dd }; |
|
784 return newBrd; |
|
785 } |
|
786 brd.aa = self.aa; brd.ab = self.ab; brd.ac = self.ac; brd.ad = self.ad; |
|
787 brd.ba = self.ba; brd.bb = self.bb; brd.bc = self.bc; brd.bd = self.bd; |
|
788 brd.ca = self.ca; brd.cb = self.cb; brd.cc = self.cc; brd.cd = self.cd; |
|
789 brd.da = self.da; brd.db = self.db; brd.dc = self.dc; brd.dd = self.dd; |
|
790 return brd; |
|
791 } |
|
792 BoardObj.prototype.free = function() { |
|
793 var cnt = 0; |
|
794 var brd = this.brd; |
|
795 if (brd.aa === 0) cnt++; if (brd.ab === 0) cnt++; if (brd.ac === 0) cnt++; if (brd.ad === 0) cnt++; |
|
796 if (brd.ba === 0) cnt++; if (brd.bb === 0) cnt++; if (brd.bc === 0) cnt++; if (brd.bd === 0) cnt++; |
|
797 if (brd.ca === 0) cnt++; if (brd.cb === 0) cnt++; if (brd.cc === 0) cnt++; if (brd.cd === 0) cnt++; |
|
798 if (brd.da === 0) cnt++; if (brd.db === 0) cnt++; if (brd.dc === 0) cnt++; if (brd.dd === 0) cnt++; |
|
799 return cnt; |
|
800 } |
|
801 BoardObj.prototype.score = function() { |
|
802 var score = 0; |
|
803 var brd = this.brd; |
|
804 var v = brd.aa; |
|
805 if (v > 1) score += (v-1)*(1 << v); |
|
806 var v = brd.ab; |
|
807 if (v > 1) score += (v-1)*(1 << v); |
|
808 var v = brd.ac; |
|
809 if (v > 1) score += (v-1)*(1 << v); |
|
810 var v = brd.ad; |
|
811 if (v > 1) score += (v-1)*(1 << v); |
|
812 var v = brd.ba; |
|
813 if (v > 1) score += (v-1)*(1 << v); |
|
814 var v = brd.bb; |
|
815 if (v > 1) score += (v-1)*(1 << v); |
|
816 var v = brd.bc; |
|
817 if (v > 1) score += (v-1)*(1 << v); |
|
818 var v = brd.bd; |
|
819 if (v > 1) score += (v-1)*(1 << v); |
|
820 var v = brd.ca; |
|
821 if (v > 1) score += (v-1)*(1 << v); |
|
822 var v = brd.cb; |
|
823 if (v > 1) score += (v-1)*(1 << v); |
|
824 var v = brd.cc; |
|
825 if (v > 1) score += (v-1)*(1 << v); |
|
826 var v = brd.cd; |
|
827 if (v > 1) score += (v-1)*(1 << v); |
|
828 var v = brd.da; |
|
829 if (v > 1) score += (v-1)*(1 << v); |
|
830 var v = brd.db; |
|
831 if (v > 1) score += (v-1)*(1 << v); |
|
832 var v = brd.dc; |
|
833 if (v > 1) score += (v-1)*(1 << v); |
|
834 var v = brd.dd; |
|
835 if (v > 1) score += (v-1)*(1 << v); |
|
836 return score; |
|
837 } |
|
838 BoardObj.prototype.max = function() { |
|
839 var brd = this.brd; |
|
840 var max = brd.aa; |
|
841 max = Math.max(max, brd.ab); |
|
842 max = Math.max(max, brd.ac); |
|
843 max = Math.max(max, brd.ad); |
|
844 max = Math.max(max, brd.ba); |
|
845 max = Math.max(max, brd.bb); |
|
846 max = Math.max(max, brd.bc); |
|
847 max = Math.max(max, brd.bd); |
|
848 max = Math.max(max, brd.ca); |
|
849 max = Math.max(max, brd.cb); |
|
850 max = Math.max(max, brd.cc); |
|
851 max = Math.max(max, brd.cd); |
|
852 max = Math.max(max, brd.da); |
|
853 max = Math.max(max, brd.db); |
|
854 max = Math.max(max, brd.dc); |
|
855 max = Math.max(max, brd.dd); |
|
856 return max; |
|
857 } |
|
858 BoardObj.prototype.find = function(val) { |
|
859 var xy = []; |
|
860 var brd = this.brd; |
|
861 if (brd.aa === val) xy.push([0,0]); if (brd.ab === val) xy.push([0,1]); if (brd.ac === val) xy.push([0,2]); if (brd.ad === val) xy.push([0,3]); |
|
862 if (brd.ba === val) xy.push([1,0]); if (brd.bb === val) xy.push([1,1]); if (brd.bc === val) xy.push([1,2]); if (brd.bd === val) xy.push([1,3]); |
|
863 if (brd.ca === val) xy.push([2,0]); if (brd.cb === val) xy.push([2,1]); if (brd.cc === val) xy.push([2,2]); if (brd.cd === val) xy.push([2,3]); |
|
864 if (brd.da === val) xy.push([3,0]); if (brd.db === val) xy.push([3,1]); if (brd.dc === val) xy.push([3,2]); if (brd.dd === val) xy.push([3,3]); |
|
865 return xy; |
|
866 } |
|
867 BoardObj.prototype.atEdge = function(val) { |
|
868 var brd = this.brd; |
|
869 return (brd.aa === val) || (brd.ab === val) || (brd.ac === val) || (brd.ad === val) |
|
870 || (brd.ba === val) || (brd.bd === val) |
|
871 || (brd.ca === val) || (brd.cd === val) |
|
872 || (brd.da === val) || (brd.db === val) || (brd.dc === val) || (brd.dd === val); |
|
873 } |
|
874 BoardObj.prototype.atCorner = function(val) { |
|
875 var brd = this.brd; |
|
876 return (brd.aa === val) || (brd.ad === val) || (brd.da === val) || (brd.dd === val); |
|
877 } |
|
878 |
|
879 BoardObj.prototype.canRight = function() { |
|
880 var brd = this.brd; |
|
881 var f0 = brd.aa, f1 = brd.ab, f2 = brd.ac, f3 = brd.ad; |
|
882 if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; |
|
883 if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; |
|
884 if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; |
|
885 var f0 = brd.ba, f1 = brd.bb, f2 = brd.bc, f3 = brd.bd; |
|
886 if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; |
|
887 if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; |
|
888 if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; |
|
889 var f0 = brd.ca, f1 = brd.cb, f2 = brd.cc, f3 = brd.cd; |
|
890 if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; |
|
891 if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; |
|
892 if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; |
|
893 var f0 = brd.da, f1 = brd.db, f2 = brd.dc, f3 = brd.dd; |
|
894 if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; |
|
895 if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; |
|
896 if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; |
|
897 return false; |
|
898 } |
|
899 BoardObj.prototype.canLeft = function() { |
|
900 var brd = this.brd; |
|
901 var f0 = brd.aa, f1 = brd.ab, f2 = brd.ac, f3 = brd.ad; |
|
902 if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; |
|
903 if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; |
|
904 if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; |
|
905 var f0 = brd.ba, f1 = brd.bb, f2 = brd.bc, f3 = brd.bd; |
|
906 if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; |
|
907 if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; |
|
908 if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; |
|
909 var f0 = brd.ca, f1 = brd.cb, f2 = brd.cc, f3 = brd.cd; |
|
910 if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; |
|
911 if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; |
|
912 if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; |
|
913 var f0 = brd.da, f1 = brd.db, f2 = brd.dc, f3 = brd.dd; |
|
914 if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; |
|
915 if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; |
|
916 if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; |
|
917 return false; |
|
918 } |
|
919 BoardObj.prototype.canUp = function() { |
|
920 var brd = this.brd; |
|
921 var f0 = brd.aa, f1 = brd.ba, f2 = brd.ca, f3 = brd.da; |
|
922 if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; |
|
923 if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; |
|
924 if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; |
|
925 var f0 = brd.ab, f1 = brd.bb, f2 = brd.cb, f3 = brd.db; |
|
926 if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; |
|
927 if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; |
|
928 if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; |
|
929 var f0 = brd.ac, f1 = brd.bc, f2 = brd.cc, f3 = brd.dc; |
|
930 if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; |
|
931 if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; |
|
932 if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; |
|
933 var f0 = brd.ad, f1 = brd.bd, f2 = brd.cd, f3 = brd.dd; |
|
934 if (f1 > 0 && (f1 === f0 || f0 === 0)) return true; |
|
935 if (f2 > 0 && (f2 === f1 || f1 === 0)) return true; |
|
936 if (f3 > 0 && (f3 === f2 || f2 === 0)) return true; |
|
937 return false; |
|
938 } |
|
939 BoardObj.prototype.canDown = function() { |
|
940 var brd = this.brd; |
|
941 var f0 = brd.aa, f1 = brd.ba, f2 = brd.ca, f3 = brd.da; |
|
942 if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; |
|
943 if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; |
|
944 if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; |
|
945 var f0 = brd.ab, f1 = brd.bb, f2 = brd.cb, f3 = brd.db; |
|
946 if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; |
|
947 if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; |
|
948 if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; |
|
949 var f0 = brd.ac, f1 = brd.bc, f2 = brd.cc, f3 = brd.dc; |
|
950 if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; |
|
951 if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; |
|
952 if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; |
|
953 var f0 = brd.ad, f1 = brd.bd, f2 = brd.cd, f3 = brd.dd; |
|
954 if (f2 > 0 && (f2 === f3 || f3 === 0)) return true; |
|
955 if (f1 > 0 && (f1 === f2 || f2 === 0)) return true; |
|
956 if (f0 > 0 && (f0 === f1 || f1 === 0)) return true; |
|
957 return false; |
|
958 } |
|
959 |